OpenCV特征匹配和單應(yīng)性矩陣查找對象詳解
目標(biāo)
在本章中,將學(xué)習(xí)
- 將從Calib3D模塊中混淆特征匹配和找到(單應(yīng)性矩陣)homography,以查找復(fù)雜圖像中的已知對象。
基礎(chǔ)
在之前的內(nèi)容中,使用了一個(gè)query image,在其中找到了一些特征點(diǎn),拍攝了另一張train image,也在該圖像中找到了特征,找到了其中最好的匹配。簡而言之,在另一張雜亂的圖像中找到了物體某些部分的位置。該信息足以準(zhǔn)確地在train image上找到對象。
為此,可以使用calib3d
模塊的函數(shù),即cv2.findHomography()
。如果從圖像中傳遞一組點(diǎn),它將找到該對象的透視變換。然后可以使用cv2.perspectiveTransform()
以查找對象。至少需要四個(gè)正確的點(diǎn)才能找到轉(zhuǎn)換。
之前的內(nèi)容中可以看到,匹配的時(shí)候可能存在一些可能的錯(cuò)誤,這可能會(huì)影響結(jié)果。為了解決這個(gè)問題,算法使用RANSAC
或LEAST_MEDIAN
(可以由標(biāo)志決定)。如此良好的匹配,提供正確估計(jì)稱為inliers
,并且剩余的稱為異常值。cv2.findhomography()
返回一個(gè)掩碼,指定Inlier
和異常值
實(shí)現(xiàn)
首先,像往常一樣,在圖像中查找SIFT特征,并應(yīng)用比率測試來找到最佳匹配。
現(xiàn)在設(shè)置了一個(gè)至少10的匹配(由min_match_count
定義)的條件是在那里找到對象。否則簡單地顯示一條消息,表明不夠匹配。
**如果找到有足夠的匹配,將在兩個(gè)圖像中提取匹配項(xiàng)點(diǎn)的位置。**通過以找到相似的轉(zhuǎn)變。一旦獲得此3x3
轉(zhuǎn)換矩陣,將使用它將QueryImage
的角轉(zhuǎn)換為TrainImage
中的對應(yīng)點(diǎn),然后畫出來。
import cv2 import numpy as np from matplotlib import pyplot as plt MIN_MATCH_COUNT = 10 img1 = cv2.imread('box2.png', 0) # query image img2 = cv2.imread('box_in_scene.png', 0) # train image # Initial SIFT detector sift = cv2.xfeatures2d.SIFT_create() # find the keypoints and descriptiors with SIFT kp1, des1 = sift.detectAndCompute(img1, None) kp2, des2 = sift.detectAndCompute(img2, None) 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) # store all the good matches as per lows ratio test good = [] for m, n in matches: if m.distance < 0.7 * n.distance: good.append(m) if len(good) > MIN_MATCH_COUNT: src_pts = np.float32([ kp1[m.queryIdx].pt for m in good ]).reshape(-1,1,2) dst_pts = np.float32([ kp2[m.trainIdx].pt for m in good ]).reshape(-1,1,2) M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0) matchesMask = mask.ravel().tolist() h, w = img1.shape pts = np.float32([[0, 0], [0, h-1], [w-1, h-1], [w-1, 0]]).reshape(-1, 1, 2) dst = cv2.perspectiveTransform(pts, M) img2 = cv2.polylines(img2, [np.int32(dst)], True, 255, 3, cv2.LINE_AA) else: print("Not enough matches are found - {} / {}".format(len(good), MIN_MATCH_COUNT)) matchesMask = None draw_params = dict( matchColor=(0, 255, 0), singlePointColor=None, matchesMask=matchesMask, flags=2) img3 = cv2.drawMatches(img1, kp1, img2, kp2, good, None, **draw_params) plt.imshow(img3, 'gray') plt.show()
結(jié)果如下。在雜亂圖像中用白色顏色標(biāo)記匹配的物體
附加資源
- docs.opencv.org/4.1.2/d9/d0…
- docs.opencv.org/4.1.2/d1/de…
- http://www.dbjr.com.cn/article/282365.htm
- docs.opencv.org/4.1.2/d2/de…
- cv2.findHomography()
以上就是OpenCV特征匹配和單應(yīng)性矩陣查找對象詳解的詳細(xì)內(nèi)容,更多關(guān)于OpenCV特征匹配單應(yīng)性的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python中json格式數(shù)據(jù)的編碼與解碼方法詳解
這篇文章主要介紹了Python中json格式數(shù)據(jù)的編碼與解碼方法,詳細(xì)分析了Python針對json格式數(shù)據(jù)的編碼轉(zhuǎn)換操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07python利用小波分析進(jìn)行特征提取的實(shí)例
今天小編就為大家分享一篇python利用小波分析進(jìn)行特征提取的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01python文件轉(zhuǎn)為exe文件的方法及用法詳解
py2exe是一個(gè)將python腳本轉(zhuǎn)換成windows上的可獨(dú)立執(zhí)行的可執(zhí)行程序(*.exe)的工具,這樣,你就可以不用裝python而在windows系統(tǒng)上運(yùn)行這個(gè)可執(zhí)行程序。本文重點(diǎn)給大家介紹python文件轉(zhuǎn)為exe文件的方法,感興趣的朋友跟隨小編一起看看吧2019-07-07基于Python實(shí)現(xiàn)文件的壓縮與解壓縮
在日常工作中,除了會(huì)涉及到使用Python處理文本文件,有時(shí)候還會(huì)涉及對壓縮文件的處理。本文為大家總結(jié)了利用Python可以實(shí)現(xiàn)的幾種文件壓縮與解壓縮實(shí)現(xiàn)代碼,需要的可以參考一下2022-03-03tensorflow卷積神經(jīng)Inception?V3網(wǎng)絡(luò)結(jié)構(gòu)代碼解析
這篇文章主要為大家介紹了卷積神經(jīng)Inception?V3網(wǎng)絡(luò)結(jié)構(gòu)代碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05python tornado上傳文件功能實(shí)現(xiàn)(前端和后端)
Tornado 是一個(gè)功能強(qiáng)大的 Web 框架,除了基本的請求處理能力之外,還提供了一些高級(jí)功能,在 Tornado web 框架中,上傳圖片通常涉及創(chuàng)建一個(gè)表單,讓用戶選擇文件并上傳,本文介紹tornado上傳文件功能,感興趣的朋友一起看看吧2024-03-03Python爬蟲數(shù)據(jù)處理模塊的安裝使用教程
這篇文章主要為大家介紹了Python爬蟲數(shù)據(jù)處理模塊的安裝使用教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06