web-dev-qa-db-fra.com

Quelle est la différence entre Mat :: clone et Mat :: copyTo?

Je sais que 'copyTo' peut gérer un masque. Mais quand le masque n'est pas nécessaire, puis-je utiliser les deux également?

http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-clone

37
yosei

Ceci est l'implémentation de la fonction Mat::clone():

inline Mat Mat::clone() const
{
  Mat m;
  copyTo(m);
  return m;
}

Ainsi, comme @rotating_image l’a mentionné, si vous ne fournissez pas mask pour la fonction copyTo(), c’est la même chose que clone().

28
Safir

En fait, ils sontPASles mêmes, même sans masque.

La principale différence est que lorsque la matrice de destination et la matrice source ont le même type et la même taille, copyTo ne modifie pas l'adresse de la matrice de destination, alors que clone attribue toujours une nouvelle adresse à la matrice de destination.

Cela est important lorsque la matrice de destination est copiée à l'aide de l'opérateur d'attribution de copie avant copyTo ou clone. Par exemple,

Utiliser copyTo:

Mat mat1 = Mat::ones(1, 5, CV_32F);
Mat mat2 = mat1;
Mat mat3 = Mat::zeros(1, 5, CV_32F);
mat3.copyTo(mat1);
cout << mat1 << endl;
cout << mat2 << endl;

Sortie:

[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]

Utiliser clone:

Mat mat1 = Mat::ones(1, 5, CV_32F);
Mat mat2 = mat1;
Mat mat3 = Mat::zeros(1, 5, CV_32F);
mat1 = mat3.clone();
cout << mat1 << endl;
cout << mat2 << endl;

Sortie:

[0, 0, 0, 0, 0]
[1, 1, 1, 1, 1]
46
yangjie

Mat::copyTo est pour lorsque vous avez déjà une destination cv::Mat qui (peut être ou) est déjà alloué avec la bonne taille de données. Mat::clone est pratique lorsque vous savez que vous devez attribuer un nouveau cv::Mat.

19
Timothy Shields

copyTo n'alloue pas de nouvelle mémoire dans le tas, ce qui est plus rapide.

0
Nadav B