gpu :: BFMatcher_GPU и BFMatcher дают разные результаты

Я использую OpenCv 2.4.10 с Cuda 7.0 на VS10

В моем проекте ЦП поиск ключевых точек и сопоставление, как это;

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 одинаковы. Между некоторыми значениями есть разница в 0,000002. Это нормально и почему так происходит?

2) Мой второй и важный вопрос заключается в том, что соответствие CPU и GPU отличается. Я показываю таблицу соответствия

Таблица соответствия

В этой таблице показано положение ключевых точек на изображениях, соответствующих ЦП и ГП.

Например, ключевая точка с положением x «22.333189» в кадре 0 соответствует двум ключевым точкам в кадре 1 для кода ЦП.

Но для кода GPU он соответствует трем различным ключевым точкам.

Таких отличий много. Из-за этих различий результат гомографии также отличается, и алгоритм дает другой результат. Какое решение этой проблемы?

Спасибо


person Community    schedule 05.07.2015    source источник
comment
Несколько лет назад у меня были разные результаты для StereoBM и некоторых алгоритмов каскадного обнаружения (насколько я помню).   -  person victor1234    schedule 05.07.2015
comment
Еще хочу кое-что добавить. Существует не только разница между результатами BruteForceMatcher для CPU и GPU, но также есть разница между результатами двух разных времени выполнения GPU для одного и того же ввода. С другой стороны, для кода процессора такой ситуации не наблюдалось.   -  person    schedule 05.07.2015


Ответы (1)


Как сказано в http://answers.opencv.org/question/10745/bfmatcher-implemented-differently-on-gpu/

Арифметика с плавающей запятой немного отличается на CPU и GPU, и, кроме того, они могут отличаться на одном и том же оборудовании с использованием разных библиотек (например, IPP или NPP).

И последнее, но не менее важное: дескрипторы SURF графического процессора отличаются от дескрипторов CPU. Так что матчи тоже будут отличаться.

person Alejandro Silvestri    schedule 13.10.2015