47

「copyTo」がマスクを処理できることは知っています。しかし、マスクが不要な場合は、両方を均等に使用できますか?

http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-clone

4

4 に答える 4

70

実際、マスクなしでも同じではありません。

主な違いは、デスティネーション マトリックスとソース マトリックスのタイプとサイズが同じ場合、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]
于 2015-07-06T01:23:25.143 に答える
32

これはMat::clone()関数の実装です:

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

maskしたがって、@rotating_image が述べたように、関数を提供しない場合はcopyTo()と同じclone()です。

于 2013-03-28T17:19:05.030 に答える
23

Mat::copyTocv::Mat適切なデータサイズで既に割り当てられている (または割り当てられている可能性がある)宛先が既にある場合に使用します。Mat::clone新しい を割り当てる必要があることがわかっている場合に便利ですcv::Mat

于 2013-03-28T17:22:05.710 に答える
1

copyTo は、より高速なヒープに新しいメモリを割り当てません。

于 2019-01-21T15:59:35.500 に答える