最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python OpenCV特征檢測之特征匹配方式詳解

 更新時(shí)間:2021年12月31日 15:21:21   作者:機(jī)器視覺小學(xué)徒  
OpenCV中提供了兩種技術(shù)用于特征匹配,分別為Brute-Force匹配器和基于FLANN的匹配器。本文將為大家詳細(xì)介紹一下這兩種匹配方式,需要的可以參考一下

前言 

獲得圖像的關(guān)鍵點(diǎn)后,可通過計(jì)算得到關(guān)鍵點(diǎn)的描述符。關(guān)鍵點(diǎn)描述符可用于圖像的特征匹配。通常,在計(jì)算圖A是否包含圖B的特征區(qū)域時(shí),將圖A稱做訓(xùn)練圖像,將圖B稱為查詢圖像。圖A的關(guān)鍵點(diǎn)描述符稱為訓(xùn)練描述符,圖B的關(guān)鍵點(diǎn)描述符稱為查詢描述符。

一、暴力匹配器

暴力匹配器使用描述符進(jìn)行特征比較。在比較時(shí),暴力匹配器首先在查詢描述符中取一個(gè)關(guān)鍵點(diǎn)的描述符,將其與訓(xùn)練描述符中的所有關(guān)鍵點(diǎn)描述符進(jìn)行比較,每次比較后會給出一個(gè)距離值,距離最小的值對應(yīng)最佳匹配結(jié)果。所有描述符比較完后,匹配器返回匹配結(jié)果列表。

OpenCV的cv2.BFMatcher_create()函數(shù)用于創(chuàng)建暴力匹配器,其基本格式如下:

bf = cv2.BFMatcher_create([normType[, crossCheck]])

bf為返回的暴力匹配器對象

normType為距離測量類型, 默認(rèn)為cv2.NORM_L2, 通常, SIFT描述符使用cv2.NORM_L1或cv2.NORM_L2, ORB描述符使用cv2.NORM_HAMMING

crossCheck默認(rèn)為False, 匹配器為每個(gè)查詢描述符找到k個(gè)距離最近的匹配描述符, 為True時(shí), 只返回滿足交叉驗(yàn)證條件的匹配結(jié)果

暴力匹配器對象的match()方法返回每個(gè)關(guān)鍵點(diǎn)的最佳匹配結(jié)果,其基本格式如下:

ms = bf.match(des1, des2)

ms為返回的結(jié)果, 它是一個(gè)DMatch對象列表, 每個(gè)DMatch對象表示關(guān)鍵點(diǎn)的一個(gè)匹配結(jié)果, 其dintance屬性表示距離, 距離值越小匹配度越高

des1為查詢描述符

des2為訓(xùn)練描述符

獲得匹配結(jié)果后,可調(diào)用cv2.drawMatches()函數(shù)或cv2.drawMatchesKnn()函數(shù)繪制匹配結(jié)果圖像,其基本格式如下:

outImg = cv2.drawMatches(img1, keypoints1, img2, keypoints2, matches1to2[, matchColor[, singlePointColor[, matchesMask[, flags]]]])

outImg為返回的繪制結(jié)果圖像, 圖像中查詢圖像與訓(xùn)練圖像中匹配的關(guān)鍵點(diǎn)個(gè)兩點(diǎn)之間的連線為彩色

img1為查詢圖像

keypoints1為img1的關(guān)鍵點(diǎn)

img2為訓(xùn)練圖像

keypoints2為img2的關(guān)鍵點(diǎn)

matches1to2為img1與img2的匹配結(jié)果

matchColor為關(guān)鍵點(diǎn)和鏈接線的顏色, 默認(rèn)使用隨機(jī)顏色

singlePointColor為單個(gè)關(guān)鍵點(diǎn)的顏色, 默認(rèn)使用隨機(jī)顏色

matchesMask為掩膜, 用于決定繪制哪些匹配結(jié)果, 默認(rèn)為空, 表示繪制所有匹配結(jié)果

flags為標(biāo)志, 可設(shè)置為下列參數(shù)值:

cv2.DrawMatchesFlags_DEFAUL:默認(rèn)方式, 繪制兩個(gè)源圖像、匹配項(xiàng)和單個(gè)關(guān)鍵點(diǎn), 沒有圍繞關(guān)鍵點(diǎn)的圓以及關(guān)鍵點(diǎn)的大小和方向

cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS:不會繪制單個(gè)關(guān)鍵點(diǎn)

cv2.DrawMatchesFlags_DRAW_RICH_KEYPOINTS:在關(guān)鍵點(diǎn)周圍繪制具有關(guān)鍵點(diǎn)大小和方向的圓圈

# 暴力匹配器、ORB描述符和match()方法
import cv2

