2011-08-06 9 views
0

画像を開いてチャンネルを分割する方法をいくつか試しました。私は3つのMatrixを使いたいだけです。私は何が間違っているのか分からない。 ここに私のコード:OpenCV Visual C++ cvSplit問題

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);です。プログラムはいつもクラッシュし、私は理由を知らない。

EDIT1:例外:

エラー - (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); 

答えて

2

cvloadImageがIplImageへのポインタを返しているならば、あなたはそれがすでにポインタ

cvSplitだのimgに「&」を必要としないIplImageへ* ISN * CvMatのを取りますあなたはそれをcvmatに変換する必要があります を参照してくださいhttp://opencv.willowgarage.com/documentation/cpp/c++_cheatsheet.html

+0

投稿投稿 – vo1d

+0

ありがとう – vo1d