Перейти к содержимому
Compvision.ru
tybik

Динамический массив IplImage

Recommended Posts

Доброе утро подскажите пожалуйста как организовать динамический массив IplImage. Я пишу программу идентификации лиц методом главных компонент. За начинку взял программу из этого форума http://www.compvision.ru/forum/index.php?showtopic=74 . Но есть проблема там изначально в базе существует 40 лиц. А у меня это число переменно. Вот я и хочу сделать динамический массив. Я пробовал IplImage *img_load_ch1 = new IplImage[N_Samples]; но билдер ругается, пишет [C++ Error] Vision.cpp(473): E2034 Cannot convert '_IplImage *' to '_IplImage'. помогите пожалуйта. Заранее спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Правильней будет создавать изображения стандартными средствами (cvCreateImage, cvLoadImage, ...) и хранить массив указателей. Например так:

#include <deque>

...

std::deque<IplImage *> images; //сам массив

//Создаём и добавляем новый элемент

IplImage *img = cvLoadImage("file.jpg");

if (img)

images.push_back(img);

...

//Удаление всех изображений

for (size_t i = 0; i < images.size(); ++i)

{

cvReleaseImage(&images);

}

images.clear();

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А как обращаться к элементам такого массива указателей. если не сложно приведите простой пример, чтобы был образец

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
А как обращаться к элементам такого массива указателей. если не сложно приведите простой пример, чтобы был образец

Как к обычному массиву, разница только в методах добавления и удаления объектов, которые приведены ранее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Добавлю, что пример обращения к массиву там всё таки есть в цикле при удалении - по индексу. Можно ещё с помощью итераторов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

спасибо, с этим разобрался. Теперь не много другая проблема..

int nEigens = N_Samples-1;

std::deque<IplImage *> eig_img; //ñàì ìàññèâ

CvMat *EigenVals;

EigenVals = cvCreateMat(1,nEigens,IPL_DEPTH_32F);

for( i=0;i<N_Samples;i++)

{

IplImage *img =cvCreateImage( size, IPL_DEPTH_32F, 1 );

if (img)eig_img.push_back(img);

}

cvCalcEigenObjects(N_Samples, img_load_ch1, eig_img,CV_EIGOBJ_NO_CALLBACK,0,0,&Tc,mean_img,EigenVals->data.fl);

здесь img_load_ch1 определен как std::deque<IplImage *> img_load_ch1; и в него добавлены исходные изображения

При вычислении cvCalcEigenObjects возникает ошибка

[C++ Error] Vision.cpp(575): E2034 Cannot convert '_STL::deque<_IplImage *,_STL::allocator<_IplImage *> >' to 'void *'

[C++ Error] Vision.cpp(575): E2342 Type mismatch in parameter 'input' (wanted 'void *', got '_STL::deque<_IplImage *,_STL::allocator<_IplImage *> >')

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
здесь img_load_ch1 определен как std::deque<IplImage *> img_load_ch1; и в него добавлены исходные изображения

При вычислении cvCalcEigenObjects возникает ошибка

[C++ Error] Vision.cpp(575): E2034 Cannot convert '_STL::deque<_IplImage *,_STL::allocator<_IplImage *> >' to 'void *'

[C++ Error] Vision.cpp(575): E2342 Type mismatch in parameter 'input' (wanted 'void *', got '_STL::deque<_IplImage *,_STL::allocator<_IplImage *> >')

В cvCalcEigenObjects надо подавать два изображения, а ты подаёшь два массива с изображениями - несоответствие. Если ты хочешь работать с первыми элементами массивов, то пиши так:

cvCalcEigenObjects(N_Samples, img_load_ch1[0], eig_img[0], CV_EIGOBJ_NO_CALLBACK, 0, 0, &Tc, mean_img, EigenVals->data.fl);

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я с вами не совсем согласен. В описании по OpenCV написано:

void cvCalcEigenObjects ( int nObjects, void* input, void* output, int ioFlags, int ioBufSize, void* userData, CvTermCriteria* calcLimit, IplImage* avg, float* eigVals;

nObjects - Number of source objects.

input - Pointer either to the array of IplImage input objects or to the read callback function (depending on the parameter ioFlags).

output - Pointer either to the array of eigen objects or to the write callback function (depending on the parameter ioFlags).

ioFlags - Input/output flags.

ioBufSize -Input/output buffer size in bytes. The size is zero, if unknown.

userData - Pointer to the structure that contains all necessary data for the callback functions.

calcLimit - Determines conditions for the calculation to be finished.

avg - Averaged object.

Тоесть в input и output можно загрузить массивы.

Я попробовал и сделал как вы написали - возникает ошибка. не понимаю почему.

Функции не нравиться скорее динамические массивы такие (std::deque<IplImage *> images). Может это как то обойти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Во всем разобрался. Спасибо всем за помощь. Если кому интересно, то я определил динамический массив, как -

IplImage **img_load_ch1 = new IplImage*[N_Samples];

for( i=0;i<N_Samples;i++)

{

img_load_ch1=new IplImage;

img_load_ch1 = cvCreateImage( size, IPL_DEPTH_32F, 1 );

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А, там надо подавать С-массив. Понятно.

В твоём коде лишний вызов: img_load_ch1=new IplImage;

В моём можно заменить deque на vector, а в вызове поставить:

cvCalcEigenObjects(N_Samples, &img_load_ch1[0], &eig_img[0], CV_EIGOBJ_NO_CALLBACK, 0, 0, &Tc, mean_img, EigenVals->data.fl);

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×