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());
dst
Mat
変数タイプがいっぱいになったら、それをIplImage
変数タイプに戻したいのですが、これを行う方法について何か考えはありますか?
新しいOpenCV2.0 C++インターフェースでは、Mat
とIplImage
の間を行ったり来たりする必要はありませんが、必要に応じてIplImage
演算子を使用できます。
IplImage dst_img = dst;
IplImageヘッダーのみが作成され、データ(ピクセル)が共有されることに注意してください。詳細については、 OpenCV C++インターフェイス またはimage.cpp
ディレクトリのOpenCV-2.0/samples/c
の例を参照してください。
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);
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);
OpenCV 2.4以降のバージョンでは、次の方法で簡単に変換できます。
cv::Mat inMat;
//do the stuffs
IplImage* outIPL = (IplImage*)(&IplImage(inMat));