web-dev-qa-db-ja.com

cv :: MatからIplImage *への変換

これに関するドキュメントは非常にむらがあるようです。

基本的にIplImage * sの空の配列(IplImage ** imageArray)を取得し、cv :: Matsの配列をインポートする関数を呼び出しています-cv :: MatをIplImage *に変換したいので配列にコピーできます。

現在、私はこれを試しています:

while(loop over cv::Mat array)
{
    IplImage* xyz = &(IplImage(array[i]));
    cvCopy(iplimagearray[i], xyz);
}

これはセグメンテーション違反を生成します。

またしようとしている:

while(loop over cv::Mat array)
{
    IplImage* xyz;
    xyz = &array[i];
    cvCopy(iplimagearray[i], xyz);
}

次のコンパイル時エラーが発生します:error: cannot convert ‘cv::Mat*’ to ‘IplImage*’ in assignment

私はさらに進むことができる方法について立ち往生し、いくつかのアドバイスをいただければ幸いです:)

49
amr

cv::MatはOpenCV2.Xで導入された新しいタイプですが、IplImage*は「レガシー」画像構造です。

ただし、cv::Matは、コンストラクターパラメーターでのIplImageの使用をサポートしますが、デフォルトライブラリは、他の方法で機能を提供しません。画像ヘッダー情報を手動で抽出する必要があります。 (IplImage構造を割り当てる必要があることを忘れないでください。この例にはありません)。

22
YeenFei
Mat image1;
IplImage* image2=cvCloneImage(&(IplImage)image1);

これで仕事ができると思います。

編集:コンパイルエラーが発生した場合は、次の方法を試してください。

cv::Mat image1;
IplImage* image2;
image2 = cvCreateImage(cvSize(image1.cols,image1.rows),8,3);
IplImage ipltemp=image1;
cvCopy(&ipltemp,image2);
18
LovaBill
 (you have cv::Mat old)
 IplImage copy = old;
 IplImage* new_image = ©

最初に宣言されたIplImage *としてnewを使用します。

12
user2103629

個人的には、型キャストによる問題ではなく、バッファオーバーフローの問題だと思います。この行です

cvCopy(iplimagearray[i], xyz);   

私はセグメント障害を引き起こすと思う、配列iplimagearray [i]がコピーされたデータを受信するのに十分なサイズのバッファを持っていることを確認することをお勧めします

1
octavian

OpenCV cheat-sheet によると、これは次のように実行できます。

IplImage* oldC0 = cvCreateImage(cvSize(320,240),16,1);
Mat newC = cvarrToMat(oldC0);

cv :: cvarrToMat 関数は変換の問題を処理します。

0
chayan

問題の1つは、外部IPLを使用してプロジェクトでHAVE_IPLを定義する場合、ctor

_IplImage::_IplImage(const cv::Mat& m)
{
    CV_Assert( m.dims <= 2 );
    cvInitImageHeader(this, m.size(), cvIplDepth(m.flags), m.channels());
    cvSetData(this, m.data, (int)m.step[0]);
}

../OpenCV/modules/core/src/matrix.cppにあるものは使用されず、インスタンス化されず、変換は失敗します。

次のような方法で再実装できます。

IplImage& FromMat(IplImage& img, const cv::Mat& m)
{
    CV_Assert(m.dims <= 2);
    cvInitImageHeader(&img, m.size(), cvIplDepth(m.flags), m.channels());
    cvSetData(&img, m.data, (int)m.step[0]);
    return img;
}

IplImage img;
FromMat(img,myMat);
0
Timm

グレー画像の場合、この機能を使用していますが、正常に機能します!ただし、機能の機能に注意する必要があります;)

CvMat * src=  cvCreateMat(300,300,CV_32FC1);      
IplImage *dist= cvCreateImage(cvGetSize(dist),IPL_DEPTH_32F,3);

cvConvertScale(src, dist, 1, 0);
0
ksolid