Tôi biết 'copyTo' có thể xử lý mặt nạ. Nhưng khi mặt nạ là không cần thiết, tôi có thể sử dụng cả hai bằng nhau?Sự khác nhau giữa Mat :: clone and Mat :: copyTo là gì?
http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-clone
Tôi biết 'copyTo' có thể xử lý mặt nạ. Nhưng khi mặt nạ là không cần thiết, tôi có thể sử dụng cả hai bằng nhau?Sự khác nhau giữa Mat :: clone and Mat :: copyTo là gì?
http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-clone
Đâ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 mask
copyTo()
chức năng, nó tương tự như clone()
.
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.
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]
không có mặt nạ đều giống nhau .. –
Cảm ơn. Tôi nên đọc mã nguồn không chỉ là tài liệu. – yosei