OpenCV-Python教程:35.Shi-Tomasi 角点检测和特征跟踪

理论:

在上一节,我们看了Harris角点检测,在1994年,J.Shi 和C.Tomasi 在他们的论文Good Features to Track 里对之作了小修改。比Harris角点检测有更好结果。Harris 角点检测的得分函数:

而Shi-Tomasi提出的:


如果高于阈值的,就被认为是角。如果我们在λ1 - λ2空间里画出来,得到的图像是:

OpenCV-Python教程:35.Shi-Tomasi 角点检测和特征跟踪_第1张图片

从图里可以看到,只有当λ1和λ2高于最小值λ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')
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()

结果:

OpenCV-Python教程:35.Shi-Tomasi 角点检测和特征跟踪_第2张图片

这个函数更适合跟踪。

你可能感兴趣的:(OpenCV-Python教程:35.Shi-Tomasi 角点检测和特征跟踪)