【问题标题】:When comparing pictures, SIFT and ORB methods in OPenCV don't work when one picture has been mirrored比较图片时,OPenCV中的SIFT和ORB方法在一张图片被镜像后不起作用
【发布时间】:2021-03-31 08:10:50
【问题描述】:

我试图在一个文件夹中找到所有“几乎”相同的图片。 “几乎相同”是指例如您有一张原始图片,并且您对此图片进行了修改。 修改可以是分辨率的改变,图片变为灰度,图片被裁剪,图片旋转,框架或一些文字被添加,图片被镜像......

我将 OpenCV 与 SIFT 和 ORB 一起使用(我选择每种我想使用的方法,我不会同时使用它们)。 对于所有图片变化,SIFT 和 ORB 都工作得很好。但不是为了镜像。 即使我只对第一张图片做一个镜像(意思是我不改变其他任何东西),分数也只有10%左右。

我不明白,因为我认为 SIFT 和 ORB 正在计算关键点的距离。但是在拍摄镜像时,距离不会改变。只有方向。

我错过了什么?

这是我的代码的摘录:

if method   == 'ORB':
    finder = cv2.ORB_create()
elif method == 'SIFT':
    finder = cv2.xfeatures2d.SIFT_create()

lowe_ration = 0.86

# find the keypoints and descriptors with SIFT or ORB
for i in range(0,count-1):
    for j in range(i+1,count):
        kp1, des1 = finder.detectAndCompute(all_new_images_to_compare[i],None)
        kp2, des2 = finder.detectAndCompute(all_new_images_to_compare[j],None)
        bf = cv2.BFMatcher()
        matches = bf.knnMatch(des1,des2, k=2)        
        good_points = []
        for m,n in matches:
            if m.distance < lowe_ratio * n.distance:
       good_points.append(m)
       number_keypoints = 0
       if len(kp1) >= len(kp2):
           number_keypoints = len(kp1)
       else:
           number_keypoints = len(kp2)
       percentage_similarity = len(good_points) / (number_keypoints) * 100
       
        if  (percentage_similarity)>=10:
            myfile1=open("C:/Users/ABC/Documents/Find-Similar-Pictures/results_" + method + ".txt","a")
            myfile1.write(str(titles[i]) + "\t" + str(titles[j]) + "\t" + method + " (" + str(lowe_ratio) + ") \t" + str(int(percentage_similarity) ) + "\t\n")
            myfile1.close()
            print(titles[i], titles[j],"== Similarity: " + str(int(percentage_similarity)), method + " (" + str(lowe_ratio) + ")")
    print("___done with file", titles[i])
print("=====done=====")

非常感谢您的帮助

【问题讨论】:

    标签: opencv sift orb


    【解决方案1】:

    您发现了 ORB 描述符和 SIFT 检测器的一个属性 - 两者都不是反射不变的。

    如果您对匹配反射图像感兴趣,您需要执行以下操作之一:

    1. 使用对称关键点检测器,例如FAST、Harris 或 CeNSURE,然后在反射的关键点上使用 SIFT 描述符。
    2. 实现反射不变描述符,如MBR-SIFT

    对本文给出的问题有很好的分析:Symmetric Stability of Low Level Feature Detectors

    祝你好运!

    【讨论】:

    • 感谢您的参考。在 PLOS ONE 上发表计算机视觉研究文章很常见吗?
    • 感谢您的解释。奇怪的是他们(SIFT 和 ORB)没有考虑镜像。
    • 刚查了一下,OpenCV中好像没有MBR-SIFT...
    • @Catree 不,我不会这么说!我必须承认我对那个特定的描述符没有经验,这只是我遇到的第一个例子。
    • @Origami 我的帖子不正确 - 我会编辑更新。 SIFT 描述符很好,问题在于检测器。
    猜你喜欢
    • 2021-06-07
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多