8.3. Shi-Tomasi角点探测器&良好的跟踪特性

8.3.1. 目标

在本章中,

  • 我们将学习另一个角检测器:Shi Tomasi角检测器

  • 我们将看到函数: 良好特性跟踪()

8.3.2. 理论

在最后一章中,我们看到了哈里斯角探测器。1994年晚些时候,J.Shi和C.Tomasi在他们的论文中对它做了一个小小的修改 要跟踪的良好功能 与Harris角点检测器相比,该方法具有更好的检测效果。Harris角点检测器的得分函数由下式给出:

\[R=lambda_1lambda_2-k(lambda_1+lambda_2)^2\]

而史托马西却提出:

\[R=min(lambda_1、lambda_2)\]

如果大于阈值,则将其视为角点。如果我们把它放进去 \(\lambda_1 - \lambda_2\) 就像我们在哈里斯角探测器中所做的那样,我们得到的图像如下:

从图上看,只有当 \(\lambda_1\)\(\lambda_2\) 高于最小值, \(\lambda_{{min}}\) ,它是圆锥形的,作为一个角(绿色区域)。

8.3.3. 代码

OpenCV有一个功能, 良好特性跟踪() . 它通过Shi-Tomasi方法(或者Harris角点检测,如果指定的话)在图像中找到N个最强的角点。像往常一样,图像应该是灰度图像。然后指定要查找的角数。然后指定质量级别,该值介于0-1之间,表示每个人都被拒绝的拐角的最小质量。然后给出检测到的角点之间的最小欧氏距离。

利用所有这些信息,函数可以在图像中找到角点。质量等级以下的所有角落均被拒收。然后根据质量按降序对剩余角点进行排序。然后,函数获取第一个最强角点,丢弃最小距离范围内的所有相邻角点,并返回N个最强角点。

在下面的示例中,我们将尝试找到25个最佳角:

>>> import numpy as np
>>> import cv2
>>> from matplotlib import pyplot as plt
>>>
>>> # img = cv2.imread('simple.jpg')
>>> img = cv2.imread('/cvdata/simple.jpg')
>>>
>>> gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
>>>
>>> corners = cv2.goodFeaturesToTrack(gray,25,0.01,10)
>>> corners = np.int0(corners)
>>>
>>> for i in corners:
>>>     x,y = i.ravel()
>>>     cv2.circle(img,(x,y),3,255,-1)
>>>
>>> plt.imshow(img),plt.show()
../_images/sec03-shi-tomasi_1_0.png
(<matplotlib.image.AxesImage at 0x7f3268ded1d0>, None)

结果如下:

此功能更适合跟踪。到时候我们会看到的。

8.3.4. 额外资源

8.3.5. 练习