img1 = cv2.imread("xhu1.jpg", cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread("xhu2.jpg", cv2.IMREAD_GRAYSCALE)

orb = cv2.ORB_create()
kp1, des1 = orb.detectAndCompute(img1, None)
kp2, des2 = orb.detectAndCompute(img2, None)

bf = cv2.BFMatcher_create(cv2.NORM_HAMMING, crossCheck = False)
ms = bf.match(des1, des2)
ms = sorted(ms, key = lambda x:x.distance)
img3 = cv2.drawMatches(img1, kp1, img2, kp2, ms[:20], None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)

cv2.imshow("Xhu1", img1)
cv2.imshow("Xhu2", img2)
cv2.imshow("Matches", img3)

cv2.waitKey(0)
cv2.destroyAllWindows()

# 暴力匹配器、SIFT描述符和match()方法
import cv2

img1 = cv2.imread("xhu1.jpg", cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread("xhu2.jpg", cv2.IMREAD_GRAYSCALE)

sift=cv2.SIFT_create()
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)

bf = cv2.BFMatcher_create(cv2.NORM_L1, crossCheck = False)
ms = bf.match(des1, des2)
ms = sorted(ms, key = lambda x:x.distance)
img3 = cv2.drawMatches(img1, kp1, img2, kp2, ms[:20], None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)

# ms = np.expand_dims(ms,1)
# img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, ms[:20], None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)

cv2.imshow("Xhu1", img1)
cv2.imshow("Xhu2", img2)
cv2.imshow("Matches", img3)

cv2.waitKey(0)
cv2.destroyAllWindows()

暴力匹配器對象的knnMatch()方法可返回指定數(shù)量的最佳匹配結(jié)果,其基本格式如下:

ms = knnMatch(des1, des2, k=n)

ms為返回的匹配結(jié)果, 每個(gè)列表元素是一個(gè)子列表, 它包含了由參數(shù)k指定個(gè)數(shù)的DMatch對象

des1為查詢描述符

des2為訓(xùn)練描述符

k為返回的最佳匹配個(gè)數(shù)

# 暴力匹配器、ORB描述符和knnMatch()方法
import cv2

img1 = cv2.imread("xhu1.jpg", cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread("xhu2.jpg", cv2.IMREAD_GRAYSCALE)

orb = cv2.ORB_create()
kp1, des1 = orb.detectAndCompute(img1, None)
kp2, des2 = orb.detectAndCompute(img2, None)

bf = cv2.BFMatcher_create(cv2.NORM_HAMMING, crossCheck = False)
ms = bf.knnMatch(des1, des2, k=2)

# 應(yīng)用比例測試選擇要使用的匹配結(jié)果
good = []
for m, n in ms:
    if m.distance < 0.75 * n.distance:
		good.append(m)

img3 = cv2.drawMatches(img1, kp1, img2, kp2, good[:20], None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
# good = np.expand_dims(good,1)
#img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good[:20], None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)

cv2.imshow("Xhu1", img1)
cv2.imshow("Xhu2", img2)
cv2.imshow("Matches", img3)


cv2.waitKey(0)
cv2.destroyAllWindows()

二、FLANN匹配器

FLANN(Fast Library for Approximate Nearest Neignbors)為近似最近鄰的快速庫,F(xiàn)LANN特征匹配算法比其它的最近鄰算法更快。

在創(chuàng)建FLANN匹配器時(shí),需要傳遞兩參數(shù):index_params和search_params。

index_params用來指定索引樹的算法類型和數(shù)量。SIFT算法可以使用下面的代碼來設(shè)置。

FLANN_INDEX_KDTREE = 1
index_params = dict(algorithm = FLANN_INDEX_KDTREE,
                    trees= 5)

ORB算法可以使用下面的代碼來設(shè)置。

FLANN_INDEX_LSH = 6
index_params = dict(algorithm = FLANN_INDEX_LSH,
                    table_number = 6,
                    key_size = 12,
                    multi_probe_level = 1)

search_params用于指定索引樹的遍歷次數(shù),遍歷次數(shù)越多,匹配結(jié)果越精細(xì),通常設(shè)置為50即可,如下所示:

search_params = dict(check = 50)
# FLANN匹配器、ORB描述符
import cv2

img1 = cv2.imread("xhu1.jpg", cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread("xhu2.jpg", cv2.IMREAD_GRAYSCALE)

orb = cv2.ORB_create()
kp1, des1 = orb.detectAndCompute(img1, None)
kp2, des2 = orb.detectAndCompute(img2, None)

# 定義FLANN參數(shù)
FLANN_INDEX_LSH = 6
index_params = dict(algorithm = FLANN_INDEX_LSH,
                    table_number = 6,
                    key_size = 12,
                    multi_probe_level = 1)
search_params = dict(check = 50)

flann = cv2.FlannBasedMatcher(index_params, search_params)
matches = flann.match(des1, des2)
draw_params = dict(matchColor = (0,255,0),
                   singlePointColor = (255,0,0),
                   matchesMask = None,
                   flags = cv2.DrawMatchesFlags_DEFAULT)

img3 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:20], None, **draw_params)

cv2.imshow("Xhu1", img1)
cv2.imshow("Xhu2", img2)
cv2.imshow("Matches", img3)


cv2.waitKey(0)
cv2.destroyAllWindows()

# FLANN匹配器、SIFT描述符
import cv2

img1 = cv2.imread("xhu1.jpg", cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread("xhu2.jpg", cv2.IMREAD_GRAYSCALE)

sift = cv2.SIFT_create()
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)

# 定義FLANN參數(shù)
FLANN_INDEX_KDTREE = 1
index_params = dict(algorithm = FLANN_INDEX_KDTREE,
                    trees = 5)
search_params = dict(check = 50)

flann = cv2.FlannBasedMatcher(index_params, search_params)
matches = flann.match(des1, des2)
draw_params = dict(matchColor = (0,255,0),
                   singlePointColor = (255,0,0),
                   matchesMask = None,
                   flags = cv2.DrawMatchesFlags_DEFAULT)

img3 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:20], None, **draw_params)

