OpenCV Mat dans la fonction return et avec copyTo

J’ai cet extrait pour effectuer l’inverse d’une masortingce homogène

Mat invHom(const Mat A) { Mat invA = Mat::eye(4,4,CV_64FC1); Mat R, P; A(Range(0,3), Range(0,3)).copyTo(R); A(Range(0,3), Range(3,4)).copyTo(P); invA(Range(0,3), Range(0,3)) = Rt(); invA(Range(0,3), Range(3,4)) = -Rt()*P; return invA; } 

ce code a-t-il tendance à se tromper? depuis invA, R, P sont créés dans la scope de la fonction. Le “retour” de la fonction effectue-t-il la création et la copie dans un nouvel object Mat (c’est-à-dire Mat :: copyTo ()) de sorte que la valeur de invA soit toujours disponible en dehors de la fonction?

Désolé pour mon mauvais anglais et termes de programmation

un sans erreur:

 int invHom(const Mat A, Mat& invA_ou) { Mat invA = Mat::eye(4,4,CV_64FC1); Mat R, P; A(Range(0,3), Range(0,3)).copyTo(R); A(Range(0,3), Range(3,4)).copyTo(P); //invA(Range(0,3), Range(0,3)) = Rt(); //invA(Range(0,3), Range(3,4)) = -Rt()*P; Mat tmp1 = Rt(); tmp1.copyTo(invA(Range(0,3), Range(0,3))); Mat tmp = -Rt()*P; tmp.copyTo(invA(Range(0,3), Range(3,4))); invA.copyTo(invA_ou); return 1; } 

Le code est ok. Mat est un object composé essentiellement d’un en-tête et des données réelles. Lorsque vous copiez un Mat vous ne copiez que l’en-tête, pas les données (c’est pourquoi c’est très rapide). Lorsque vous copiez, un compteur de référence interne est incrémenté. Lorsque le compteur de référence est à zéro, les données sont libérées. Pour effectuer une copie en profondeur, vous avez besoin de la méthode clone() ou copyTo(...) .

Donc, dans votre cas, ça va.

Vous pouvez consulter la documentation OpenCV ici pour plus de détails.

Un autre style de codage serait de passer la masortingce de sortie en argument, comme ceci:

 void invHom(const Mat& A, Mat& invA) { invA = Mat::eye(4,4,CV_64FC1); Mat R, P; A(Range(0,3), Range(0,3)).copyTo(R); A(Range(0,3), Range(3,4)).copyTo(P); invA(Range(0,3), Range(0,3)) = Rt(); invA(Range(0,3), Range(3,4)) = -Rt()*P; } 

Notez qu’en passant des références ( & ) à Mat , vous ne copiez même pas l’en-tête.