OpenCV特征匹配和單應性矩陣查找對象詳解
目標
在本章中,將學習
- 將從Calib3D模塊中混淆特征匹配和找到(單應性矩陣)homography,以查找復雜圖像中的已知對象。
基礎(chǔ)
在之前的內(nèi)容中,使用了一個query image,在其中找到了一些特征點,拍攝了另一張train image,也在該圖像中找到了特征,找到了其中最好的匹配。簡而言之,在另一張雜亂的圖像中找到了物體某些部分的位置。該信息足以準確地在train image上找到對象。
為此,可以使用calib3d模塊的函數(shù),即cv2.findHomography()。如果從圖像中傳遞一組點,它將找到該對象的透視變換。然后可以使用cv2.perspectiveTransform()以查找對象。至少需要四個正確的點才能找到轉(zhuǎn)換。
之前的內(nèi)容中可以看到,匹配的時候可能存在一些可能的錯誤,這可能會影響結(jié)果。為了解決這個問題,算法使用RANSAC或LEAST_MEDIAN(可以由標志決定)。如此良好的匹配,提供正確估計稱為inliers,并且剩余的稱為異常值。cv2.findhomography()返回一個掩碼,指定Inlier和異常值
實現(xiàn)
首先,像往常一樣,在圖像中查找SIFT特征,并應用比率測試來找到最佳匹配。
現(xiàn)在設置了一個至少10的匹配(由min_match_count定義)的條件是在那里找到對象。否則簡單地顯示一條消息,表明不夠匹配。
**如果找到有足夠的匹配,將在兩個圖像中提取匹配項點的位置。**通過以找到相似的轉(zhuǎn)變。一旦獲得此3x3轉(zhuǎn)換矩陣,將使用它將QueryImage的角轉(zhuǎn)換為TrainImage中的對應點,然后畫出來。
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é)果如下。在雜亂圖像中用白色顏色標記匹配的物體
附加資源
- docs.opencv.org/4.1.2/d9/d0…
- docs.opencv.org/4.1.2/d1/de…
- http://chabaoo.cn/article/282365.htm
- docs.opencv.org/4.1.2/d2/de…
- cv2.findHomography()
以上就是OpenCV特征匹配和單應性矩陣查找對象詳解的詳細內(nèi)容,更多關(guān)于OpenCV特征匹配單應性的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python中json格式數(shù)據(jù)的編碼與解碼方法詳解
這篇文章主要介紹了Python中json格式數(shù)據(jù)的編碼與解碼方法,詳細分析了Python針對json格式數(shù)據(jù)的編碼轉(zhuǎn)換操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下2016-07-07
python文件轉(zhuǎn)為exe文件的方法及用法詳解
py2exe是一個將python腳本轉(zhuǎn)換成windows上的可獨立執(zhí)行的可執(zhí)行程序(*.exe)的工具,這樣,你就可以不用裝python而在windows系統(tǒng)上運行這個可執(zhí)行程序。本文重點給大家介紹python文件轉(zhuǎn)為exe文件的方法,感興趣的朋友跟隨小編一起看看吧2019-07-07
tensorflow卷積神經(jīng)Inception?V3網(wǎng)絡結(jié)構(gòu)代碼解析
這篇文章主要為大家介紹了卷積神經(jīng)Inception?V3網(wǎng)絡結(jié)構(gòu)代碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05
python tornado上傳文件功能實現(xiàn)(前端和后端)
Tornado 是一個功能強大的 Web 框架,除了基本的請求處理能力之外,還提供了一些高級功能,在 Tornado web 框架中,上傳圖片通常涉及創(chuàng)建一個表單,讓用戶選擇文件并上傳,本文介紹tornado上傳文件功能,感興趣的朋友一起看看吧2024-03-03
Python爬蟲數(shù)據(jù)處理模塊的安裝使用教程
這篇文章主要為大家介紹了Python爬蟲數(shù)據(jù)處理模塊的安裝使用教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06

