目标
在这一章中
- 我们将学习另一个角检测器的知识: Shi-Tomasi角检测器
- 我们将看到函数:cv.goodFeaturesToTrack()
理论
在上一章中,我们看到了哈里斯转角检测器。后来在1994年,J.Shi和C.Tomasi在他们的论文 《Good Features to Track》 中对它做了一个小小的修改,与Harris Corner Detector相比,结果更好。哈里斯拐角检测器中的评分函数是这样给出的:
R
=
λ
1
λ
2
−
k
(
λ
1
+
λ
2
)
2
R=\lambda _1\lambda _2−k\left( \lambda _1+\lambda _2 \right) ^2
R=λ1λ2−k(λ1+λ2)2
与此相反,Shi-Tomasi提出:
R
=
m
i
n
(
λ
1
,
λ
2
)
R=min\left( \lambda _1,\lambda _2 \right)
R=min(λ1,λ2)
如果它大于一个阈值,就被认为是一个角。如果我们像在哈里斯拐角检测器中那样在λ1-λ2空间中绘制它,我们得到的图像如下所示
从图中可以看出,只有当λ1和λ2高于一个最小值λmin时,它才被认为是一个角(绿色区域)。
代码
OpenCV有一个函数,cv.goodFeaturesToTrack()。它通过Shi-Tomasi方法(或者Harris Corner Detection,如果你指定的话)找到图像中最强的角。像往常一样,图像应该是一个灰度图像。然后你指定你想找到的角的数量。然后你指定质量等级,这是一个介于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()
请看下面的结果:
这个函数更适合用于跟踪。我们将在它的时机到来时看到这一点。