2013-03-28 24 views

Trả lời

26

Đây là việc thực hiện các chức năng Mat::clone():

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

Vì vậy, như @rotating_image đã đề cập, nếu bạn không cung cấp cho maskcopyTo() chức năng, nó tương tự như clone().

17

Mat::copyTo là khi bạn đã có đích đến cv::Mat (có thể hoặc) đã được phân bổ với kích thước dữ liệu phù hợp. Mat::clone là một sự tiện lợi khi bạn biết bạn phải phân bổ cv::Mat mới.

26

Thực ra, chúng là KHÔNG giống nhau mà không có mặt nạ.

Sự khác biệt chính là khi ma trận đích và ma trận nguồn có cùng loại và kích thước, copyTo sẽ không thay đổi địa chỉ ma trận đích, trong khi clone sẽ luôn phân bổ địa chỉ mới cho ma trận đích.

Điều này quan trọng khi ma trận đích được sao chép bằng toán tử gán bản sao trước copyTo hoặc clone. Ví dụ,

Sử dụng 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; 

Output:

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

Sử dụng 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; 

Output:

[0, 0, 0, 0, 0] 
[1, 1, 1, 1, 1] 
Các vấn đề liên quan