具有SIFT,SURF或ORB的特征匹配金属对象

时间:2019-02-05 23:05:14

标签: opencv computer-vision sift surf homography

我试图识别图像中的关键点特征,即直接看我的对象,然后尝试将这些关键点特征与已稍微倾斜的同一对象的图像进行匹配。我的目标是确定从一张图片移动到另一张图片所需的旋转方向,反之亦然。

enter image description here enter image description here

我遇到的问题是关键点的匹配过程完全不准确。根据我的理解,这是因为我的物体在颜色上相当均匀,对称,并且它如何反射光使该过程变得困难。

有什么方法可以改善SIFT或ORB功能匹配吗?

或者还有另一种方法对于我的给定应用程序会更好。我对计算机视觉还比较陌生,不胜感激。

这是我正在使用的代码。到目前为止,我一直在参考OpenCV文档和在线教程。

try:
   surf = cv2.xfeatures2d.SURF_create(400)
except Exception:
   surf = cv2.cv2.xfeatures2d.SIFT_create(400)

kp1, des1 = surf.detectAndCompute(img1, None)
kp2, des2 = surf.detectAndCompute(img2, None)

img_pts = cv2.drawKeypoints(img1, kp1, None)
plt.imshow(img_pts)
plt.show()

FLANN_INDEX_KDTREE = 0
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 Lowe's ratio test.
good = []
for m, n in matches:
    if m.distance < 0.7 * n.distance:
        good.append(m)

match_results = cv2.drawMatches(img1, kp1, img2, kp2, good[:], None, flags=2)
plt.imshow(match_results)
plt.show()


MIN_MATCH_COUNT = 10
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)

    # see https://ch.mathworks.com/help/images/examples/find-image-rotation-and-scale-using-automated-feature-matching.html for details
    ss = M[0, 1]
    sc = M[0, 0]
    scaleRecovered = np.sqrt(ss * ss + sc * sc)
    thetaRecovered = np.arctan2(ss, sc) * 180 / np.pi
    print('Scale: {} , Rotation: {}'.format(scaleRecovered, thetaRecovered))

    # deskew image
    im_out = cv2.warpPerspective(img2, np.linalg.inv(M),
                                     (img1.shape[1], img1.shape[0]))

    plt.title('Before')
    plt.imshow(img1)
    plt.show()

    plt.title('After')
    plt.imshow(im_out)
    plt.show()

    plt.title('compare')
    plt.imshow(img2)
    plt.show()

1 个答案:

答案 0 :(得分:0)

我相信您在正确的道路上。但是,为什么不使用现成的工具呢?例如,请参见CNN-SLam的ORB Slam:

它们都与您尝试执行的操作类似。我相信ORB Slam使用ORB匹配器。他们和你有什么不同?

  • 立体声相机比单声道效果更好
  • 他们拍摄很多照片(或使用视频馈送),每张照片的角度差很小
  • 大多数情况下,摄像头具有陀螺仪/加速器,因此他们使用该数据来猜测摄像头的移动方式,并将其与所看到的相结合。 (传感器融合)
  • 3D点云本身是封闭的,以提供物理上健全的环境。

如果您想自己尝试一下,请知道单应性盲匹配永远不会为您带来良好的结果。原因是您在问题评论中列出/列出的原因。但是,您可以跟进这些库的思想并提出自己的类似实现,或者可以根据需要进行修改(如果您甚至对其进行了改进,以便我们所有人都可以使用:-会更好)。 )