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
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()
.
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]
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
.
copyTo n'alloue pas de nouvelle mémoire dans le tas, ce qui est plus rapide.