问题
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
来源:https://stackoverflow.com/questions/46692060/matlab-interp2-function-behaviour-differently-compared-with-opencv-remap