OpenCV_ copyTo について

 

深いコピー ( clone と同様 )

マスク行列 ( Mat ) を用いてのコピーが出来る。

 

深いコピー

cv::Mat を代入演算子でコピーすると、浅いコピー ( shallow copy ) が行われ、
コピー元とコピー先で cv::Mat のデータが共有される。(参照渡し的な感じ)
先も元も同じメモリアドレスを示すので、コピー先のcv::Mat データを書き換えると、
コピー元の cv::Mat データも変わる。

浅いコピー
cv::Mat imgShallow = img;

 

コピー元とコピー先で別データとする場合には、
clone( ) メソッドを用いて深いコピー ( deep copy ) を行う。

clone( ) メソッド内部では、新たな cv::Mat が生成され、
copyTo( ) メソッドでデータ全体がコピーされる。(値渡し的な感じ)

深いコピー (2通りある)
cv::Mat imgDeep1 = img.clone();

cv::Mat imgDeep2;
img.copyTo(imgDeep2);

 

マスク行列を用いてのコピー

copyTo ( Mat& m, const Mat& mask )
m      コピー先 (の行列)。
mask:処理マスク。この非ゼロの要素がコピーするべき行列の要素を表す。
mask のタイプは CV_8Uでなければならないが、1 または 複数のチャネルを持てる。

 

copyTo 関数は、コピーする前に、
m.create(this->size(), this->type);
を呼び出す。
Mat::create( ) により、必要ならば、コピー先の行列が再割り当てされる。
※コピー元とコピー先の行列がオーバーラップする ( 重なる ) 場合は
この関数では扱えない。

処理マスクが指定される場合、そして Mat::create() が再割り当てする場合、
新しく確保された行列は、データーコピーの前に 0 で初期化される。

 

maskゼロでない値を持つ画素位置で、元画像 ( img ) の 値が m へコピーされる。
マスク画像:ゼロ=黒。隠している部分。

ex )
cv::Mat masking;
colorImg.copyTo(maskImg, redOnlyImg);
colorImg:元
maskImg:コピー先
redOnlyImg:0 でない値の画素位置で、colorImg の値が maskIng にコピー。

 

 

こちらから。
http://opencv.jp/cookbook/opencv_mat.html
http://www.cellstat.net/mask/
http://opencv.jp/opencv-2svn/cpp/basic_structures.html
http://docs.opencv.org/3.3.0/d3/d63/classcv_1_1Mat.html#a626fe5f96d02525e2604d2ad46dd574f

 

以上。