日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

OpenCV中的特征匹配(Feature Matching)

發布時間:2023/11/27 生活经验 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。