概要
GFTT(Good Features to Track)
今天我们就来深入探讨一下GFTT的细节
还有其他好的角点探测器,如 FAST、ORB、Harris。
我们说哈里斯直接是Corner Specific。 FAST 是我们最快的,但仅在直角时效果良好。 FAST 的弱点是方向不变量。这时,ORB来帮助我们了。 ORB 使用 FAST 和 Brief。它可以很好地处理从不同角度拍摄的照片。我为所有这些探测器提供了样本输出。
现在,考虑一下我们是否需要查看图像的角落或重要点的时间变化。我的意思是如果我们想随着时间的推移跟踪一些物体。是的,此时 GFTT 来帮助我们了。正如我们所见,每个都有其优点,选择取决于您的具体需求。
现在,让我们深入研究细节。
GFTT 已经与 Harris 方法类似。它会寻找图像中强度发生变化的点。它计算;
1-图像渐变
2-创建自相关矩阵
3-选择标准
4-非极大值抑制
GFTT 与 Harris 的不同之处在于第三步。选择方法略有不同。
GFTT 的运作方式
当然,与其他检测器一样,GFTT 使用数学方法来识别点。它观察像素周围不同方向的强度变化。如果任何方向上的强度发生相当大的变化,GFTT 会将其标记为潜在的关键点。
这是一个简单的Python代码。
import numpy as np
import cv2
import matplotlib.pyplot as plt
def gftt(gray, maxCorners=0, qualityLevel=0.01, minDistance=20,
mask=None, blockSize=3, useHarrisDetector=False, k=0.1):
# Compute GFTT keypoints using the supplied parameters
kps = cv2.goodFeaturesToTrack(gray, maxCorners, qualityLevel,
minDistance, mask=mask, blockSize=blockSize,
useHarrisDetector=useHarrisDetector, k=k)
# Create and return `KeyPoint` objects
return [cv2.KeyPoint(pt[0][0], pt[0][1], 3) for pt in kps]
# Load the image and convert it to grayscale
image = cv2.imread("tmp/edge_detection/skeleton.jpg")
orig = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Detect and draw GFTT keypoints on the image
kps = gftt(gray)
# Loop over the keypoints and draw stars at the corners
for kp in kps:
(x, y) = np.intp(kp.pt) # Replace np.int0 with np.intp
cv2.drawMarker(image, (x, y), (255, 0, 0), markerType=cv2.MARKER_STAR, markerSize=6, thickness=2)
# Print the number of keypoints detected
print("# of keypoints: {}".format(len(kps)))
# Visualize the original image and the GFTT keypoints side by side
plt.figure(figsize=(20, 5))
plt.subplot(121)
plt.imshow(cv2.cvtColor(orig, cv2.COLOR_BGR2RGB))
plt.title('Original Image')
plt.axis('off')
plt.subplot(122)
plt.imshow(image, cmap='gray')
plt.title('GFTT Corners')
plt.axis('off')
plt.show()
为什么“好”功能很重要
好的特征是必不可少的,因为它们为跟踪提供了稳定的点。当您跟踪视频中的运动或尝试匹配图像时,这些特征就像地标一样。
您可以根据需要指定其参数。
kps = cv2.goodFeaturesToTrack(gray, maxCorners, qualityLevel,
minDistance, mask=mask, blockSize=blockSize,
useHarrisDetector=useHarrisDetector, k=k)
所有参数都会影响输出。请小心这些并根据您的要求进行安排。
灰色:将检测 GFTT 关键点的灰度图像。
maxCorners:返回的最大角数。如果设置为 0,则返回所有检测到的角点。
质量级别:拐角的最低可接受质量。值越低,得分越多。
minDistance:返回角点之间的最小可能欧氏距离。
mask:可选的感兴趣区域。如果提供,它指定将检测角点的区域。
blockSize:用于计算 Harris 角点响应的像素邻域的大小。
useHarrisDetector:指示是使用 Harris 角点检测器(True)还是 Shi-Tomasi 角点检测器(False)的标志。
k:这是Harris探测器的自由参数。
此外,有时 GFTT 和 Shi-Tomasi 角点检测器也会被提及。
是的,我们几乎可以说它们是相同的。因为,这两种方法都使用与 Harris 角点检测相同的算法。此外,他们提供了不同的评分功能,并且比哈里斯效果更好。
GFTT 和 Shi-Tomasi 角点检测器之间的主要区别在于选择部分。
Shi-Tomasi 选择值大于阈值的角点。
GFTT:它不是根据阈值选择角点,而是选择具有最高特征值的前 N 个角点。