2017-10-11 16 views
0

와 비교.matlab에 Interp2 기능이 동작은 다르게 내가 interp2에 대한 동등한 OpenCV의 기능을 찾기 위해 노력하고 내가 OpenCV의에서 다시 매핑 기능을 사용하려면이 포스터를 참조 OpenCV의 다시 매핑

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

그러나, 이들 두 가지 기능의 출력에 상당한 차이가 있음을 알았다. 여기에 내가

NaN  NaN  NaN 
    NaN  NaN  NaN 
    NaN  NaN 0.1000 

로 출력 V 행렬을 얻을 내 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) 

이 내 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 
입니다

도움이 될 것입니다. 감사! 결과의

+0

하지 이런 식으로 함수 호출 :'interp2 (X, Y, U, ...)'? – Irreducible

+0

@Irereducible 답장을 보내 주셔서 감사합니다.하지만 그리드 보간에 아무런 차이가 없다고 생각합니다. 이 포스터 읽기 https://stackoverflow.com/questions/32235379/how-to-do-grid-interpolation-interp2-in-opencv – SimaGuanxing

답변

1

차이는 0으로부터 각각 1 기반 C++과 인덱싱 및 MATLAB 차이에 관한 것이다.

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와 동일한 결과가 나타납니다.

당신이 xmeshymesh 한 단계 뒤로 이동하고 nan 값을 생성하는 음의 위치를 ​​검색 할 수 interp2의 것과 동일하게 remap의 결과를합니다.

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

결과 :`U`는, 데이터를 보유하는 경우

nan nan nan 
nan nan nan 
nan nan 0.1 
+0

고마워! @ rahnema1 OpenCV 코드를 수정하여 Matlab 함수와 동일한 결과를 실현하는 방법을 보여줄 수 있습니까? 감사! – SimaGuanxing

+0

OpenCV 코드를 변경하여 Matlab에서 orignial interp2 함수가하는 것을 실현하려면 현재 그리드 외부에있는 그리드 값을 사용해야합니다. 이 시점에서 NaN을 사용하여 xmesh와 ymesh를 노로 저어 야합니까? Naa를 패닝하려고하지만 OpenCV에서 NaN 값을 할당하는 방법을 모릅니다. – SimaGuanxing

+0

그리드를 한 단계 뒤로 이동해야합니다. 나는 (int j = -1; j '을 포함하고 마지막 매개 변수를 설정한다. 'remap' 함수의'NAN'에 대한 매핑입니다. – rahnema1