Ответ 1
Это реализация функции Mat::clone()
:
inline Mat Mat::clone() const
{
Mat m;
copyTo(m);
return m;
}
Итак, как уже упоминал @rotating_image, если вы не предоставляете mask
для функции copyTo()
, это также как clone()
.
Я знаю, что "copyTo" может обрабатывать маску. Но когда маска не нужна, могу ли я использовать оба одинаково?
http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-clone
Это реализация функции Mat::clone()
:
inline Mat Mat::clone() const
{
Mat m;
copyTo(m);
return m;
}
Итак, как уже упоминал @rotating_image, если вы не предоставляете mask
для функции copyTo()
, это также как clone()
.
На самом деле они НЕ одинаково даже без маски.
Основное различие заключается в том, что когда матрица адресата и исходная матрица имеют один и тот же тип и размер, copyTo
не изменит адрес целевой матрицы, а clone
всегда будет выделять новый адрес для целевой матрицы.
Это важно, когда матрица назначения копируется с использованием оператора присваивания копий до copyTo
или clone
. Например,
Использование 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;
Вывод:
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
Использование 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;
Вывод:
[0, 0, 0, 0, 0]
[1, 1, 1, 1, 1]
Mat::copyTo
относится к тому, когда у вас уже есть пункт назначения cv::Mat
, который (может быть или) уже назначен с правильным размером данных. Mat::clone
- это удобство, когда вы знаете, что вам нужно выделить новый cv::Mat
.
copyTo не выделяет новую память в куче, что быстрее.