tybik 0 Жалоба Опубликовано May 6, 2010 Доброе утро подскажите пожалуйста как организовать динамический массив 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'. помогите пожалуйта. Заранее спасибо. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано May 6, 2010 Правильней будет создавать изображения стандартными средствами (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(); Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
tybik 0 Жалоба Опубликовано May 6, 2010 А как обращаться к элементам такого массива указателей. если не сложно приведите простой пример, чтобы был образец Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано May 6, 2010 А как обращаться к элементам такого массива указателей. если не сложно приведите простой пример, чтобы был образец Как к обычному массиву, разница только в методах добавления и удаления объектов, которые приведены ранее. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано May 6, 2010 Добавлю, что пример обращения к массиву там всё таки есть в цикле при удалении - по индексу. Можно ещё с помощью итераторов. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
tybik 0 Жалоба Опубликовано May 6, 2010 спасибо, с этим разобрался. Теперь не много другая проблема.. 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 *> >') Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано May 6, 2010 здесь 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); Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
tybik 0 Жалоба Опубликовано May 9, 2010 Я с вами не совсем согласен. В описании по 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). Может это как то обойти. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
tybik 0 Жалоба Опубликовано May 9, 2010 Во всем разобрался. Спасибо всем за помощь. Если кому интересно, то я определил динамический массив, как - 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 ); } Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано May 11, 2010 А, там надо подавать С-массив. Понятно. В твоём коде лишний вызов: 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); Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах