2011-01-10 5 views
1

Я передаю массив изображений (IplImage **) для объекта на C++ с использованием OpenCV. Я затем пытается перебрать этот массив и изменять их все до фиксированного размера (150x150)Изменение размера массива изображений с помощью OpenCV

Я делаю это так:

for(int i = 0; i< this->numTrainingFaces; i++) 
{ 
    IplImage* frame_copy = cvCreateImage(cvSize(150,150), this->faceImageArray[0]->depth, this->faceImageArray[0]->nChannels); 
    cout << "Created image" << endl; 
    cvResize(this->faceImageArray[i], frame_copy); 
    cout << "Resized image" << endl; 
    IplImage* grey_image = cvCreateImage(cvSize(frame_copy->width, frame_copy->height), IPL_DEPTH_8U, 1); 
    cout << "Created grey image" << endl; 
    cvCvtColor(frame_copy, grey_image, CV_RGB2GRAY); 
    cout << "Converted image" << endl; 
    this->faceImageArray[i] = grey_image; 
    cvReleaseImage(&frame_copy); 
    cvReleaseImage(&grey_image); 
} 

Но я получаю этот выход, и я не уверен, почему:

Created image 
Resized image 
Created grey image 
Converted image 
Created image 
OpenCV Error: Assertion failed (src.type() == dst.type()) in cvResize, file /build/buildd/opencv-2.1.0/src/cv/cvimgwarp.cpp, line 3102 
terminate called after throwing an instance of 'cv::Exception' 
    what(): /build/buildd/opencv-2.1.0/src/cv/cvimgwarp.cpp:3102: error: (-215) src.type() == dst.type() in function cvResize 

Aborted 

Я в основном просто пытается заменить изображение в массиве с измененным размером один в качестве нескольких шагов, как это возможно.

Edit:

Пересмотренный мой код выглядит следующим образом:

for(int i = 0; i< this->numTrainingFaces; i++) 
{ 

    IplImage* frame_copy = cvCreateImage(cvSize(150,150), this->faceImageArray[i]->depth, this->faceImageArray[i]->nChannels); 
    cvResize(this->faceImageArray[i], frame_copy); 
    IplImage* grey_image = cvCreateImage(cvSize(frame_copy->width, frame_copy->height), IPL_DEPTH_8U, 1); 
    cvCvtColor(frame_copy, grey_image, CV_RGB2GRAY); 
    faceImageArray[i] = cvCreateImage(cvSize(grey_image->width, grey_image->height), grey_image->depth, grey_image->nChannels); 
    cvCopy(grey_image,faceImageArray[i]); 

    cvReleaseImage(&frame_copy); 
    cvReleaseImage(&grey_image); 
} 

Тогда позже я выступаю какой-PCA, и получить этот результат:

OpenCV Error: Null pointer (Null pointer to the written object) in cvWrite, file /build/buildd/opencv-2.1.0/src/cxcore/cxpersistence.cpp, line 4740 

Но я не думаю, мой код дошел до того, что я явно вызываю cvWrite, поэтому он должен быть частью библиотеки. Я могу дать полную реализацию в случае необходимости - есть ли что-нибудь в моем коде, который собирается создать нулевой указатель?

Мой полный исходный код находится здесь: http://pastie.org/1447022 - создается класс, задаются переменные, затем вызывается функция().

ответ

3
  • Почему вы используете интерфейс C, когда используете C++? Интерфейс C++ намного дружелюбнее, и у вас не было бы этой проблемы.
  • Ваша ошибка проста - ваше изображение отличается по типу, поэтому вы не можете использовать тип первого изображения для всех изображений.

Линия

IplImage* frame_copy = cvCreateImage(cvSize(150,150), this->faceImageArray[0]->depth, this->faceImageArray[0]->nChannels); 

должно быть

IplImage* frame_copy = cvCreateImage(cvSize(150,150), this->faceImageArray[i]->depth, this->faceImageArray[i]->nChannels); 

Кроме того, не this->, как правило, не оп. faceImageArray[0]->depth, faceImageArray[0]->nChannels должно быть достаточно.

+0

Арг, я не знаю, как я пропустил это - спасибо. Теперь я получаю сообщение об ошибке OpenCV: глубина входного изображения не поддерживается функцией (неподдерживаемый формат) в cvCalcEigenObjects. – amr

+0

Кроме того, что касается интерфейса C++, я не мог найти столько документации по его использованию, чтобы я придерживался C. – amr

+0

Думайте, это потому, что я выпускаю grey_image, и, возможно, мне нужно сделать что-то еще. – amr

Смежные вопросы