计算机视觉(角点检测)- 2 - Shi-Tomasi 角点检测

计算机视觉(角点检测)- 2 - Shi-Tomasi 角点检测

  • 学习前言
  • 一、Shi-Tomasi 角点检测
  • 二、OpenCV中API介绍
    •    ```corners = cv2.goodFeaturesToTrack(image, maxCorners, qualityLevel, minDistance[, corners[, mask[, blockSize[, useHarrisDetector[, k]]]]])```
  • 三、代码&效果图

学习前言

  关于角点检测呢,就是检测图像中角点的算法,常见的有四种常见的算法:Moravec角点检测算法、 Harris角点检测算法.、Shi-Tomasi 算法、FAST角点检测算法.,不过常用的就两种吧——Harris角点检测算法、FAST角点检测算法spm=1001.2014.3001.5501
计算机视觉(角点检测)- 2 - Shi-Tomasi 角点检测_第1张图片

一、Shi-Tomasi 角点检测

  Shi-Tomasi 角点检测算法其实是建立在Harris角点检测算法的基础上的,可以说是Harris角点检测算法的升级版
   Harris角点检测算法.不太熟悉的可以点进去看看,这篇文章就不再介绍Harris角点检测算法的内容了。


  进入正题,Shi-Tomasi 角点检测算法是在Harris角点检测算法提出后,由国外的一位大佬在论文《Good_Features_to_Track》中提出了它的改进版——Shi-Tomasi 角点检测算法Shi-Tomasi 方法在很多情况下可以得到比 Harris 算法更好的结果。


  通过学习Harris角点检测算法,我们知道Harris角点检测算法引入角点响应值R,根据R值的大小来判断是否存在角点和边界。

计算机视觉(角点检测)- 2 - Shi-Tomasi 角点检测_第2张图片
  Shi-Tomasi 角点检测算法就是针对R值的计算公式进行了优化和修改。由于 Harris角点检测算法的稳定性和 α α α 值有关,而 α α α 是个经验值,需要我们根据自身经验去设置,不好设定最佳值。
  Shi-Tomasi发现,角点的稳定性其实和矩阵 M 的较小特征值有关(即 λ 1 , λ 2 λ_1,λ_2 λ1λ2),于是直接用较小的那个特征值作为分数。这样就不用调整 α α α 值了。

  所以 Shi-Tomasi 将R值的计算公式改为如下形式:
R = m i n ( λ 1 , λ 2 ) R=min(λ_1,λ_2) R=min(λ1λ2)
  和 Harris 一样,如果该分数大于设定的阈值,我们就认为它是一个角点。计算机视觉(角点检测)- 2 - Shi-Tomasi 角点检测_第3张图片

二、OpenCV中API介绍

   corners = cv2.goodFeaturesToTrack(image, maxCorners, qualityLevel, minDistance[, corners[, mask[, blockSize[, useHarrisDetector[, k]]]]])

    API功能:该功能可以找到图像中或指定图像区域中最突出的角

    参数:
      src: 输入8位或浮点32位单通道图像。
      maxCorners:返回的最大角数。如果角落多于找到的角落,则返回最强的角落。maxCorners <= 0表示没有设置最大值限制,并且返回了所有检测到的角。
      qualityLevel:该参数表征图像角的最低可接受质量。参数值乘以最佳角质量度量,即最小特征值。指标小于产品指标的边角将被拒收。例如,如果最佳角的质量度量为1500,而qualityLevel = 0.01,则拒绝质量度量小于15的所有角。(推荐值:0.01)
      minDistance:返回的角之间的最小可能欧几里得距离。(推荐值:10)
      mask:可选的感兴趣区域。如果图像不为空(它的类型必须为CV_8UC1且大小与image相同),则它指定检测到拐角的区域。
      blockSize:用于计算每个像素邻域上的导数协方差矩阵的平均块的大小。
      useHarrisDetector: 是否使用Harris检测器(False表示使用)。
      k:Harris角点检测的 α α α 值。
    返回:
      corners:检测到的角的输出向量。

  如果使用参数qualityLevel的不同值A和B以及A> B调用函数,则返回带有qualityLevel = A的角的向量将是带有qualityLevel = B的输出向量的前缀。


三、代码&效果图

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('blox.jpg')
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
corners = cv.goodFeaturesToTrack(gray,25,0.01,10)
corners = np.int0(corners)
for i in corners:
    x,y = i.ravel()
    cv.circle(img,(x,y),3,255,-1)
plt.imshow(img),plt.show()

计算机视觉(角点检测)- 2 - Shi-Tomasi 角点检测_第4张图片

你可能感兴趣的:(计算机视觉,计算机视觉,opencv)