本章将学习以下内容:
- 学习另一种角点检测器:Shi-Tomasi角点检测器
- 介绍关键函数:
cv2.goodFeaturesToTrack()
理论基础
在上章中,我们学习了 Harris 角点检测器。1994 年,J. Shi 和 C. Tomasi 在其论文《Good Features to Track》中对其进行了小幅改进, 相比 Harris 角点检测器展现了更好的效果。Harris 角点检测器中的评分函数原定义为:
$$R = \lambda_1 \lambda_2 - k(\lambda_1+\lambda_2)^2$$
Shi-Tomasi 提出了改进的评分标准:
$$R = min(\lambda_1, \lambda_2)$$
如果该值大于设定的阈值,则该点被视为角点。 当在 $\lambda_1 - \lambda_2$ 空间中绘制这些值(如同在Harris角点检测器中所做的那样),将得到如下图所示的结果:
从图中可以看出,只有当 $\lambda_1$ 和 $\lambda_2$ 都大于最小值 $\lambda_{min}$ 时,该点才会被视为角点(绿色区域)。
代码实现
OpenCV提供了 cv2.goodFeaturesToTrack()
函数,该函数通过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('/data/cvdata/simple.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
corners = cv2.goodFeaturesToTrack(gray,25,0.01,10)
corners = np.int_(corners)
for i in corners:
x,y = i.ravel()
cv2.circle(img,(x,y),3,255,-1)
plt.imshow(img),plt.show()
(<matplotlib.image.AxesImage at 0x7fb5acd4e6f0>, None)
结果如下图所示:
该函数更适用于目标跟踪应用,我们将在后续相关章节中具体探讨其使用场景。