gpu :: BFMatcher_GPU和BFMatcher给出了不同的结果

时间:2015-07-05 02:22:15

标签: gpu brute-force surf

我在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);

我有两个问题。

1)CPU和GPU的关键点的大多数位置都是相同的。某些值之间存在差异,如0,000002。这是正常的吗?为什么会这样?

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

Matching Table

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

例如,具有x位置的关键点" 22.333189"在帧0中,第1帧中的两个关键点与CPU代码匹配。

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

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

谢谢

1 个答案:

答案 0 :(得分:2)

像在http://answers.opencv.org/question/10745/bfmatcher-implemented-differently-on-gpu/

中所说的那样

浮点算术在CPU和GPU上略有不同,而且,它们可以在使用不同库(如IPP或NPP)的相同硬件上有所不同。

最后但并非最不重要的是,GPU的SURF描述符与CPU不同。所以,比赛也会有所不同。