OpenCV中的特征匹配(Feature Matching)
生活随笔
收集整理的這篇文章主要介紹了
OpenCV中的特征匹配(Feature Matching)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
OpenCV中的特征匹配(Feature Matching)
- 1. 效果圖
- 2. 原理
- 3. 源碼
- 3.1 SIFT關鍵點檢測+Knn近鄰匹配
- 3.2 ORB關鍵點檢測+蠻力特征匹配
- 3.3 SIFT關鍵點檢測+Knn近鄰及蠻力特征匹配
- 參考
這篇博客將介紹如何使用OpenCV將一個圖像中的特征與其他圖像中的特征進行匹配。通過SIFT等關鍵點檢測、蠻力匹配器和 FLANN KNN匹配來實現。
- Brute-Force matcher 蠻力匹配器
- FLANN Fast Approximate Nearest Neighbor Search Library 快速最近鄰逼近搜索函數庫
- KNN K Nearest Neighbors K近鄰
1. 效果圖
要進行匹配的倆張原始圖如下:
SIFT關鍵點檢測+Knn近鄰及蠻力匹配效果圖如下:
ORB關鍵點檢測及蠻力匹配效果圖如下:
SIFT關鍵點檢測+Knn近鄰匹配效果圖如下:
2. 原理
蠻力匹配器很簡單。它采用第一個集合中一個特征的描述符,并通過一些距離計算與第二個集合中的所有其他特征匹配。返回最近的一個或者k個匹配符。
- cv2.BFMatcher() 創建BFMatcher對象;
參數一:normType,指定要使用的距離測量,默認cv2.NORM_L2,適用于SURF、SIFT;對于基于二進制字符串的描述符,如ORB、BRIENT、BRISK等,應使用cv2.NORM_HAMMING,它使用HAMMING距離作為度量。如果ORB使用WTA_K==3或4,則應使用cv2.NORM_HAMMING2。
參數二:交叉檢查bool變量,默認false。如果為true,Matcher只返回那些具有值(i,j)的匹配,這樣集合A中的第i個描述符將集合B中的第j個描述符作為最佳匹配。
- BFMatcher.match() 返回最佳匹配;
- BFMatcher.knnMatch() 返回k個最佳匹配,其中k由用戶指定。
- cv2.drawKeypoints() 繪制關鍵點;
- cv2.drawMatches() 繪制匹配項。它水平堆疊兩個圖像,并從第一個圖像到第二個圖像繪制線條,顯示最佳匹配。
- cv2.drawMatchesKnn() 它繪制所有k個最佳匹配。如果k=2,它將為每個關鍵點繪制兩條匹配線。
3. 源碼
3.1 SIFT關鍵點檢測+Knn近鄰匹配
# 基于SIFT描述符和比率檢驗的蠻力匹配
import cv2
from matplotlib import pyplot as pltimg1 = cv2.imread('images/box.png') # 查詢圖像
img2 = cv2.imread('images/box_in_scene.png') # 訓練圖像
plt.subplot(121)
plt.imshow(cv2.cvtColor(img1,cv2.COLOR_BGR2RGB)) # 通過for循環逐個顯示圖像
plt.xticks([]) # 去掉x軸的刻度
plt.yticks([]) # 去掉y軸的刻度
plt.title("origin box")
plt.subplot(122)
plt.imshow(cv2.cvtColor(img2,cv2.COLOR_BGR2RGB)) # 通過for循環逐個顯示圖像
plt.xticks([]) # 去掉x軸的刻度
plt.yticks([]) # 去掉y軸的刻度
plt.title("origin box_in_scene")
plt.show()img1 = cv2.imread('images/box.png', 0) # 查詢圖像
img2 = cv2.imread('images/box_in_scene.png', 0) # 訓練圖像# 初始化SIFT檢測器
sift = cv2.xfeatures2d.SIFT_create()# 使用SIFT尋找關鍵點和描述符
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)# 使用默認參數初始化BFMatcher
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)# 應用比率測試
good = []
for m, n in matches:if m.distance < 0.75 * n.distance:good.append([m])# cv2.drawMatchesKnn:繪制Knn匹配結果
img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good, img1, flags=2)plt.imshow(img3)
plt.xticks([])
plt.yticks([])
plt.title("sift res")
plt.show()
3.2 ORB關鍵點檢測+蠻力特征匹配
# ORB關鍵點檢測+蠻力特征匹配
import cv2
from matplotlib import pyplot as pltimg1 = cv2.imread('images/box.png', 0) # 查找圖像
img2 = cv2.imread('images/box_in_scene.png', 0) # 訓練圖像# 初始化ORB檢測器
orb = cv2.ORB_create()# 尋找關鍵點和描述符
kp1, des1 = orb.detectAndCompute(img1, None)
kp2, des2 = orb.detectAndCompute(img2, None)# 使用距離測量cv2.NORM_HAMMING創建一個BFMatcher對象(因為我們使用的是ORB),并打開交叉檢查以獲得更好的結果。
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)# 使用Matcher.match()方法在兩幅圖像中獲得最佳匹配。
# 返回結果matches是一個DMatch對象列表。此DMatch對象具有以下屬性:
# DMatch.distance—描述符之間的距離。越低越好。
# DMatch.trainIdx—訓練描述符中描述符的索引
# DMatch.queryIdx-查詢描述符中描述符的索引
# DMatch.imgIdx—訓練圖像的索引。
matches = bf.match(des1, des2)# 按照距離的升序排序,以便最好的匹配項(距離較短的)出現在前面
matches = sorted(matches, key=lambda x: x.distance)# 只抽取前10場匹配繪制(只是為了更便于可視化)。
img3 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:10], img1, flags=2)plt.imshow(img3)
plt.xticks([])
plt.yticks([])
plt.title("orb res")
plt.show()
3.3 SIFT關鍵點檢測+Knn近鄰及蠻力特征匹配
# ORB關鍵點檢測+蠻力特征匹配
import cv2
from matplotlib import pyplot as pltimg1 = cv2.imread('images/box.png', 0) # 查找圖像
img2 = cv2.imread('images/box_in_scene.png', 0) # 訓練圖像# 初始化ORB檢測器
orb = cv2.ORB_create()# 尋找關鍵點和描述符
kp1, des1 = orb.detectAndCompute(img1, None)
kp2, des2 = orb.detectAndCompute(img2, None)# 使用距離測量cv2.NORM_HAMMING創建一個BFMatcher對象(因為我們使用的是ORB),并打開交叉檢查以獲得更好的結果。
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)# 使用Matcher.match()方法在兩幅圖像中獲得最佳匹配。
# 返回結果matches是一個DMatch對象列表。此DMatch對象具有以下屬性:
# DMatch.distance—描述符之間的距離。越低越好。
# DMatch.trainIdx—訓練描述符中描述符的索引
# DMatch.queryIdx-查詢描述符中描述符的索引
# DMatch.imgIdx—訓練圖像的索引。
matches = bf.match(des1, des2)# 按照距離的升序排序,以便最好的匹配項(距離較短的)出現在前面
matches = sorted(matches, key=lambda x: x.distance)# 只抽取前10場匹配繪制(只是為了更便于可視化)。
img3 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:10], img1, flags=2)plt.imshow(img3)
plt.xticks([])
plt.yticks([])
plt.title("orb res")
plt.show()
參考
- https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_feature2d/py_matcher/py_matcher.html#matcher
總結
以上是生活随笔為你收集整理的OpenCV中的特征匹配(Feature Matching)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SIFT和SURF的替换算法——ORB
- 下一篇: OpenCV中的立体图像创建深度图