cv2.imshow("Xhu1", img1)
cv2.imshow("Xhu2", img2)
cv2.imshow("Matches", img3)


cv2.waitKey(0)
cv2.destroyAllWindows()

到此這篇關(guān)于Python OpenCV特征檢測之特征匹配方式詳解的文章就介紹到這了,更多相關(guān)Python OpenCV特征匹配內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • pandas篩選某列出現(xiàn)編碼錯(cuò)誤的解決方法

    pandas篩選某列出現(xiàn)編碼錯(cuò)誤的解決方法

    今天小編就為大家分享一篇pandas篩選某列出現(xiàn)編碼錯(cuò)誤的解決方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • Conda命令教程小結(jié)

    Conda命令教程小結(jié)

    Conda 是一個(gè)開源的包管理器和環(huán)境管理器,主要用于安裝和管理 Python 包及依賴項(xiàng),本文就來介紹一下Conda命令,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-01-01
  • 解決python中0x80072ee2錯(cuò)誤的方法

    解決python中0x80072ee2錯(cuò)誤的方法

    在本篇文章中小編給大家分享的是關(guān)于解決python中0x80072ee2錯(cuò)誤的方法,需要的朋友們可以參考下。
    2020-07-07
  • Python 中的函數(shù)裝飾器和閉包詳解

    Python 中的函數(shù)裝飾器和閉包詳解

    這篇文章主要介紹了Python 中的函數(shù)裝飾器和閉包詳解,需要的朋友可以參考下
    2021-02-02
  • python 用lambda函數(shù)替換for循環(huán)的方法

    python 用lambda函數(shù)替換for循環(huán)的方法

    今天小編就為大家分享一篇python 用lambda函數(shù)替換for循環(huán)的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • Python+Selenium實(shí)現(xiàn)自動化的環(huán)境搭建的步驟(圖文)

    Python+Selenium實(shí)現(xiàn)自動化的環(huán)境搭建的步驟(圖文)

    這篇文章主要介紹了Python+Selenium實(shí)現(xiàn)自動化的環(huán)境搭建的步驟(圖文),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Python實(shí)現(xiàn)批量下載excel表中超鏈接圖片

    Python實(shí)現(xiàn)批量下載excel表中超鏈接圖片

    這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)批量下載excel表中超鏈接圖片,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考一下
    2024-11-11
  • Python利用selenium建立代理ip池訪問網(wǎng)站的全過程

    Python利用selenium建立代理ip池訪問網(wǎng)站的全過程

    selenium控制瀏覽器也是可以使用代理ip的,下面這篇文章主要給大家介紹了關(guān)于Python利用selenium建立代理ip池訪問網(wǎng)站的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • 解決django xadmin主題不顯示和只顯示bootstrap2的問題

    解決django xadmin主題不顯示和只顯示bootstrap2的問題

    這篇文章主要介紹了解決django xadmin主題不顯示和只顯示bootstrap2的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • python使用protobufde的過程解析

    python使用protobufde的過程解析

    Google開源的一個(gè)序列化框架,類似于xml , json。最大的特點(diǎn)是基于 二進(jìn)制,比傳統(tǒng)的xml表示同樣的內(nèi)容要短小很多。亦可定義一些可選字段,用于服務(wù)端與客戶端通信
    2021-08-08

最新評論

威宁| 杭锦后旗| 台湾省| 巩留县| 张家港市| 深水埗区| 乌鲁木齐县| 普陀区| 新绛县| 青州市| 宝清县| 丰镇市| 刚察县| 布拖县| 平昌县| 绥阳县| 昌邑市| 醴陵市| 大石桥市| 扎兰屯市| 博白县| 色达县| 多伦县| 静安区| 建湖县| 茶陵县| 汤阴县| 蒙自县| 乌海市| 修水县| 毕节市| 临武县| 罗平县| 平利县| 阿尔山市| 同德县| 大方县| 厦门市| 应城市| 阳春市| 枞阳县|