美文网首页数据科学
OpenCV-Python教程:42.特征匹配+Homograp

OpenCV-Python教程:42.特征匹配+Homograp

作者: xxxss | 来源:发表于2017-06-30 11:49 被阅读1175次

    基础

    我们之前使用了查询图像,找到其中的一些特征点,我们取另外一个训练图像,找到里面的特征,我们找到它们中间最匹配的。简单说就是我们在一组图像里找一个目标的某个部分的位置。

    我们可以使用一个calib3d模块里的函数,cv2.findHomography().如果我们传了两个图像里的点集合,它会找到那个目标的透视转换。然后我们可以使用cv2.perspectiveTransform()来找目标,它需要至少4个正确的点来找变换。

    我们看过可能会有一些匹配是的错误而影响结果。哟啊解决这个问题,算法使用了RANSAC或者LEAST_MEDIAN(由标志决定)。提供正确估计的好的匹配被叫做inliers,而其他的叫做outliers。cv2.findHomography()返回一个掩图来指定inlier和outlier。

    code

    首先,和正常一样,我们找到SIFT特征,用比率检测来找最匹配的。

    import numpy as np
    import cv2
    from matplotlib import pyplot as plt

    MIN_MATCH_COUNT = 10

    img1 = cv2.imread('box.png',0)          # queryImage
    img2 = cv2.imread('box_in_scene.png',0) # trainImage

    # Initiate SIFT detector
    sift = cv2.SIFT()

    # 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)

    现在我们设置一个至少10个匹配的条件(有MIN_MATCH_COUNT指定)来找目标。否则就显示一个信息说没有足够的匹配。

    如果找到了足够的匹配,我们得到两张图像里标记的关键点的位置。他们被传到透视转换。当我们得到了3x3的转换矩阵,我们用它来把查询图像里的角转换到响应的训练图像的对应点。然后画出来。

    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)
       
        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)

        img2 = cv2.polylines(img2,[np.int32(dst)],True,255,3, cv2.LINE_AA)

    else:
        print "Not enough matches are found - %d/%d" % (len(good),MIN_MATCH_COUNT)
        matchesMask = None

    最后我们画出我们的inliers(如果成功找到了目标)或者匹配关键点(如果失败了)

    draw_params = dict(matchColor = (0,255,0), # draw matches in green color
            singlePointColor = None,
            matchesMask = matchesMask, # draw only inliers
            flags = 2)

    img3 = cv2.drawMatches(img1,kp1,img2,kp2,good,None,**draw_params)

    plt.imshow(img3, 'gray'),plt.show()

    看下面的结果,目标被白色标出来

    END

    相关文章

      网友评论

        本文标题:OpenCV-Python教程:42.特征匹配+Homograp

        本文链接:https://www.haomeiwen.com/subject/chzhsttx.html