1

画像を開いてチャンネルを分割する方法をいくつか試しました。3Matrixを使用したいだけです。何が悪いのかわかりません。ここに私のコード:

    IplImage* img = cvLoadImage( "C:\\foo.jpg" ); 
cvNamedWindow( "Example1", CV_WINDOW_AUTOSIZE ); 
cvShowImage( "Example1", img );
std::cout << "Hight: " << img->height << " Width: " << img->width;

CvMat* imgR= cvCreateMat(img->width,img->height,CV_8UC1);
CvMat* imgG= cvCreateMat(img->width,img->height,CV_8UC1);
CvMat* imgB= cvCreateMat(img->width,img->height,CV_8UC1);

cvSplit(&img, imgB, imgG, imgR, NULL);

cvWaitKey(0);
cvReleaseImage( &img );
cvDestroyWindow( "Example1" );
return 0;

問題は線cvSplit(&img, imgB, imgG, imgR, NULL);です。プログラムは常にクラッシュしますが、その理由はわかりません。

編集1:例外:

エラー-(206)認識されないまたはサポートされていない配列型

Edit2:img代わりに使用すると、次の&img例外が発生します。

An error occurred.
..\..\..\..\ocv\opencv\src\cxcore\cxconvert.cpp:877: error: (-215) dvec[j].size(
) == src.size() && dvec[j].depth() == src.depth() && dvec[j].channels() == 1 &&
i < src.channels()

解決策:cv :: Mat、cvMat、IplImageの違いに気づいていませんでした。これが解決策です:

    IplImage *r = cvCreateImage(cvGetSize(img), img->depth, 1);
    IplImage *g = cvCreateImage(cvGetSize(img), img->depth, 1);
    IplImage *b = cvCreateImage(cvGetSize(img), img->depth, 1);

    cvSplit(img, b, g, r, NULL);
4

1 に答える 1

2

cvloadImageがiplImageへのポインターを返している場合は、imgの「&」は必要ありません。これはすでにポインターです。

cvSplitはcvMat*を取ります。iplImage*は同じではありません。cvmatに変換する必要があります。http://opencv.willowgarage.com/documentation/cpp/c++_cheatsheet.htmlを参照してください

于 2011-08-06T23:55:00.280 に答える