【发布时间】: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=====")
非常感谢您的帮助
【问题讨论】: