zoukankan      html  css  js  c++  java
  • OpenCV--特征匹配

    特征匹配

    Brute-Force蛮力匹配

    import cv2 
    import numpy as np
    import matplotlib.pyplot as plt
    %matplotlib inline
    img1 = cv2.imread('box.png', 0)
    img2 = cv2.imread('box_in_scene.png', 0)
    def cv_show(name,img):
        cv2.imshow(name, img)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    cv_show('img1',img1)

    效果:

    cv_show('img2',img2)

    效果:

    sift = cv2.xfeatures2d.SIFT_create()
    kp1, des1 = sift.detectAndCompute(img1, None)
    kp2, des2 = sift.detectAndCompute(img2, None)
    # crossCheck表示两个特征点要互相匹,例如A中的第i个特征点与B中的第j个特征点最近的,并且B中的第j个特征点到A中的第i个特征点也是 
    #NORM_L2: 归一化数组的(欧几里德距离),如果其他特征计算方法需要考虑不同的匹配计算方式
    bf = cv2.BFMatcher(crossCheck=True)

    1对1匹配

    matches = bf.match(des1, des2)
    matches = sorted(matches, key=lambda x: x.distance)
    img3 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:10], None,flags=2) cv_show('img3',img3)

    效果:

     k对最佳匹配

    bf = cv2.BFMatcher()
    matches = bf.knnMatch(des1, des2, k=2)
    good = []
    for m, n in matches:
        if m.distance < 0.75 * n.distance:
            good.append([m])
    img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags=2)
    cv_show('img3',img3)

    效果:

     如果需要更快速完成操作,可以尝试使用cv2.FlannBasedMatcher

    随机抽样一致算法(Random sample consensus,RANSAC)

     选择初始样本点进行拟合,给定一个容忍范围,不断进行迭代

     每一次拟合后,容差范围内都有对应的数据点数,找出数据点个数最多的情况,就是最终的拟合结果

     单应性矩阵

  • 相关阅读:
    myeclipse优化
    如何修改myeclipse的内存?eclipse.ini中各个参数的作用
    java日期处理
    拖放浮动效果——javascript
    4.什么时候加ing
    3.有些英语没有什么道理可讲的,不讲道理的习惯,必须要遵守
    数据库分页问题,跳页不正常问题解决办法
    谷歌地图计算两个坐标点的距离函数
    增加tomcat多实例 不忘初心
    ansible部署,规划 不忘初心
  • 原文地址:https://www.cnblogs.com/SCCQ/p/12300995.html
Copyright © 2011-2022 走看看