我在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的匹配是不同的。我展示了一个匹配的表
此表显示了与CPU和GPU匹配的图像中关键点的位置。
例如,具有x位置的关键点" 22.333189"在帧0中,第1帧中的两个关键点与CPU代码匹配。
但对于GPU代码,它匹配三个不同的关键点。
这样有很多不同之处。由于这种差异,单应性的结果也不同,算法给出不同的结果。这个问题的解决方案是什么?
谢谢
答案 0 :(得分:2)
像在http://answers.opencv.org/question/10745/bfmatcher-implemented-differently-on-gpu/
中所说的那样浮点算术在CPU和GPU上略有不同,而且,它们可以在使用不同库(如IPP或NPP)的相同硬件上有所不同。
最后但并非最不重要的是,GPU的SURF描述符与CPU不同。所以,比赛也会有所不同。