2017-10-11 2 views
0

J'essaie de trouver une fonction OpenCV équivalente pour interp2 et je me réfère à cette affiche pour utiliser la fonction de remappage dans OpenCV.Le comportement de la fonction Matlab Interp2 différemment par rapport à OpenCV Remap

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

Cependant, je me suis aperçu qu'il ya une différence significative de la production entre ces deux fonctions. Voici mon code 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) 

Je reçois la matrice sortie V comme

NaN  NaN  NaN 
    NaN  NaN  NaN 
    NaN  NaN 0.1000 

Ceci est mon code 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(); 

} 

La matrice de sortie V que je reçois est

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 

Toute aide sera appréciée. Merci!

+0

Dans le cas où 'U' détient vos données, ne sont pas l'appel de fonction comme ceci:' interp2 (X, Y, U, ...) '? – Irreducible

+0

@Irreducible Merci pour la réponse, mais je pense que cela ne fait aucune différence pour l'interpolation de la grille. Lire cette affiche https://stackoverflow.com/questions/32235379/how-to-do-grid-interpolation-interp2-in-opencv – SimaGuanxing

Répondre

1

La différence dans les résultats est liée à la différence d'indexation entre C++ et MATLAB qui est 0 et 1 respectivement.

interp2(U,X,Y,'linear',NaN) est le même que interp2(1:3,1:3,U,X,Y,'linear',NaN) en le changeant en interp2(0:2,0:2,U,X,Y,'linear',NaN) vous obtiendrez le même résultat que OpenCV.

Si vous voulez résultat de remap être le même que celui de interp2 vous pouvez déplacer le xmesh et ymesh un pas en arrière et rechercher des lieux négatifs pour produire des valeurs 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)); 

Résultat:

nan nan nan 
nan nan nan 
nan nan 0.1 
+0

Merci! @ rahnema1 Pouvez-vous me montrer comment modifier le code OpenCV pour réaliser le même résultat par rapport à la fonction Matlab? Merci! – SimaGuanxing

+0

Je veux dire, si je veux changer le code OpenCV pour réaliser ce que fait la fonction orignial interp2 dans Matlab, je dois utiliser une valeur de grille qui est en dehors de ma grille actuelle, n'est-ce pas? Est-ce que j'ai besoin de pagayer mon xmesh et ymesh en utilisant NaN à ce stade? J'essaye de pagayer NaA mais je ne sais pas comment assigner une valeur de NaN dans OpenCV. – SimaGuanxing

+0

Vous devez déplacer la grille d'un pas en arrière. Je veux dire 'pour (int i = -1; i ' et régler le dernier paramètre de la fonction 'remap' à' NAN'. – rahnema1