Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python OpenCV绘制非匹配点_Python_Opencv_Sift - Fatal编程技术网

Python OpenCV绘制非匹配点

Python OpenCV绘制非匹配点,python,opencv,sift,Python,Opencv,Sift,我遵循并使用了OpenCV中的SIFT和其他算法来查找两幅图像之间的匹配特征点。据我所知,这些算法可以在两幅图像之间找到相似的区域。但我对识别不同或不相似的区域感兴趣。如何在两幅图像上绘制所有不匹配的特征点?此外,我是否可以围绕这些非匹配点绘制边界,以显示两幅图像中的哪些区域不同 我在Windows7上使用Python代码,并从最新的OpenCV源代码中构建。结果证明这是一项简单的列表操作任务。这是我的Python代码 # code copied from # http://docs.openc

我遵循并使用了OpenCV中的SIFT和其他算法来查找两幅图像之间的匹配特征点。据我所知,这些算法可以在两幅图像之间找到相似的区域。但我对识别不同或不相似的区域感兴趣。
如何在两幅图像上绘制所有不匹配的特征点?此外,我是否可以围绕这些非匹配点绘制边界,以显示两幅图像中的哪些区域不同


我在Windows7上使用Python代码,并从最新的OpenCV源代码中构建。

结果证明这是一项简单的列表操作任务。这是我的Python代码

# code copied from
# http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_feature2d/py_feature_homography/py_feature_homography.html

import numpy as np
import cv2
from matplotlib import pyplot as plt
from scipy.spatial.distance import euclidean

MIN_MATCH_COUNT = 10

img1 = cv2.imread('Src.png',0)  # queryImage
img2 = cv2.imread('Dest.png',0) # trainImage

# Initiate SIFT detector
sift = cv2.xfeatures2d.SIFT_create()

# find the keypoints and descriptors with SIFT
kp1, des1 = sift.detectAndCompute(img1,None)
kp2, des2 = sift.detectAndCompute(img2,None)

FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks = 50)

flann = cv2.FlannBasedMatcher(index_params, search_params)

matches = flann.knnMatch(des1,des2,k=2)

# store all the good matches as per Lowe's ratio test.
good = []
for m,n in matches:
    if m.distance < 0.7*n.distance:
        good.append(m)

if len(good)>MIN_MATCH_COUNT:
    src_pts = np.float32([ kp1[m.queryIdx].pt for m in good ]).reshape(-1,1,2)
    dst_pts = np.float32([ kp2[m.trainIdx].pt for m in good ]).reshape(-1,1,2)

    kp1_matched=([ kp1[m.queryIdx] for m in good ])
    kp2_matched=([ kp2[m.trainIdx] for m in good ])

    kp1_miss_matched=[kp for kp in kp1 if kp not in kp1_matched]
    kp2_miss_matched=[kp for kp in kp2 if kp not in kp2_matched]

    # draw only miss matched or not matched keypoints location
    img1_miss_matched_kp = cv2.drawKeypoints(img1,kp1_miss_matched, None,color=(255,0,0), flags=0)
    plt.imshow(img1_miss_matched_kp),plt.show()

    img2_miss_matched_kp = cv2.drawKeypoints(img2,kp2_miss_matched, None,color=(255,0,0), flags=0)
    plt.imshow(img2_miss_matched_kp),plt.show()

    M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC,5.0)
    matchesMask = mask.ravel().tolist()

    h,w = img1.shape
    pts = np.float32([ [0,0],[0,h-1],[w-1,h-1],[w-1,0] ]).reshape(-1,1,2)
    dst = cv2.perspectiveTransform(pts,M)

else:
    print "Not enough matches are found - %d/%d" % (len(good),MIN_MATCH_COUNT)
    matchesMask = None
