【问题标题】:gpu::BFMatcher_GPU and BFMatcher gives Different Resultgpu::BFMatcher_GPU 和 BFMatcher 给出不同的结果
【发布时间】:2015-07-05 02:22:15
【问题描述】:

我在 VS10 上使用 OpenCv 2.4.10 和 Cuda 7.0

在我的CPU项目中,像这样找到关键点并匹配;

detector = new cv::SURF(150,3);
descriptorExtractor = cv::DescriptorExtractor::create("SURF");

detector->detect(gry0,keypoints0);
descriptorExtractor->compute(gry0, keypoints0, descriptor0); 

detector->detect(gry1,keypoints1);
descriptorExtractor->compute(gry1, keypoints1, descriptor1); 

cv::BFMatcher matcher(cv::NORM_L2); 

matcher.match(descriptor1, descriptor0, matches);

在 GPU 中;

cv::gpu::SURF_GPU surf(150,3);

surf(gpumatFrameGray0, cv::gpu::GpuMat(), keypoints0GPU, descriptors0GPU);
surf(gpumatFrameGray0, cv::gpu::GpuMat(), keypoints1GPU, descriptors1GPU);

surf.downloadKeypoints(keypoints0GPU,keypoints0);
surf.downloadKeypoints(keypoints0GPU,keypoints1);

cv::gpu::BFMatcher_GPU matcher(cv::NORM_L2);

matcher.matchSingle(descriptors1GPU, descriptors0GPU, trainIdx, distance);

matcher.matchDownload(trainIdx, distance, matches);

我有 2 个问题。

1) CPU 和 GPU 的 Keypoints 的大部分位置是相同的。某些值之间存在 0,000002 之类的差异。这是正常的吗?为什么会这样?

2) 我的第二个重要问题是 CPU 和 GPU 的匹配是不同的。我显示一个匹配表

此表显示了与 CPU 和 GPU 匹配的图像中关键点的位置。

例如,第 0 帧中 x 位置为“22.333189”的关键点与 CPU 代码中第 1 帧中的两个关键点匹配。

但对于 GPU 代码,它匹配三个不同的关键点。

这样的区别很多。由于这种差异,单应性的结果也不同,算法给出的结果也不同。这个问题的解决方法是什么?

谢谢

【问题讨论】:

  • 几年前我对StereoBM 和一些级联检测算法(只要我记得)得到了不同的结果。
  • 我还想补充一点。不仅 CPU 和 GPU 的 BruteForceMatcher 的结果存在差异,而且相同输入的 GPU 的两个不同运行时的结果也存在差异。另一方面,在 CPU 代码中没有观察到这样的情况。

标签: gpu brute-force surf


【解决方案1】:

就像http://answers.opencv.org/question/10745/bfmatcher-implemented-differently-on-gpu/中所说的那样

浮点运算在 CPU 和 GPU 上略有不同,此外,它们在使用不同库(如 IPP 或 NPP)的相同硬件上可能有所不同。

最后但同样重要的是,GPU 的 SURF 描述符与 CPU 的不同。所以,匹配也会有所不同。

【讨论】:

    猜你喜欢
    • 2021-12-19
    • 2014-01-28
    • 2015-07-24
    • 2022-12-29
    • 2012-07-12
    • 2021-09-25
    • 2023-03-30
    • 1970-01-01
    • 2011-04-03
    相关资源
    最近更新 更多