十.OpenCv 特征点检测和匹配

  • 特征点检测和匹配

    1. 特征检测的基本概念

    特征检测计算机视觉图像处理中的一个概念。它指的是使用计算机提取图像信息,决定每个图像的点是否属于一个图像特征。特征检测的结果是把图像上的点分为不同的子集,这些子集往往属于孤立的点、连续的曲线或者连续的区域。

    特征检测包括边缘检测, 角检测, 区域检测和脊检测.

    特征检测应用场景:

    • 图像搜索, 比如以图搜图

    • 拼图游戏

    • 图像拼接

    以拼图游戏为例来说明特征检测的应用流程.

    • 寻找特征

    • 特征是唯一的

    • 特征是可追踪的

    • 特征是能比较的

      我们发现:

      • 平坦部分很难找到它在原图中的位置
      • 边缘相比平坦要好找一些, 但是也不能一下确定
      • 角点可以一下就找到其在原图中的位置

    图像特征就是值有意义的图像区域, 具有独特性, 易于识别性, 比较角点, 斑点以及高密度区.

    在图像特征中最重要的就是角点. 哪些是角点呢?

    • 灰度梯度的最大值对应的像素
    • 两条线的交点
    • 极值点(一阶导数最大, 二阶导数为0)

    2. Harris角点检测

    Harris角点检测原理

    harris_3.pngharris_4.pngharris_5.pngharris_6.pngharris_7.png

    检测窗口在图像上移动, 上图对应着三种情况:

    • 在平坦区域, 无论向哪个方向移动, 衡量系统变换不大.
    • 边缘区域, 垂直边缘移动时, 衡量系统变换剧烈.
    • 在角点处, 往哪个方向移动, 衡量系统都变化剧烈.
    • cornerHarris(src, blockSize, ksize, k[, dst[, borderType]])
      • blockSize: 检测窗口大小
      • ksize: sobel的卷积核
      • k: 权重系数, 即上面公式中的 α \alpha α , 是个经验值, 一般取0.04~0.06之间.一般默认0.04
    import cv2
    import numpy as np
    
    img = cv2.imread('./chess.png')
    
    # 变成灰度图片
    gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
    # harris角点检测
    dst = cv2.cornerHarris(gray, blockSize=2, ksize=3, k=0.04)
    
    # 返回的东西叫做角点响应. 每一个像素点都能计算出一个角点响应来. 
    # print(dst)
    print(dst.shape)
    # 显示角点
    # 我们认为角点响应大于0.01倍的dst.max()就可以认为是角点了.
    img[dst > 0.01 * dst.max()] = [0, 0, 255]
    cv2.imshow('img', img)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    3. Shi-Tomasi角点检测

    • Shi-Tomasi是Harris角点检测的改进.

    • Harris角点检测计算的稳定性和K有关, 而K是一个经验值, 不太好设定最佳的K值.

    • Shi-Tomasi 发现,角点的稳定性其实和矩阵 M 的较小特征值有关,于是直接用较小的那个特征值作为分数。这样就不用调整k值了。

      • Shi-Tomasi 将分数公式改为如下形式: R = m i n ( λ 1 λ 2 ) R= min(\lambda_1\lambda_2) R=min(λ1λ2)
      • 和 Harris 一样,如果该分数大于设定的阈值,我们就认为它是一个角点。
    • goodFeaturesToTrack(image, maxCorners, qualityLevel, minDistance[, corners[, mask[, blockSize[, useHarrisDetector[, k]]]]])

      • maxCorners: 角点的最大数, 值为0表示无限制
      • qualityLevel: 角点质量, 小于1.0的整数, 一般在0.01-0.1之间.
      • minDistance: 角之间最小欧式距离, 忽略小于此距离的点.
      • mask: 感兴趣的区域.
      • blockSize: 检测窗口大小
      • useHarrisDetector: 是否使用Harris算法.
      • k: 默认是0.04
      import cv2
      import numpy as np
      
      #harris
      # blockSize = 2
      # ksize = 3
      # k = 0.04
      
      #Shi-Tomasi
      maxCorners = 1000
      ql = 0.01
      minDistance = 10
      
      img = cv2.imread('chess.png')
      
      #灰度化
      gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
      
      corners = cv2.goodFeaturesToTrack(gray, maxCorners, ql, minDistance)
      corners = np.int0(corners
  • 2
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV提供了多种特征点检测算法,常用的有以下几种: 1. Shi-Tomasi角点检测 Shi-Tomasi角点检测是一种基于Harris角点检测的改进算法,它在计算角点响应函数时使用了更加准确的公式,因此在一些场景下比Harris角点检测更加准确。 在OpenCV中,可以使用`cv2.goodFeaturesToTrack()`函数进行Shi-Tomasi角点检测,该函数的参数包括: - 输入图像 - 要检测的角点数量 - 角点的最小质量(在计算响应函数时,低于该值的角点将被忽略) - 角点之间的最小距离 2. Harris角点检测 Harris角点检测是一种基于图像梯度的方法,它通过计算每个像素周围的像素点的梯度值,来判断该像素是否为角点。 在OpenCV中,可以使用`cv2.cornerHarris()`函数进行Harris角点检测,该函数的参数包括: - 输入图像 - 角点邻域的大小 - Sobel算子的参数k,一般取值为0.04-0.06 - 角点检测结果的精度参数,一般取值为0.01-0.03 3. SIFT特征点检测 SIFT是一种局部特征描述算法,它可以在图像中检测出一些具有鲁棒性的关键点,并对这些关键点进行描述,从而实现图像匹配等任务。 在OpenCV中,可以使用`cv2.xfeatures2d.SIFT_create()`函数创建SIFT检测器,该函数的参数包括: - SIFT特征点的数量 - SIFT特征点的尺度空间 - SIFT特征点的高斯差分空间 4. SURF特征点检测 SURF是一种基于SIFT算法的改进算法,它通过使用快速Hessian矩阵计算方法,加速了SIFT算法的计算过程,从而实现了更快的特征点检测速度。 在OpenCV中,可以使用`cv2.xfeatures2d.SURF_create()`函数创建SURF检测器,该函数的参数包括: - SURF特征点的数量 - SURF特征点的尺度空间 - SURF特征点的Hessian阈值

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值