#从中复制的代码
# http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_feature2d/py_feature_homography/py_feature_homography.html
将numpy作为np导入
进口cv2
从matplotlib导入pyplot作为plt
从scipy.space.distance导入欧几里得
最小匹配计数=10
img1=cv2.imread('Src.png',0)#查询图像
img2=cv2.imread('Dest.png',0)#列车图像
#启动筛分检测器
sift=cv2.xfeature2d.sift_create()
#使用SIFT查找关键点和描述符
kp1,des1=筛选、检测和计算(img1,无)
kp2,des2=筛选、检测和计算(img2,无)
法兰索引KDTREE=0
索引参数=dict(算法=FLANN\u索引树,树=5)
搜索参数=dict(检查=50)
flann=cv2.FlannBasedMatcher(索引参数、搜索参数)
匹配=法兰N.knnMatch(des1、des2、k=2)
#根据Lowe比率测试存储所有良好匹配项。
好的=[]
对于匹配中的m,n:
如果m.距离<0.7*n.距离:
好。追加(m)
如果长度(良好)>最小匹配计数:
src_pts=np.float32([kp1[m.queryIdx].pt代表m处于良好状态])。重塑(-1,1,2)
dst_pts=np.float32([kp2[m.trainIdx].pt代表m处于良好状态])。重塑(-1,1,2)
kp1_matched=([kp1[m.queryIdx]表示m处于良好状态])
kp2_matched=([kp2[m.trainIdx]表示m处于良好状态])
kp1_未命中_匹配=[如果kp不在kp1_匹配中,则kp1中kp的kp为kp]
kp2_未命中_匹配=[如果kp不在kp2_匹配中,则kp2中的kp对应kp]
#仅绘制未匹配或未匹配的关键点位置
img1\u未命中\u匹配\u kp=cv2.绘图关键点(img1,kp1\u未命中\u匹配,无,颜色=(255,0,0),标志=0)
plt.imshow(img1\u miss\u matched\u kp),plt.show()
img2\u未命中\u匹配\u kp=cv2.绘制关键点(img2,kp2\u未命中\u匹配,无,颜色=(255,0,0),标志=0)
plt.imshow(img2\u miss\u matched\u kp),plt.show()
M、 掩模=cv2.findHomography(src_pts,dst_pts,cv2.RANSAC,5.0)
matchesMask=mask.ravel().tolist()
h、 w=img1.1形状
pts=np.float32([[0,0],[0,h-1],[w-1,h-1],[w-1,0]])。重塑(-1,1,2)
dst=cv2.透视变换(pts,M)
其他:
打印“未找到足够的匹配-%d/%d”%(长度(良好),最小匹配计数)
matchesMask=None
  • 在两幅图像上绘制所有不匹配的特征点:
  • 一旦您知道由两个描述符的匹配(匹配=bf.match(des1,des2))得到的结果的结构,这个任务就相当简单了。与此问题相关的两个Matcher对象的属性如下:

    • DMatch.trainIdx:列车描述符中描述符(或列车图像中的关键点)的索引
    • DMatch.queryIdx:查询描述符中描述符(或查询图像中的关键点)的索引
    然后,知道了这些信息,正如@uzair_syed所说的,这只是一个例子


  • 围绕非匹配点绘制边界:
  • 为了实现这一点,我会做如下工作:

    • 为每个非匹配点创建带有白色像素的黑色遮罩
    • 根据非匹配点簇的密度,使用大内核(即15 x 15 px)扩展遮罩
    • 腐蚀具有相同内核大小的掩码
    • 最后,在掩码上应用
      findContours
      函数以获得非匹配点的边界
    要了解更多信息,您可以看看这个


    希望它能让你走上正轨

    您能否提供一些代码(特别是为两个图像生成关键点和描述符的部分,以及进行
    匹配的部分)
    ?我可以解决它。.我把我的答案贴在下面。你的问题的第二部分还需要一些提示吗?@elouranlaine是的,plzz。.第二部分需要帮助吗part@ElouarnLaine谢谢…我有一个后续问题…看看你对此有什么建议