2017-10-11 3 views
0

Ich versuche, nach einer äquivalenten OpenCV-Funktion für interp2 zu suchen, und ich beziehe mich auf dieses Plakat, um Remap-Funktion in OpenCV zu verwenden.Matlab Interp2 Funktionsverhalten anders verglichen mit OpenCV Remap

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

jedoch erkannte ich, dass es einen signifikanten Unterschied der Ausgabe zwischen diesen beiden Funktionen ist. Hier ist mein 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) 

ich die Ausgabe V Matrix als

NaN  NaN  NaN 
    NaN  NaN  NaN 
    NaN  NaN 0.1000 

bekommen Dies ist mein 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(); 

} 

Der Ausgang V Matrix I erhalten ist

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 

Jede Hilfe wird geschätzt. Vielen Dank!

+0

Im Fall, dass 'U' Ihre Daten enthält, ist nicht die Funktion Aufruf wie folgt:' interp2 (X, Y, U, ...) '? – Irreducible

+0

@Ireducible Danke für die Antwort, aber ich denke, dass es für die Gitterinterpolation keinen Unterschied macht. Lesen Sie dieses Poster https://stackoverflow.com/questions/32235379/how-to-do-grid-interpolation-interp2-in-opencv – SimaGuanxing

Antwort

1

Der Unterschied in den Ergebnissen bezieht sich auf Unterschiede in der Indizierung zwischen C++ und MATLAB, die 0-basiert bzw. 1-basiert sind.

interp2(U,X,Y,'linear',NaN) ist das gleiche wie interp2(1:3,1:3,U,X,Y,'linear',NaN) es zu interp2(0:2,0:2,U,X,Y,'linear',NaN) ändern, erhalten Sie das gleiche Ergebnis wie OpenCV.

Wenn Sie remap führen wollen das gleiche sein wie die von interp2 Sie den xmesh und ymesh ein Schritt nan Werte erzeugen zurück und der Suche nach negativen Standorten verschieben können.

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

Ergebnis:

nan nan nan 
nan nan nan 
nan nan 0.1 
+0

Vielen Dank! @ rahnema1 Kannst du mir zeigen, wie man OpenCV-Code verändert, um dasselbe Ergebnis im Vergleich zur Matlab-Funktion zu erzielen? Vielen Dank! – SimaGuanxing

+0

Ich meine, wenn ich OpenCV-Code ändern möchte, um zu erkennen, was die Orginial-Interp2-Funktion in Matlab tut, muss ich einen Rasterwert verwenden, der außerhalb meines aktuellen Rasters liegt, oder? Muss ich meine xmesh und ymesh mit NaN an dieser Stelle paddeln? Ich versuche, NaA zu paddeln, weiß aber nicht, wie man einen NaN-Wert in OpenCV anweist. – SimaGuanxing

+0

Sie müssen das Raster um einen Schritt zurück verschieben. Ich meine '' (int i = -1; ich ' ein und setze den letzten Parameter der 'remap' Funktion zu' NAN'. – rahnema1