2015-08-18 11 views
2

Я пытаюсь сделать кросс-корреляцию в C++. Проблема в том, что я не получаю такой же результат в Matlab.Перекрестная корреляция C++ и matlab

C++ код

float telo[5] = {-1, 0, 1, 2, 3}; 
Mat prueba(1, 5, CV_32F, telo); 
float telo2[3] = { 0, 1, 2 }; 
Mat prueba2(1, 3, CV_32F, telo2); 
Mat result; 
matchTemplate(prueba, prueba2, result, CV_TM_CCORR); 
Result: 2048.0004882812500 2.660783784765e-314#DEN -6.2774385622041925e+066 

код Matlab:

a = [-1,0,1,2,3] 
b = [0,1,2] 
xcorr2(a,b) 
Result: -2 -1 2 5 8 3 0 

Что я делаю неправильно?

ответ

2

Когда я попытать C++ образец кода с OpenCV 3 я получаю следующий результат, как и ожидалось:

2, 5, 8 

Что такое же, как решение Matlab, но без хвостов.


Edit:

Для получения такого же результата, как с Matlab вы можете добавить некоторые дополнения нулей для входных данных. Делайте это вручную в ваших данных:

float telo[9] = {0, 0, -1, 0, 1, 2, 3, 0, 0}; 
Mat prueba(1, 9, CV_32F, telo); 

Или более общее решение (которое также должно работать с 2D-данных) было бы назвать

copyMakeBorder(prueba, prueba, prueba2.rows - 1, prueba2.rows - 1, prueba2.cols - 1, prueba2.cols - 1, cv::BORDER_CONSTANT); 

перед тем matchTemplate.

+0

Благодарим вас за ответ. Я использую opencv 2.49, так есть неправильная реализация или почему вывод отличается? Есть ли способ получить точно такой же результат, что и matlab (с головкой и хвостом последовательности)? – Krivers

+1

Я не знаю, почему вы видите разные результаты. Вы пытались точно указать код, который вы опубликовали, или это упрощенный пример? Я обновил свой ответ, чтобы объяснить, как получить также хвосты. –

+0

Я скопировал точно такой же исходный код из моей основной функции и вставил его здесь. Есть ли правило, сколько нулей я должен использовать? Потому что Matlab делает прокладку самостоятельно. – Krivers

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

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