Matlab Interp2 function behaviour differently comp

2019-08-18 04:04发布

问题:

I am trying to look for an equivalent OpenCV function for interp2 and I refer to this poster to use remap function in OpenCV.

cv::remap (in opencv) and interp2 (matlab)

However, I realized that there is a significant difference of the output between these two functions. Here is my Matlab Code

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)

I get the output V matrix as

   NaN       NaN       NaN
   NaN       NaN       NaN
   NaN       NaN    0.1000

This is my OpenCV code

#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();

}

The output V matrix I get is

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

Any help will be appreciated. Thanks!

回答1:

The difference in the results is related to difference in indexing between c++ and MATLAB that is 0-based and 1-based respectively.

interp2(U,X,Y,'linear',NaN) is the same as interp2(1:3,1:3,U,X,Y,'linear',NaN) changing it to interp2(0:2,0:2,U,X,Y,'linear',NaN) you will get the same result as OpenCV.

If you want result of remap to be the same as that of interp2 you can shift the xmesh and ymesh one step back and search for negative locations to produce nan values.

#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));

Result:

nan nan nan 
nan nan nan
nan nan 0.1


标签: matlab remap