「copyTo」がマスクを処理できることは知っています。しかし、マスクが不要な場合は、両方を均等に使用できますか?
http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-clone
「copyTo」がマスクを処理できることは知っています。しかし、マスクが不要な場合は、両方を均等に使用できますか?
http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-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::clone()
関数の実装です:
inline Mat Mat::clone() const
{
Mat m;
copyTo(m);
return m;
}
mask
したがって、@rotating_image が述べたように、関数を提供しない場合はcopyTo()
と同じclone()
です。
Mat::copyTo
cv::Mat
適切なデータサイズで既に割り当てられている (または割り当てられている可能性がある)宛先が既にある場合に使用します。Mat::clone
新しい を割り当てる必要があることがわかっている場合に便利ですcv::Mat
。
copyTo は、より高速なヒープに新しいメモリを割り当てません。