web-dev-qa-db-ja.com

OpenCV 2.0でIplImage変数タイプのMat変数タイプを変換するにはどうすればよいですか?

OpenCVで画像を回転させようとしています。

StackOverflowで見つけた次のコードを使用しました。

Mat source(img);
Point2f src_center(source.cols/2.0, source.rows/2.0);
Mat rot_mat = getRotationMatrix2D(src_center, 40.0, 1.0);
Mat dst;
warpAffine(source, dst, rot_mat, source.size());

dstMat変数タイプがいっぱいになったら、それをIplImage変数タイプに戻したいのですが、これを行う方法について何か考えはありますか?

12
Spredzy

新しいOpenCV2.0 C++インターフェースでは、MatIplImageの間を行ったり来たりする必要はありませんが、必要に応じてIplImage演算子を使用できます。

IplImage dst_img = dst;

IplImageヘッダーのみが作成され、データ(ピクセル)が共有されることに注意してください。詳細については、 OpenCV C++インターフェイス またはimage.cppディレクトリのOpenCV-2.0/samples/cの例を参照してください。

17
jeff7

IplImageオブジェクト全体を取得するために、次のコードを使用しました。

Mat matImage;
IplImage* iplImage;

iplImage = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 1);
iplImage->imageData = (char *) matImage.data;

ポインタの代わりにデータをコピーすることもできます。

memcpy(iplImage->imageData, matimage.data, 640*480);
15
lumapu

Norman in 彼のブログ は次のように説明しています(2.0ではありませんが、問題に当てはまるはずです)。

CvMatからIplImageに変換するには、次の関数を使用します。

IplImage* cvGetImage( const CvArr* arr, IplImage* image_header );  

関数cvGetImageは、入力配列の画像ヘッダーを返します。これは、matrix --CvMat *またはimage--IplImage *になります。画像の場合、関数は単に入力ポインタを返します。 CvMat *の場合、入力行列のパラメーターを使用してimage_header構造を初期化します。使用法:

IplImage stub, *dst_img;
dst_img = cvGetImage(src_mat, &stub);
1
rics

OpenCV 2.4以降のバージョンでは、次の方法で簡単に変換できます。

cv::Mat inMat;
//do the stuffs
IplImage* outIPL = (IplImage*)(&IplImage(inMat));
0