Я пытаюсь сделать взаимную корреляцию в 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
Что я делаю неправильно?
Когда я пробую ваш пример кода C ++ с OpenCV 3, я получаю следующий результат, как и ожидалось:
2, 5, 8
Который такой же, как решение Matlab, но без хвостов.
Редактировать:
Чтобы получить тот же результат, что и в 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
,