【发布时间】: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