2015-07-05 5 views
0

Я использую OpenCV 2.4.10 с Cuda 7.0 на VS10:: BFMatcher_GPU GPU и BFMatcher дает другой результат

В моем проекте 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) Большинство местоположений Keypoints для CPU и GPU одинаковы. Между некоторыми значениями существует разница, например 0,000002. Это нормально и почему это происходит?

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

Matching Table

Эта таблица показывает положение ключевых точек в изображениях, которые соответствовали для CPU и GPU.

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

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

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

Спасибо

+0

Несколько лет назад у меня были разные результаты для 'StereoBM' и некоторых алгоритмов обнаружения каскадов (пока я помню). – victor1234

+0

Также хочу что-то добавить. Не только есть разница между результатом BruteForceMatcher для CPU и GPU, но также существует разница между настройками двух разных графиков времени исполнения для одного входа. С другой стороны, подобная ситуация не наблюдалась для кода ЦП. – user3508563

ответ

0

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^