Изменение размера массива изображений с помощью OpenCV - PullRequest
1 голос
/ 11 января 2011

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

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

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

Я просто пытаюсь заменить изображение в массиве на изображение с измененным размером за несколько шагов.

Редактировать:

Пересмотрел мой код следующим образом:

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 - класс создан, переменныеset, затем learn () вызывается.

1 Ответ

3 голосов
/ 11 января 2011
  • Почему вы используете интерфейс 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 должно хватить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...