OpenCV 4.11.0
开源计算机视觉
|
在本章中,
在上一章中,我们看到了 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)\]
如果它大于阈值,则将其视为角点。如果像在 Harris 角点检测器中那样在 \(\lambda_1 - \lambda_2\) 空间中绘制它,我们将得到如下所示的图像:
从图中可以看出,只有当 \(\lambda_1\) 和 \(\lambda_2\) 都高于最小值 \(\lambda_{\min}\) 时,才将其视为角点(绿色区域)。
OpenCV 有一个函数,cv.goodFeaturesToTrack()。它使用 Shi-Tomasi 方法(或者如果您指定,则使用 Harris 角点检测)查找图像中 N 个最强的角点。像往常一样,图像应该是灰度图像。然后,您指定要查找的角点数。然后,您指定质量级别,这是一个介于 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()
void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0, AlgorithmHint hint=cv::ALGO_HINT_DEFAULT)
void circle(InputOutputArray img, Point center, int radius, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0)
void goodFeaturesToTrack(InputArray image, OutputArray corners, int maxCorners, double qualityLevel, double minDistance, InputArray mask=noArray(), int blockSize=3, bool useHarrisDetector=false, double k=0.04)
请参见下面的结果
此函数更适用于跟踪。我们将在时机成熟时看到这一点。