⚠️由于自己的拖延症,3.4.3翻到一半,OpenCV发布了4.0.1了正式版,所以接下来是按照4.0.1翻译的。
⚠️除了版本之外,其他还是照旧,Shi-Tomasi Corner Detector & Good Features to Track,附原文。
目标
在本章
- 我们将会学到另外一个角点检测算法:史-托马斯角点检测
- 我们会用到这个函数:cv.goodFeaturesToTrack()
理论
在上一章,我们见到了哈里斯角点检测算法。后来在1994年,J. Shi 和 C. Tomasi 在他们的论文 Good Features to Track 里为这个算法做了一个小改动,其结果显示角点检测的效果比哈里斯角点检测算法要好。在哈里斯角点检测算法中的个计分函数(译者注:在很多文献里这个函数也被称为角点响应函数)是:
取而代之,史和托马斯推荐使用:
如果它(R值)比阈值更大,它就被认为是一个角。如果我们把它画在λ1−λ2空间里,就好像我们在哈里斯角点检测算法中做过的那样,我们就会得到一张图像如下:
从这个计算,你可以看到只有当 λ1 和 λ2 都大于一个最小阈值λmin的时候,它才会被认为是一个角点。(绿色区域)。
编码
OpenCV 有一个函数,cv.goodFeaturesToTrack() (译者注:这个函数名是以他们的论文来命名的)。它按照史-托马斯的方法(或者哈里斯的算法,如果你给参数指定的话),在图像中找出N个最强的(译者注:就是R值最大)的角点。和平常一样,图像应该是灰度图像。然后你指定你想要找出的角点数量。然后是指定质量级别,这个值应该是0-1,它表示最小的角点质量,在此之下的点一律认为非角点。最后我们提供检测到的角之间的最小欧氏距离。
有了所有的这些信息,函数可以找出图像中的角点。所有低于质量标准的疑似角点都将被认为非角点。然后,它根据质量按降序对剩下的角进行降序排序。然后函数取第一个最强的角,丢弃最小距离范围内的所有相邻角,返回N个最强的角。
在下面的例子中,我们将尝试找到25个最好的角点:
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()
看以下的结果:
这个函数更适合跟踪物体。到时候我们将会看到的。
额外资源
练习
上篇:【翻译:OpenCV-Python教程】哈里斯角点检测
下篇:【翻译:OpenCV-Python教程】SIFT(Scale-Invariant Feature Transform) 介绍