gpt4 book ai didi

c++ - 在具有相同输入的两个不同运行时上使用 BruteForceMatcher 的 OpenCV 不同输出结果

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:39:37 26 4
gpt4 key购买 nike

简介:首先,作为介绍,我非常“自豪”地在 StackOverflow 上提出我的第一个问题。我希望我能够帮助其他人,就像他们帮助我一样。

上下文:我正在开发一个使用 SURF 算法搜索图像特征的应用程序。我计算关键点并使用 SURF 提取描述符。然后,我使用基于欧氏距离的强力匹配器来匹配图像 1 和图像 2 的描述符。这就是问题所在,我在 2 次不同的程序运行中没有得到相同的结果(使用相同的图像,我应该精确 :p)。

输出:这是输出,

第 20 个第 3620 个匹配项的第一个运行时间

0:  0   89  0.292352
1: 1 997 0.186256
2: 2 1531 0.25669
3: 3 2761 0.24148
4: 4 2116 0.286187
5: 5 2996 0.201048
6: 6 3109 0.266272
7: 7 2537 0.17112
8: 8 2743 0.211974
9: 9 2880 0.208735
10: 10 2167 0.269716
11: 11 2431 0.164508
12: 12 1474 0.281442
13: 13 1867 0.161129
14: 14 329 0.18388
15: 15 1580 0.229825
16: 16 1275 0.254946
17: 17 1749 0.203006
18: 18 305 0.221724
19: 19 1501 0.224663
20: 20 917 0.20708

在 3620 个中的第 20 个匹配项上进行第二次运行

0:  0   1455    0.25669
1: 1 963 0.186256
2: 2 3008 0.150252
3: 3 2936 0.24148
4: 4 2172 0.286187
5: 5 2708 0.211974
6: 6 730 0.185199
7: 7 3128 0.266272
8: 8 750 0.181001
9: 9 2272 0.17112
10: 10 2842 0.208735
11: 11 55 0.229677
12: 12 2430 0.269716
13: 13 2360 0.164508
14: 14 1497 0.229825
15: 15 2443 0.254148
16: 16 1784 0.161129
17: 17 1209 0.254946
18: 18 311 0.18388
19: 19 944 0.228939
20: 20 533 0.221724

代码:这是我使用的部分代码

SurfFeatureDetector detector(400);
vector<KeyPoint> keypoints1, keypoints2;
detector.detect(img1, keypoints1);
detector.detect(img2, keypoints2);

SurfDescriptorExtractor extractor;
Mat descriptors1, descriptors2;
extractor.compute(img1, keypoints1, descriptors1);
extractor.compute(img2, keypoints2, descriptors2);

vector<DMatch> filteredMatches;
matching(descriptors1,descriptors2,filteredMatches,1);

这里是匹配函数

void crossCheckMatching( const Mat& descriptors1, const Mat& descriptors2,
vector<DMatch>& filteredMatches12, int knn=1 )
{
BruteForceMatcher<L2<float>> matcher;
filteredMatches12.clear();
vector<vector<DMatch> > matches12, matches21;

matcher.knnMatch( descriptors1, descriptors2, matches12, knn );
matcher.knnMatch( descriptors2, descriptors1, matches21, knn );

debug_writeMatches("D:/jmartel/exec2-log.txt",matches12);
...
}

结论: SURF 算法给出了“真实”的输出,部分证明了在 2 个运行时使用相同的 2 个图像检测到相同数量的关键点。 BruteForceMatcher 给了我非常奇怪的输出,日志文件证明了这一点,我可以输出的图像清楚地表明它在两个运行时中以相同的方式不匹配。

我也在 GPU 上实现了所有这些代码,我的观察结果相似。然而,SURF 在 GPU 上提供了更多的点(具有相同的参数)。

如果我们仔细观察点,一些距离完全相似,这可能是可能的但很奇怪(即使 2 组点之间的描述符可以相等......)。就是夫妻的榜样

  (runtime 1) 1: 1 997 0.186256
/ (runtime 2) 1:1 963 0.186256

甚至是陌生人

  (runtime 1) 14: 14  329 0.18388
/ (runtime 2) 18: 18 311 0.18388

从我读到的内容来看,OpenCV2.0 文档没有说任何特别有趣的内容。 See BruteForceMatcher C++ Documentation for OpenCV2.1 here

如果您有任何解释,或者我可以在代码中更改任何内容,我将很高兴。感谢您的帮助。

朱利安

最佳答案

你能检查一下特征的顺序吗?如果您有多个 CPU,代码可能会并行运行,因此功能的顺序不会相同(每次)。

关于c++ - 在具有相同输入的两个不同运行时上使用 BruteForceMatcher 的 OpenCV 不同输出结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6573146/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com