Поведение функции Matlab Interp2 отличается от поведения OpenCV Remap

Я пытаюсь найти эквивалентную функцию OpenCV для interp2, и я ссылаюсь на этот постер, чтобы использовать функцию переназначения в OpenCV.

cv:: remap (в opencv) и interp2 (matlab)

Тем не менее, я понял, что между этими двумя функциями существует значительная разница в выходных данных. Вот мой код Matlab

U = [0.1 0.1 0.1; 0.2 0.2 0.2; 0.3 0.3 0.3];
X = [0 0 0; 0.5 0.5 0.5; 1 1 1];
Y = [0 0.5 1;0 0.5 1;0 0.5 1];
V = interp2(U,X,Y,'linear',NaN)

Я получаю выходную матрицу V как

   NaN       NaN       NaN
   NaN       NaN       NaN
   NaN       NaN    0.1000

Это мой код OpenCV

#include "highgui.h"
#include "cv.h"
using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
    //generate flowmap model
    CvFileStorage* fx = cvOpenFileStorage("result.txt", 0, CV_STORAGE_WRITE);//ask storage for save file
    Mat xmesh = cvCreateMat(3, 3, 5);
    Mat ymesh = cvCreateMat(3, 3, 5);

    for (int i = 0; i < xmesh.rows; i++)
        for (int j = 0; j < xmesh.cols; j++)
        {
            xmesh.at<float>(i, j) = i*0.5;
            ymesh.at<float>(i, j) = j*0.5;
        }

    //generate optical flow folder
    Mat u = cvCreateMat(3, 3, 5);

    for (int i = 0; i <u.rows; i++)
        for (int j = 0; j < u.cols; j++)
        {
            u.at<float>(i, j) = (i + 1)*0.1;
        }
    Mat v = Mat::zeros(u.size(), u.type());

    remap(u, v, xmesh, ymesh, INTER_LINEAR, 0, cvScalarAll(0));

    //convert mat to Iplimage
    IplImage* xmesh_a = cvCloneImage(&(IplImage)xmesh);
    IplImage* ymesh_a = cvCloneImage(&(IplImage)ymesh);
    IplImage* u_a = cvCloneImage(&(IplImage)u);
    IplImage* v_a = cvCloneImage(&(IplImage)v);

    //save end to txt
    cvWrite(fx, "xmesh", xmesh_a, cvAttrList());
    cvWrite(fx, "ymesh", ymesh_a, cvAttrList());
    cvWrite(fx, "u", u_a, cvAttrList());
    cvWrite(fx, "v", v_a, cvAttrList());
    cvReleaseFileStorage(&fx);

    waitKey();

}

Выходная матрица V я получаю

1.00000001e-001, 1.50000006e-001, 2.00000003e-001,
1.00000001e-001, 1.50000006e-001, 2.00000003e-001,
1.00000001e-001, 1.50000006e-001, 2.00000003e-001

Любая помощь будет оценена. Спасибо!

1 ответ

Решение

Разница в результатах связана с разницей в индексировании между C++ и MATLAB, который основан на 0 и 1 соответственно.

interp2(U,X,Y,'linear',NaN) такой же как interp2(1:3,1:3,U,X,Y,'linear',NaN) меняя его на interp2(0:2,0:2,U,X,Y,'linear',NaN) вы получите тот же результат, что и OpenCV.

Если вы хотите результат remap быть таким же, как у interp2 Вы можете сдвинуть xmesh а также ymesh один шаг назад и поиск негативных мест для производства nan ценности.

#include <cmath>
//...
//...
for (int i = 0; i < xmesh.rows; i++)
    for (int j = 0; j < xmesh.cols; j++)
    {
        xmesh.at<float>(i, j) = i*0.5-1;
        ymesh.at<float>(i, j) = j*0.5-1;
    }
//...
//...
remap(u, v, xmesh, ymesh, INTER_LINEAR, 0, cvScalarAll(NAN));

Результат:

nan nan nan 
nan nan nan
nan nan 0.1
Другие вопросы по тегам