2013-03-28 3 views

Antwort

26

Dies ist die Implementierung von Mat::clone() Funktion:

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

So, wie @rotating_image erwähnt hatte, wenn Sie als clone() nicht mask für copyTo() Funktion zur Verfügung stellen, dann ist es gleich.

17

Mat::copyTo ist für, wenn Sie bereits ein Ziel cv::Mat haben, dass (möglicherweise sein oder) bereits mit der richtigen Datengröße zugewiesen ist. Mat::clone ist ein Komfort für, wenn Sie wissen, dass Sie eine neue cv::Mat zuweisen müssen.

26

Eigentlich sind sie NICHT das gleiche auch ohne Maske.

Der Hauptunterschied besteht darin, dass copyTo, wenn die Zielmatrix und die Quellmatrix denselben Typ und dieselbe Größe haben, die Adresse der Zielmatrix nicht ändert, während clone immer eine neue Adresse für die Zielmatrix zuweist.

Dies ist wichtig, wenn die Zielmatrix mit dem Kopierzuweisungsoperator vor copyTo oder clone kopiert wird. Zum Beispiel

Mit 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; 

Ausgang:

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

Mit 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; 

Ausgang:

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