中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用python?OpenCV實現圖像特征匹配

發布時間:2023-04-25 11:43:27 來源:億速云 閱讀:113 作者:zzz 欄目:開發技術

這篇文章主要講解了“怎么使用python OpenCV實現圖像特征匹配”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“怎么使用python OpenCV實現圖像特征匹配”吧!

Brute-Force匹配器的基礎

暴力匹配器很簡單。它使用第一組中一個特征的描述符,并使用一些距離計算將其與第二組中的所有其他特征匹配。并返回最接近的一個。 對于BF匹配器,首先必須使cv.BFMatcher() 創建BFMatcher對象。 它需要兩個可選參數:

  • 第一個參數是normType,它指定要使用的距離測量。默認情況下為 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的示例(兩者都使用不同的距離測量)。

使用ORB描述符進行Brute-Force匹配

下面將看到一個有關如何在兩個圖像之間匹配特征的簡單示例。在這種情況下,有一 個queryImage和trainImage。將嘗試使用特征匹配在trainImage中找到queryImage。(圖像 是/samples/data/box.png和/samples/data/box_in_scene.png) 

使用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()

什么是Matcher對象?

matchs = bf.match(des1,des2) 的結果DMatch對象的列表。該DMatch對象具有以下屬性:

  • DMatch.distance-描述符之間的距離,越低越好

  • DMatch.trainIdx-train描述符中的描述符索引

  • DMatch.queryIdx-query描述符中的描述符索引

  • DMatch.imgIdx-train 圖像的索引。

帶有SIFT描述符和比例測試的Brute-Force匹配

這次,將使用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

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實現圖像特征匹配這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

西充县| 榆中县| 当阳市| 五寨县| 个旧市| 惠水县| 临西县| 新津县| 兴海县| 阳谷县| 龙里县| 顺昌县| 瑞安市| 岳阳市| 彭水| 乃东县| 清水河县| 康乐县| 泊头市| 盱眙县| 兴山县| 济源市| 泰来县| 通化市| 儋州市| 松江区| 定襄县| 邛崃市| 克东县| 德庆县| 江西省| 通榆县| 满洲里市| 时尚| 建水县| 海宁市| 尖扎县| 横峰县| 特克斯县| 禹州市| 内乡县|