<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在本章中,將學習:
暴力匹配器很簡單。它使用第一組中一個特徵的描述符,並使用一些距離計算將其與第二組中的所有其他特徵匹配。並返回最接近的一個。 對於BF匹配器,首先必須使cv.BFMatcher() 建立BFMatcher物件。 它需要兩個可選引數:
cv2.NORM_L2
。對於SIFT, SURF等(也有 cv2.NORM_L1
)很有用。 對於基於二進位制字串的描述符,例如ORB,BRIEF,BRISK等,應使用cv2.NORM_HAMMING
,該函數使用漢明距離作為度量。如果ORB使用WTA_K == 3或 4
,則應使用 cv.NORM_HAMMING2。crossCheck
,預設情況下為false。如果為true,則Matcher僅返回具有值(i,j)(i,j)(i,j)的那些匹配項,以使集合A中的第i個描述符具有集合B中的第j個描述符為最佳匹配,反之亦然。即兩組中的兩個特徵應彼此匹配。它提供了一致的結果,並且是D.Lowe在SIFT論文中提出的比率測試的良好替代方案。 建立之後,兩個重要的方法是BFMatcher.match()
: 返回最佳匹配BFMatcher.knnMatch()
: 返回k個最佳匹配,其中k由使用者指定。 當需要對此做其他工作時,它可能會很有用。 就像使用cv.drawKeypoints()繪製關鍵點一樣,cv.drawMatches()
可以幫助繪製出匹配項。它水平堆疊兩張影象,並繪製從第一張影象到第二張影象的線,以顯示最佳匹配。還有cv.drawMatchesKnn繪製所有k個最佳匹配。如果 k=2 ,它將為每個關鍵點繪製兩條匹配線。 因此,如果要選擇性地繪製,則必須通過掩碼。 下面來看一個SIFT和ORB的範例(兩者都使用不同的距離測量)。
下面將看到一個有關如何在兩個影象之間匹配特徵的簡單範例。在這種情況下,有一 個queryImage和trainImage。將嘗試使用特徵匹配在trainImage中找到queryImage。(影象 是/samples/data/box.png和/samples/data/box_in_scene.png) 影象素材可以去github上找github.com/opencv/open…
使用ORB描述符來匹配特徵。因此,從載入影象,查詢描述符等開始。之後建立一個距離測量值為cv2.NORM_HAMMING的BFMatcher物件(因為使用的是ORB),並且啟用了CrossCheck以獲得更好的結果。然後,使用Matcher.match()
方法來獲取兩個影象中的最佳匹配。按照距離的升序對它們進行排序,以使最佳匹配(低距離) 排在前面。然後我們只抽出前10的匹配(只是為了提高可見度。您可以根據需要增加它)
# create bfmatcher object bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) # match descriptors matches = bf.match(des1, des2) # sort them in the order of their distance matches = sorted(matches, key=lambda x: x.distance) # draw first 10 matches img3 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:10], None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS) plt.imshow(img3) plt.show()
結果如下:
matchs = bf.match(des1,des2)
的結果DMatch
物件的列表。該DMatch
物件具有以下屬性:
DMatch.distance
-描述符之間的距離,越低越好DMatch.trainIdx
-train描述符中的描述符索引DMatch.queryIdx
-query描述符中的描述符索引DMatch.imgIdx
-train 影象的索引。這次,將使用BFMatcher.knnMatch()
獲得k個最佳匹配。在此範例中,將k = 2
,以便可以應用D.Lowe在他的論文中闡述的比例測試。
import cv2 import numpy as np from matplotlib import pyplot as plt img1 = cv2.imread('box2.png', cv2.IMREAD_GRAYSCALE) img2 = cv2.imread('box_in_scene.png', cv2.IMREAD_GRAYSCALE) # initate sift detector sift = cv2.xfeatures2d.SIFT_create() # find teh keypoints and descriptors with sift kp1, des1 = sift.detectAndCompute(img1, None) kp2, des2 = sift.detectAndCompute(img2, None) # BFMatcher with default params bf = cv2.BFMatcher() matches = bf.knnMatch(des1, des2, k=2) # apply ratio test good = [] for m, n in matches: if m.distance < 0.75 * n.distance: good.append([m]) # cv.drawMatchsKnn expects list of lists as matches. img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good, None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS) plt.imshow(img3) plt.show()
檢視以下結果:
FLANN是近似最近鄰的快速庫。它包含一組演演算法,這些演演算法針對大型資料集中的快速最近鄰搜尋和高維特徵進行了優化。 對於大型資料集,它的執行速度比BFMatcher快。我們將看到第二個基於FLANN的匹配器範例。 對於基於FLANN的匹配器,需要傳遞兩個字典,這些字典指定要使用的演演算法,其相關引數等。
IndexParams
。對於各種演演算法,要傳遞的資訊在FLANN檔案中進行了說明。概括來說,對於SIFT,SURF等演演算法,可以通過以下操作:FLANN_INDEX_KDTREE = 1 index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
當使用ORB時,可以參考下面。根據檔案建議使用帶註釋的值,但在某些情況下未提供必需的引數。其他值也可以正常工作。
FLANN_INDEX_LSH = 6 index_params = dict( algorithm=FLANN_INDEX_LSH, table_number=6, key_size=12, multi_probe_level=1)
第二個字典是SearchParams
,它指定索引中的樹應遞迴遍歷的次數。 較高的值可提供更好的精度,但也需要更多時間。如果要更改值,請傳遞 search_params = dict(checks = 100)
有了這些資訊,就很容易。
import cv2 import numpy as np from matplotlib import pyplot as plt img1 = cv2.imread('box2.png', cv2.IMREAD_GRAYSCALE) img2 = cv2.imread('box_in_scene.png', cv2.IMREAD_GRAYSCALE) # initiate sift detector sift = cv2.xfeatures2d.SIFT_create() # find the keypoints and descriptors with sift kp1, des1 = sift.detectAndCompute(img1, None) kp2, des2 = sift.detectAndCompute(img2, None) # FLANN params FLANN_INDEX_KDTREE = 1 index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5) search_params = dict(checks=50) flann = cv2.FlannBasedMatcher(index_params, search_params) matches = flann.knnMatch(des1, des2, k=2) # need to draw only good matches, so create a mask matchesMask = [[0,0] for i in range(len(matches))] # ratio test as per low's papre for i, (m, n) in enumerate(matches): if m.distance < 0.7*n.distance: matchesMask[i] = [1, 0] # draw darw_params = dict( matchColor=(0, 255, 0), singlePointColor=(255, 0, 0), matchesMask=matchesMask, flags=cv2.DrawMatchesFlags_DEFAULT) img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, matches, None, **darw_params) plt.imshow(img3) plt.show()
檢視以下結果
附加資源
以上就是python OpenCV實現影象特徵匹配範例詳解的詳細內容,更多關於python OpenCV影象特徵匹配的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45