OpenCV特征匹配和单应性矩阵查找对象怎么实现

其他教程   发布日期:2025年04月15日   浏览次数:184

这篇文章主要介绍了OpenCV特征匹配和单应性矩阵查找对象怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇OpenCV特征匹配和单应性矩阵查找对象怎么实现文章都会有所收获,下面我们一起来看看吧。

基础

在之前的内容中,使用了一个query image,在其中找到了一些特征点,拍摄了另一张train image,也在该图像中找到了特征,找到了其中最好的匹配。简而言之,在另一张杂乱的图像中找到了物体某些部分的位置。该信息足以准确地在train image上找到对象

为此,可以使用

  1. calib3d
模块的函数,即
  1. cv2.findHomography()
。如果从图像中传递一组点,它将找到该对象的透视变换。然后可以使用
  1. cv2.perspectiveTransform()
以查找对象。至少需要四个正确的点才能找到转换。

之前的内容中可以看到,匹配的时候可能存在一些可能的错误,这可能会影响结果。为了解决这个问题,算法使用

  1. RANSAC
  1. LEAST_MEDIAN
(可以由标志决定)。如此良好的匹配,提供正确估计称为
  1. inliers
,并且剩余的称为异常值
  1. cv2.findhomography()
返回一个掩码,指定
  1. Inlier
和异常值

实现

首先,像往常一样,在图像中查找SIFT特征,并应用比率测试来找到最佳匹配。

现在设置了一个至少10的匹配(由

  1. min_match_count
定义)的条件是在那里找到对象。否则简单地显示一条消息,表明不够匹配。

**如果找到有足够的匹配,将在两个图像中提取匹配项点的位置。**通过以找到相似的转变。一旦获得此

  1. 3x3
转换矩阵,将使用它将
  1. QueryImage
的角转换为
  1. TrainImage
中的对应点,然后画出来。
  1. import cv2
  2. import numpy as np
  3. from matplotlib import pyplot as plt
  4. MIN_MATCH_COUNT = 10
  5. img1 = cv2.imread('box2.png', 0) # query image
  6. img2 = cv2.imread('box_in_scene.png', 0) # train image
  7. # Initial SIFT detector
  8. sift = cv2.xfeatures2d.SIFT_create()
  9. # find the keypoints and descriptiors with SIFT
  10. kp1, des1 = sift.detectAndCompute(img1, None)
  11. kp2, des2 = sift.detectAndCompute(img2, None)
  12. FLANN_INDEX_KDTREE = 1
  13. index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
  14. search_params = dict(checks=50)
  15. flann = cv2.FlannBasedMatcher(index_params, search_params)
  16. matches = flann.knnMatch(des1, des2, k=2)
  17. # store all the good matches as per lows ratio test
  18. good = []
  19. for m, n in matches:
  20. if m.distance < 0.7 * n.distance:
  21. good.append(m)
  22. if len(good) > MIN_MATCH_COUNT:
  23. src_pts = np.float32([ kp1[m.queryIdx].pt for m in good ]).reshape(-1,1,2)
  24. dst_pts = np.float32([ kp2[m.trainIdx].pt for m in good ]).reshape(-1,1,2)
  25. M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)
  26. matchesMask = mask.ravel().tolist()
  27. h, w = img1.shape
  28. pts = np.float32([[0, 0], [0, h-1], [w-1, h-1], [w-1, 0]]).reshape(-1, 1, 2)
  29. dst = cv2.perspectiveTransform(pts, M)
  30. img2 = cv2.polylines(img2, [np.int32(dst)], True, 255, 3, cv2.LINE_AA)
  31. else:
  32. print("Not enough matches are found - {} / {}".format(len(good), MIN_MATCH_COUNT))
  33. matchesMask = None
  34. draw_params = dict(
  35. matchColor=(0, 255, 0),
  36. singlePointColor=None,
  37. matchesMask=matchesMask,
  38. flags=2)
  39. img3 = cv2.drawMatches(img1, kp1, img2, kp2, good, None, **draw_params)
  40. plt.imshow(img3, 'gray')
  41. plt.show()

以上就是OpenCV特征匹配和单应性矩阵查找对象怎么实现的详细内容,更多关于OpenCV特征匹配和单应性矩阵查找对象怎么实现的资料请关注九品源码其它相关文章!