cvCopyで行列のコピーを作成できる

#contents

*void Mat::copyTo( OutputArray m ) const; [#b7a158e1]
cv::Mat のメソッド。画像データをコピーする
**引数 [#e3ba0e13]
-m:出力画像。通常はcv::Mat型
**返り値 [#u6d9cab0]
-void型なのでなし

*Mat Mat::clone() const; [#q1dba64c]
画像をまるまるコピーする。
**引数 [#a56f8dbb]
-なし
**返り値 [#x89f2edd]
-新しく生成されたMatオブジェクト

*void cvCopy( CvMat* src, CvMat* dst, CvMat* mask = NULL); [#ja9fd775]
行列srcから行列dstへ中身をコピーする関数.Mat::copyTo のCインタフェース、CvMat版
**引数 [#a8eeee0e]
-src:CvMat*型のコピー元の行列
-dst:CvMat*型のコピー先の行列
-mask:CvMat*型のmask.srcの1部だけをdstにコピーできる.省略可
**返り値 [#ib34d810]
-voidなので値を返さない
*IplImage* cvCloneImage(IplImage* image); [#g8227161]
画像のコピーを作る。Mat::clone のCインタフェース、IplImage版
**引数 [#z1606c91]
-image:IplImage*型の画像
**返り値 [#ze272fd5]
-作られたコピーへのポインタ
*CvMat* cvCloneMat(CvMat* matrix); [#l8a1a118]
行列のコピーを作る。Mat::clone のCインタフェース、CvMat版
**引数 [#b6a835a0]
-matrix:CvMat*型の行列
**返り値 [#g5a4a5d8]
-作られたコピーへのポインタ

*解説 [#s8100fd2]
-srcは言うまでも無く,dstも領域確保されている必要がある.
-CvMat*型のmaskは,0が入っていたらコピーしない,それ以外ならコピーする,のはず.
-画像も行列同様コピーできる.
-cvClone系は領域確保もしてくれる.
--よって,[[領域解放>画像の領域確保]]が必要

*サンプルコード [#w77bd2f6]
**行列の場合 [#o43ea9a2]

 CvMat	*S = cvCreateMat( 3, 3, CV_32F);
 CvMat	*R = cvCreateMat( 3, 3, CV_32F);
 cvCopy( S, R); //これだけだと空っぽの行列同士のコピーになるが

**画像の場合 [#w82f87ba]

 IplImage *input = cvLoadImage("./test.bmp",0);
 IplImage *copy = cvCreateImage( cvGetSize(input), input->depth, input->nChannels);
 //ここで同じ領域を宣言しておかないといけない
 cvCopy( input, copy);

-実際問題,画像だったらcvCloneImageの方が領域確保も同時にやってくれるし,楽だな.

*下位互換性 [#ta6997b5]

cvCopyは昔cvmCopyと言う名前で実装されていた.下位互換性のため,今でもcvmCopyは利用できるが,将来的にOpenCVから削除される可能性があるため,cvCopyを利用することが推奨されている.

参考:[[後方互換関数を使わないようにする>http://d.hatena.ne.jp/DOSEI/20061227/p3]]

*実体ファイル [#e7f194ac]
-[[:OpenCV 2.4]]
--sources/modules/core/include/opencv2/core/core.hpp
--sources/modules/core/src/copy.cpp
-[[:OpenCV 1.0]]
--cxcore/include/cxcore.h
--cxcore/src/cxcopy.cpp

ジャンル[[:OpenCV]][[:OpenCV 1.0]][[:OpenCV 2.4]]準拠

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS