В чем разница между Mat::clone и Mat::copyTo?

Я знаю, что copyTo может справиться с маской. Но когда маска не нужна, могу ли я использовать оба одинаково?

http://docs.opencv.org/modules/core/doc/basic_structures.html

3 ответа

Решение

Это реализация 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 не выделяет новую память в куче, которая быстрее.

Другие вопросы по тегам