我正在尝试使用opencv(tutorial)在下面显示的图像之间匹配关键点。 问题是我不确定是否需要调整某些参数,或者我完全使用了错误的方法。仅获取map.png的右侧也无济于事。 这是我的代码,也是结果。
import numpy as np
import cv2
import matplotlib.pyplot as plt
img1 = cv2.imread('../map.png',0)
img2 = cv2.imread('../mask.png',0)
orb = cv2.ORB_create()
kp1, des1 = orb.detectAndCompute(img1,None)
kp2, des2 = orb.detectAndCompute(img2,None)
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(des1,des2)
matches = sorted(matches, key = lambda x:x.distance)
img3 = cv2.drawMatches(img1,kp1,img2,kp2,matches[:20], None, flags=2)
cv2.imwrite('test.png', img3)
答案 0 :(得分:0)
您使用的特征检测器(例如ORB)旨在匹配平移,旋转和缩放比例不同的图像之间的特征点。当图像的透视图差异很大时(即您的情况),则不打算使用它们,因此您的方法不起作用。而且,这种算法是为诸如照片之类的纹理丰富的图像设计的。在您的情况下,这些特征是重复的(从第一张图像中提取的多个特征点(例如线尾)可以与另一个特征点匹配)。 在您的情况下,您应该考虑其他特征,例如基于线相交的特征,请参阅tutorial以获取更多信息。这只是一个提示,并不是解决您的问题的方法,因为这确实具有挑战性。