始终获得前 n 个功能 SIFT 和 SURF

问题描述

我希望在 Python 中使用 OpenCV 从图像中精确提取 2000 个筛选特征。由于我有一个版本的 opencv >4.0,这里是要创建的函数

筛选 = cv2.xfeatures2d.SIFT_create(nfeatures = 2000)

但是,有时它可以返回少于 2000 个特征。我注意到还有 2 个参数 - contrastThresholdedgeThreshold。我相信,一旦找到了几个特征,它们就会按分数进行排名,然后挑选出排名靠前的 k 特征。这两个参数中的哪一个对应于分数? (在文档中,它说它们是按本地对比度得分排名的)

例如,考虑以下图像(取自 KITTI 数据集)。

考虑两个变体代码,即不同的对比度阈值。

import cv2
image = cv2.imread('image.png',0)
sift1 = cv2.xfeatures2d.SIFT_create(nfeatures = 2000,contrastThreshold = 0.03)
kp1,desc = sift1.detectAndCompute(image)
print(kp1.shape)
for keyp in kp1[:20]:
   print(keyp.pt)
sift2 = cv2.xfeatures2d.SIFT_create(nfeatures = 2000,contrastThreshold = 0.04)
kp2,desc = sift2.detectAndCompute(image)
print(kp2.shape)
for keyp in kp2[:20]:
   print(keyp.pt)

两者都返回 2000 关键点。但是,它们似乎返回不同的 2000 点,即第一个输出是:

(1026.8912353515625,64.38015747070312)
(918.7639770507812,164.17091369628906)
(918.5908813476562,140.6234130859375)
(6.158419609069824,251.08087158203125)
(6.158419609069824,251.08087158203125)
(918.5908813476562,140.6234130859375)
(918.564453125,68.96025085449219)
(7.603210926055908,245.55197143554688)
(918.7639770507812,164.17091369628906)
(917.8753051757812,159.54928588867188)
(917.5011596679688,366.52783203125)
(917.2555541992188,144.53765869140625)
(917.2555541992188,144.53765869140625)
(916.7557983398438,320.3663635253906)
(10.111774444580078,249.5529022216797)
(10.340370178222656,272.989013671875)
(916.6134643554688,154.4254150390625)
(919.3679809570312,278.5029602050781)
(13.982528686523438,254.0792999267578)
(14.495011329650879,83.46553039550781)

第二个是:

(500.5616455078125,310.6976013183594)
(1235.047119140625,176.89764404296875)
(6.158419609069824,251.08087158203125)
(1234.9166259765625,159.00405883789062)
(800.1644897460938,224.39227294921875)
(1234.746337890625,151.9395294189453)
(1234.152587890625,100.29840850830078)
(800.1644897460938,224.39227294921875)
(1232.6248779296875,118.59815979003906)
(797.6578369140625,75.01687622070312)
(802.0679931640625,200.08023071289062)
(797.5153198242188,215.86810302734375)
(797.2724609375,205.79335021972656)
(803.050048828125,210.93455505371094)
(1232.36669921875,25.46671485900879)
(795.939453125,76.20768737792969)
(14.495011329650879,83.46553039550781)
(795.4041748046875,55.98807144165039)
(803.050048828125,210.93455505371094)

很明显,在调整阈值时发现了不同的关键点。但是,由于我正在执行一致性检查,因此我希望获得相同的 2000 点。我想找出提供的最佳参数,以获得最好的 2000 个功能。简单地阅读了这篇论文,我理解了分数排名,但是有没有办法通过纯粹改变只影响分数的参数来撒下更广泛的网络。

我知道这里发布的问题是模棱两可的,但是,简单地说,最好的参数集是什么,这样我才能得到最好的 2000 关键点,以及如何找出它们。

enter image description here

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)