【问题标题】:How to more accurately compare the characteristics between two images?如何更准确地比较两张图像之间的特征?
【发布时间】:2021-03-03 10:09:55
【问题描述】:

我已经开发了两种使用 SIFT 和 ORB 的方法,但在我看来,这些点并没有正确对应。我是错误地使用了这些功能还是需要一些不同的东西?

orb = cv2.ORB_create()
keypoints_X, descriptor_X = orb.detectAndCompute(car1_gray, None)
keypoints_y, descriptor_y = orb.detectAndCompute(car2_gray, None)
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck = True)
matches = bf.match(descriptor_X, descriptor_y)
matches = sorted(matches, key = lambda x: x.distance)
result = cv2.drawMatches(car1_gray, keypoints_X, car2_gray, keypoints_y, matches[:10], car2_gray, flags = 2)

sift = cv2.SIFT_create()

keypoints_X, descriptor_X = sift.detectAndCompute(car1_gray, None)
keypoints_y, descriptor_y = sift.detectAndCompute(car2_gray, None)
bf = cv2.BFMatcher()
matches = bf.knnMatch(descriptor_X, descriptor_y, k=2)

bom = []

for m,n in matches:
    if m.distance < 0.75*n.distance:
        bom.append([m])

result = cv2.drawMatchesKnn(car1_gray, keypoints_X, car2_gray, keypoints_y, bom, None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)

SIFT 和 ORB 的结果如下:

【问题讨论】:

  • 大多数关键点描述符仅适用于纹理表面。此外,总会有错误的匹配。您将需要诸如 RANSAC 单应性估计之类的方法来查找内点/异常值

标签: opencv computer-vision conv-neural-network sift orb


【解决方案1】:

看看 SuperGlue,基于图神经网络的特征匹配。虽然,他们不提供训练代码,但有两种用于室内、室外的预训练模型。链接,

https://github.com/magicleap/SuperGluePretrainedNetwork

https://psarlin.com/superglue/

https://arxiv.org/pdf/1911.11763.pdf

【讨论】:

    猜你喜欢
    • 2015-09-13
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多