OpenCV Visual-C ++ cvSplit Проблема - PullRequest
       8

OpenCV Visual-C ++ cvSplit Проблема

1 голос
/ 07 августа 2011

Я пробовал несколько способов открыть изображение и разделить каналы.Я просто хочу работать с 3 Matrix.Я не знаю, что не так.Вот мой код:

    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);

1 Ответ

2 голосов
/ 07 августа 2011

если cvloadImage возвращает указатель на iplImage, тогда вам не нужно '&' на img, это уже указатель

cvSplit принимает cvMat * iplImage * не то же самое, вам нужно преобразовать его в cvmat см http://opencv.willowgarage.com/documentation/cpp/c++_cheatsheet.html

...