OpenCV ORB 检测器发现的关键点很少

Posted

技术标签:

【中文标题】OpenCV ORB 检测器发现的关键点很少【英文标题】:OpenCV ORB detector finds very few keypoints 【发布时间】:2015-12-18 13:53:36 【问题描述】:

我正在尝试使用 ORB 关键点检测器,它返回的点似乎比 SIFT 检测器和 FAST 检测器少得多。

此图显示了 ORB 检测器发现的关键点:

这张图显示了 SIFT 检测阶段发现的关键点(FAST 返回的点数相似)。

只有这么少的点会导致跨图像的特征匹配结果非常差。我现在只是对 ORB 的检测阶段感到好奇,因为这似乎我得到了不正确的结果。我已经尝试使用 ORB 检测器和默认参数以及下面详述的自定义参数。

为什么会有这么大的差异?

代码:

orb = cv2.ORB_create(edgeThreshold=15, patchSize=31, nlevels=8, fastThreshold=20, scaleFactor=1.2, WTA_K=2,scoreType=cv2.ORB_HARRIS_SCORE, firstLevel=0, nfeatures=500)
#orb = cv2.ORB_create()
kp2 = orb.detect(img2)
img2_kp = cv2.drawKeypoints(img2, kp2, None, color=(0,255,0), \
        flags=cv2.DrawMatchesFlags_DEFAULT)

plt.figure()
plt.imshow(img2_kp)
plt.show()

【问题讨论】:

降低门槛就行了。 我不认为这是问题所在。我已尝试降低这两个阈值,但检测到的关键点数量并没有显着差异。 嗯。 scoreType=cv2.ORB_HARRIS_SCORE -> FAST_SCORE 怎么样?作为一个offtop,我可以推荐尝试AKAZE检测器/描述符——它既快速又健壮。 【参考方案1】:

增加 n 个特征 会增加检测到的角点的数量。关键点提取器的类型似乎无关紧要。我不确定如何将此参数传递给 FAST 或 Harris,但它似乎可以工作。

orb = cv2.ORB_create(scoreType=cv2.ORB_FAST_SCORE)

orb = cv2.ORB_create(nfeatures=100000, scoreType=cv2.ORB_FAST_SCORE)

【讨论】:

【参考方案2】:

虽然这个帖子很老了,但我希望这可以帮助有同样问题的人:

我不确定如何将此参数传递给 FAST 或 Harris,但它似乎可以工作。

Rublee 等人很好地解释了这一点。在他们的论文“ORB:SIFT 或 SURF 的有效替代方案”中。由于我认为无法更好地解释它,这里直接引用“2011 International Conference on 计算机视觉”:

FAST 不会产生角落的度量,我们 已经发现它沿边缘有很大的响应。我们雇用 哈里斯角测量 [11] 来排序 FAST 关键点。 对于目标数量 N 个关键点,我们首先设置 阈值足够低以获得超过 N 个关键点,然后 根据哈里斯度量对它们进行排序,然后选择 前 N 个点。

【讨论】:

以上是关于OpenCV ORB 检测器发现的关键点很少的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 例程 300篇246. 特征检测之ORB算法

ORB 未检测 opencv 2.4.9 中的关键点

使用 OpenCV Cuda ORB 特征检测器

Python中opencv2 ORB数据结构的深拷贝

使用ORB在OpenCV中生成密集视差图

OpenCV ORB 特征检测器如何工作?