zoukankan      html  css  js  c++  java
  • python opencv3 基于ORB的特征检测和 BF暴力匹配 knn匹配 flann匹配

    git:https://github.com/linyi0604/Computer-Vision

    bf暴力匹配:

     1 # coding:utf-8
     2 
     3 import cv2
     4 
     5 """
     6 orb特征检测和匹配
     7     两幅图片分别是 乐队的logo 和包含该logo的专辑封面
     8     利用orb进行检测后进行匹配两幅图片中的logo
     9     
    10 """
    11 # 按照灰度图像的方式读入两幅图片
    12 img1 = cv2.imread("../data/logo1.png", cv2.IMREAD_GRAYSCALE)
    13 img2 = cv2.imread("../data/album1.png", cv2.IMREAD_GRAYSCALE)
    14 
    15 # 创建ORB特征检测器和描述符
    16 orb = cv2.ORB_create()
    17 # 对两幅图像检测特征和描述符
    18 keypoint1, descriptor1 = orb.detectAndCompute(img1, None)
    19 keypoint2, descriptor2 = orb.detectAndCompute(img2, None)
    20 """
    21 keypoint 是一个包含若干点的列表
    22 descriptor 对应每个点的描述符 是一个列表, 每一项都是检测到的特征的局部图像
    23 
    24 检测的结果是关键点
    25 计算的结果是描述符
    26 
    27 可以根据监测点的描述符 来比较检测点的相似之处
    28 
    29 """
    30 # 获得一个暴力匹配器的对象
    31 bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
    32 # 利用匹配器 匹配两个描述符的相近成都
    33 maches = bf.match(descriptor1, descriptor2)
    34 # 按照相近程度 进行排序
    35 maches = sorted(maches, key=lambda x: x.distance)
    36 # 画出匹配项
    37 img3 = cv2.drawMatches(img1, keypoint1, img2, keypoint2, maches[: 30], img2, flags=2)
    38 
    39 cv2.imshow("matches", img3)
    40 cv2.waitKey()
    41 cv2.destroyAllWindows()

     

    knn匹配:

     1 # coding:utf-8
     2 
     3 import cv2
     4 
     5 # 按照灰度图像读入两张图片
     6 img1 = cv2.imread("../data/logo1.png", cv2.IMREAD_GRAYSCALE)
     7 img2 = cv2.imread("../data/album1.png", cv2.IMREAD_GRAYSCALE)
     8 
     9 # 获取特征提取器对象
    10 orb = cv2.ORB_create()
    11 # 检测关键点和特征描述
    12 keypoint1, desc1 = orb.detectAndCompute(img1, None)
    13 keypoint2, desc2 = orb.detectAndCompute(img2, None)
    14 """
    15 keypoint 是关键点的列表
    16 desc 检测到的特征的局部图的列表
    17 """
    18 # 获得knn检测器
    19 bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
    20 matches = bf.knnMatch(desc1, desc2, k=1)
    21 """
    22 knn 匹配可以返回k个最佳的匹配项
    23 bf返回所有的匹配项
    24 """
    25 # 画出匹配结果
    26 img3 = cv2.drawMatchesKnn(img1, keypoint1, img2, keypoint2, matches, img2, flags=2)
    27 cv2.imshow("matches", img3)
    28 cv2.waitKey()
    29 cv2.destroyAllWindows()

     

    FLANN匹配:

     

    # coding:utf-8
    
    import cv2
    
    
    """
    FLANN是类似最近邻的快速匹配库
        它会根据数据本身选择最合适的算法来处理数据
        比其他搜索算法快10倍
    """
    # 按照灰度图片读入
    img1 = cv2.imread("../data/logo1.png", cv2.IMREAD_GRAYSCALE)
    img2 = cv2.imread("../data/album1.png", cv2.IMREAD_GRAYSCALE)
    # 创建sift检测器
    sift = cv2.xfeatures2d.SIFT_create()
    # 查找监测点和匹配符
    kp1, des1 = sift.detectAndCompute(img1, None)
    kp2, des2 = sift.detectAndCompute(img2, None)
    """
    keypoint是检测到的特征点的列表
    descriptor是检测到特征的局部图像的列表
    """
    # 获取flann匹配器
    FLANN_INDEX_KDTREE = 0
    indexParams = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
    searchParams = dict(checks=50)
    flann = cv2.FlannBasedMatcher(indexParams, searchParams)
    # 进行匹配
    matches = flann.knnMatch(des1, des2, k=2)
    # 准备空的掩膜 画好的匹配项
    matchesMask = [[0, 0] for i in range(len(matches))]
    
    for i, (m, n) in enumerate(matches):
        if m.distance < 0.7*n.distance:
            matchesMask[i] = [1, 0]
    
    drawPrams = dict(matchColor=(0, 255, 0),
                     singlePointColor=(255, 0, 0),
                     matchesMask=matchesMask,
                     flags=0)
    # 匹配结果图片
    img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, matches, None, **drawPrams)
    
    
    cv2.imshow("matches", img3)
    cv2.waitKey()
    cv2.destroyAllWindows() 

  • 相关阅读:
    设计模式之策略模式、观察者模式浅析
    axis2_1.6.2之构建web端和客户端
    EJB3之查询
    qpid之简单实例
    ant1.9.4之编译、打包、发布、清理
    四数之和
    电话号码的字母的组合
    最接近的三数之和
    三数之和
    最长公共前缀
  • 原文地址:https://www.cnblogs.com/Lin-Yi/p/9433942.html
Copyright © 2011-2022 走看看