趣味は車輪の再発明♪

[opencv] cv::MatとIplImageの相互変換


詳解 OpenCV ―コンピュータビジョンライブラリを使った画像処理・認識
Gary Bradski Adrian Kaehler
オライリージャパン
売り上げランキング: 25,746


■ たかみんつ / ソフト開発メモINDEX / OpenCVリファレンス(じぶん用) / 関数・クラスの使い方・サンプルなど /


OpenCVの画像データである、IplImage構造体と、2.0以降で利用できるcv::Matクラスの双方向の変換方法を説明します。

OpenCV2.0以降では、cv::Matが利用でき、初期化や後始末、さまざまな画像処理に関しても、扱いやすくなっているのですが、 既にある関数を利用したい場合には、一旦IplImageに変換しなくてはなりませんし、逆にIplImageをcv::Matへ変換したい場合もあります。

これらの変換ルーチンはcv::Matクラスで定義されていて、実際には非常に簡単に変換できます。 しかし、コーディング中は、何故か難しく考えすぎて、戸惑うことが多々ありますので、ここにまとめておきます。

opencv.jpの説明では、 変換後のインスタンスに「データはコピーされません」という記述がなされています。 これは、変換後のインスタンスは、元データを参照しているだけで、データ部分の複製はされないということです。 このため、変換後のオブジェクトを後始末する必要はありません(してはいけません)。

cv::MatからIplImageへの変換

cv::MatのインスタンスをIplImageに変換するには、そのまま代入するだけです。 ただし、代入先は、ポインタ(IplImage*)ではなくIplImageのインスタンスそのものです。

代入先のIplImageを、事後に無理やりcvReleaseImageで解放してはいけません。

//変換元画像
cv::Mat mat(240, 320, CV_8UC3);

//変換先画像
IplImage iplImage = mat;    //ポインターではない
IplImage iplImage2 = mat;   //   〃

//後始末について

//変換先画像を以下のように無理に解放してはいけない。
// IplImage* pIplImage = &iplImage;
// cvReleaseImage(&pIplImage);

IplImageからcv::Matへの変換

既に存在する IplImageへのポインタをcv::Matクラスに変換して使用するには、以下のように、 (1)コンストラクタの引数に指定するか、(2)ポインタを代入します。

この場合のコピー元のIplImageは、従来通り使い終えた後にcvReleaseImageで開放するべきです。

//変換元画像
IplImage* iplImage = cvCreateImage(cvSize(320,240), IPL_DEPTH_8S, 3);

//変換先画像
cv::Mat mat(iplImage);  //(1)コピーコンストラクタ
cv::Mat mat2;
mat2 = iplImage;        //(2)ポインタの代入

//後始末について
cvReleaseImage(&iplImage);//元画像は開放すべき

Pythonプロフェッショナルプログラミング 第2版
秀和システム (2015-05-21)
売り上げランキング: 1,813


クラウドではじめる機械学習 Azure MLでらくらく体験
脇森浩志 杉山雅和 羽生貴史
リックテレコム
売り上げランキング: 2,081

実践Node.js プログラミング (Programmer's SELECTION)
Mike Cantelon Marc Harter T.J. Holowaychuk Nathan Rajlich
翔泳社
売り上げランキング: 40,213

■ たかみんつ / ソフト開発メモINDEX / OpenCVリファレンス(じぶん用) / 関数・クラスの使い方・サンプルなど /



RSS Feed Widget
[opencv] cv::MatとIplImageの相互変換
(http://bicycle.life.coocan.jp/takamints/index.php/doc/opencv/doc/Mat_conversion)
by Koji Takami ( email: vzg03566@gmail.com, GitHub: takamin )