这篇文章主要介绍了OpenCV特征匹配和单应性矩阵查找对象怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇OpenCV特征匹配和单应性矩阵查找对象怎么实现文章都会有所收获,下面我们一起来看看吧。
在之前的内容中,使用了一个query image,在其中找到了一些特征点,拍摄了另一张train image,也在该图像中找到了特征,找到了其中最好的匹配。简而言之,在另一张杂乱的图像中找到了物体某些部分的位置。该信息足以准确地在train image上找到对象。
为此,可以使用calib3d
模块的函数,即cv2.findHomography()
。如果从图像中传递一组点,它将找到该对象的透视变换。然后可以使用cv2.perspectiveTransform()
以查找对象。至少需要四个正确的点才能找到转换。
之前的内容中可以看到,匹配的时候可能存在一些可能的错误,这可能会影响结果。为了解决这个问题,算法使用RANSAC
或LEAST_MEDIAN
(可以由标志决定)。如此良好的匹配,提供正确估计称为inliers
,并且剩余的称为异常值。cv2.findhomography()
返回一个掩码,指定Inlier
和异常值
首先,像往常一样,在图像中查找SIFT特征,并应用比率测试来找到最佳匹配。
现在设置了一个至少10的匹配(由min_match_count
定义)的条件是在那里找到对象。否则简单地显示一条消息,表明不够匹配。
**如果找到有足够的匹配,将在两个图像中提取匹配项点的位置。**通过以找到相似的转变。一旦获得此3x3
转换矩阵,将使用它将QueryImage
的角转换为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()
关于“OpenCV特征匹配和单应性矩阵查找对象怎么实现”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“OpenCV特征匹配和单应性矩阵查找对象怎么实现”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。