Python 匹配的ORB描述符,找不到好的匹配项

Python 匹配的ORB描述符,找不到好的匹配项,python,opencv,computer-vision,Python,Opencv,Computer Vision,我正在尝试使用ORB匹配两个图像,使用蛮力匹配器随机匹配结果,应用Low's ratio条件无法找到任何正确匹配 我怀疑问题出在中,如果m.distance

我正在尝试使用ORB匹配两个图像,使用蛮力匹配器随机匹配结果,应用Low's ratio条件无法找到任何正确匹配

我怀疑问题出在
中,如果m.distance<0.7:
我读到m.distance是从bf matcher返回的两个描述符之间的距离,但是值太大,没有一个满足条件,那么我如何删除异常值

我所尝试的:

  • 按距离对列表排序
    matches=sorted(matches,key=lambda x:x.distance)
  • 使用SIFT,效果非常好
排序无助于找到好的匹配项,而SIFT是专利,我想要ORB

我的代码:

# finding feature points on products
image = productName + ".jpg"
path = "./images/products/"+image
img1 = cv2.imread(path,cv2.IMREAD_GRAYSCALE) 
orb = cv2.ORB_create()
kps1, des1 = orb.detectAndCompute(img1, None)
result=cv2.drawKeypoints(img1,kps1, img1,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS )
plt.figure(num=None, figsize=(20, 12), dpi=80, facecolor='w', edgecolor='k')
plt.imshow(result)

# finding feature points on shelves
image = shelfName+'_raf.jpg'
path = "./images/shelves/"+image
img2 = cv2.imread(path,cv2.IMREAD_GRAYSCALE) 
orb = cv2.ORB_create()
kps2, des2 = orb.detectAndCompute(img2, None)
result=cv2.drawKeypoints(img2,kps2, img2,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
plt.figure(num=None, figsize=(20, 12), dpi=80, facecolor='w', edgecolor='k')
plt.imshow(result)

bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=False)
matches = bf.match(des1, des2)

# store all the good matches as per Lowe's ratio test.
good = []
for m in matches:
    if m.distance < 0.7:
        good.append(m)
        
match_img = cv2.drawMatches(img1, kps1, img2, kps2, good, None, flags=2)

plt.figure(num=None, figsize=(20, 12), dpi=80, facecolor='w', edgecolor='k')
plt.imshow(match_img, 'gray')
#查找产品上的功能点
image=productName+“.jpg”
path=“./图像/产品/”+图像
img1=cv2.imread(路径,cv2.imread\u灰度)
orb=cv2.orb_create()
kps1,des1=orb.detectAndCompute(img1,无)
结果=cv2.drawKeypoints(img1、kps1、img1、flags=cv2.DRAW\u匹配\u flags\u DRAW\u RICH\u关键点)
plt.figure(num=None,figsize=(20,12),dpi=80,facecolor='w',edgecolor='k')
plt.imshow(结果)
#在工具架上查找特征点
image=shelfName+“\u raf.jpg”
path=“./images/shelfs/”+图像
img2=cv2.imread(路径,cv2.imread\U灰度)
orb=cv2.orb_create()
kps2,des2=orb.detectAndCompute(img2,无)
结果=cv2.drawKeypoints(img2、kps2、img2、flags=cv2.DRAW\u匹配\u flags\u DRAW\u RICH\u关键点)
plt.figure(num=None,figsize=(20,12),dpi=80,facecolor='w',edgecolor='k')
plt.imshow(结果)
bf=cv2.BFMatcher(cv2.NORM\u HAMMING,交叉检查=False)
匹配=bf.匹配(des1,des2)
#根据Lowe比率测试存储所有良好匹配项。
好的=[]
对于匹配中的m:
如果m.距离<0.7:
好。追加(m)
匹配\u img=cv2。drawMatches(img1、kps1、img2、kps2、良好、无、标志=2)
plt.figure(num=None,figsize=(20,12),dpi=80,facecolor='w',edgecolor='k')
plt.imshow(匹配“灰色”)

如果我删除Low的条件,我会得到:

代码尝试使用Lowe比率测试(参见原始SIFT论文)

对于每个描述符,这需要两个最接近的匹配项

守则应改为:

matches=bf.knmatch(desCam,desTrain,k=2)#knmatch至关重要
好的=[]
对于匹配中的(m1,m2):#对于每个描述符,取最接近的两个匹配
如果m1.distance<0.7*m2.distance:#最佳匹配必须比次优更接近
好,追加(m1)
此外,我强烈推荐flann matcher。它比蛮力匹配器快


查看OpenCV源代码(
samples/python/find_obj.py
)中的或samples目录,以查找有效的代码。

代码尝试使用Lowe比率测试(请参阅原始SIFT论文)

对于每个描述符,这需要两个最接近的匹配项

守则应改为:

matches=bf.knmatch(desCam,desTrain,k=2)#knmatch至关重要
好的=[]
对于匹配中的(m1,m2):#对于每个描述符,取最接近的两个匹配
如果m1.distance<0.7*m2.distance:#最佳匹配必须比次优更接近
好,追加(m1)
此外,我强烈推荐flann matcher。它比蛮力匹配器快


查看OpenCV的源代码(
samples/python/find_obj.py
)中的或samples目录,以查找有效的代码。

这不是Lowe比率测试。该代码至少在两个与此相关的地方存在严重错误。你从哪里得到这个代码的?我从这里得到的是的,这就是为什么这个问题中的代码也不起作用的原因。丢弃蛮力匹配器。您需要与k=2匹配的“knn”。否则,无法进行Lowe比率测试。请阅读其他回复。或者从OpenCV中的samples目录中获取代码。这些圆代表什么?这些圆是不是Lowe比率测试的特征点或关键点。该代码至少在两个与此相关的地方存在严重错误。你从哪里得到这个代码的?我从这里得到的是的,这就是为什么这个问题中的代码也不起作用的原因。丢弃蛮力匹配器。您需要与k=2匹配的“knn”。否则,无法进行Lowe比率测试。请阅读其他回复。或者从OpenCV内的示例目录中获取代码。圆圈代表什么?圆圈是特征点或关键点谢谢你Christoph,你的答案成功了,我还必须将第一张和第二张图像的关键点数量更改为10000和100000。谢谢你Christoph,你的答案成功了,对于第一张和第二张图像,我还必须将关键点的数量更改为10000和100000。