文章目录
  • 概要
  • GFTT 的运作方式
  • 为什么“好”功能很重要


概要

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()
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.

为什么“好”功能很重要

好的特征是必不可少的,因为它们为跟踪提供了稳定的点。当您跟踪视频中的运动或尝试匹配图像时,这些特征就像地标一样。

您可以根据需要指定其参数。

kps = cv2.goodFeaturesToTrack(gray, maxCorners, qualityLevel,
                                   minDistance, mask=mask, blockSize=blockSize,
                                   useHarrisDetector=useHarrisDetector, k=k)
  • 1.
  • 2.
  • 3.

所有参数都会影响输出。请小心这些并根据您的要求进行安排。

灰色:将检测 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 个角点。