Jump to content
Compvision.ru

Eugene

Пользователи
  • Content count

    6
  • Joined

  • Last visited

Community Reputation

0 Новичек

About Eugene

  • Rank
    Новичок
  • Birthday 01/11/1989

Profile Information

  • Пол
    Мужской
  • Расположение
    Волгоград
  1. Все!!! Урррааааа!!!!!!!!!!!!!! Проблема была устранена. Сколько дней бился головой об стену, не зная, в чем ошибка и наконец нашел. Вся проблема была в том, что в последней версии OpenCV есть баги. Сразу после установки OpenCV версии 1.0 все проблемы решились сами собой.
  2. С циклом проблем нет, так как он выполняется только один раз. Если убирать цикл, то ошибка остается. Не знаю в чем может быть проблема. Вроде все сделано по документации и все функции вызываются в той же последовательности в той же последовательности, и параметры как в документации. А вот сами переменные: totalPeople 0 int totalFaces 0 int _A_SUBDIR error: identifier '_A_SUBDIR' out of scope - tmplEhmm 0x014E8180 { level=1 num_states=5 transP=0x014E8200 ...} CvEHMM* level 1 int num_states 5 int - obsProb 0x00000000 float** + *(*tmplEhmm).obsProb error: cannot obtain value float* - transP 0x014E8200 float* *(*tmplEhmm).transP -0.15415066 float - u {...} CvEHMM::<unnamed-type-u> - ehmm 0x014E8194 { level=0 num_states=3 transP=0x014F8080 ...} CvEHMM* level 0 int num_states 3 int + obsProb 0x00000000 float** - transP 0x014F8080 float* *(*(*tmplEhmm).u.ehmm).transP -0.095310152 float + u {...} CvEHMM::<unnamed-type-u> - state 0x014E8194 { num_mix=0 mu=0x00000003 inv_var=0x014F8080 ...} CvEHMMState* - inv_var 0x014F8080 float* *(*(*tmplEhmm).u.state).inv_var -0.095310152 float - log_var_val 0x00000000 float* *(*(*tmplEhmm).u.state).log_var_val 0.00000000 float - mu 0x00000003 float* *(*(*tmplEhmm).u.state).mu error: unable to access invalid memory location float num_mix 0 int - weight 0x014F0080 float* *(*(*tmplEhmm).u.state).weight 4.2038954e-045 float - obsInfoVec 0x0037FAB8 CvImgObsInfo** - *obsInfoVec 0x01500080 { obs_x=31 obs_y=31 obs_size=16 ...} CvImgObsInfo* - mix 0x01508080 int* *(**obsInfoVec).mix 0 int - obs 0x040C4000 float* *(**obsInfoVec).obs 957.58331 float obs_size 16 int obs_x 31 int obs_y 31 int - state 0x01504080 int* *(**obsInfoVec).state 0 int
  3. Спасибо за то, что отвечаете. В консоли пишется следующее сообщение: Error: Assertion failed (src.typ e() == dst.type() && src.size() == dst.size()) in unknown function, file .\cxmat hfuncs.cpp, line 1762 устанавливать cuda пока не пробовал. Но думаю, что она не нужна для работы. Все остальные настройки сделал как написано у вас. Программа не работает. Пробовал загружать изображения разных форматов - ошибка остается. сама программа работает так: вначале вызывается функция AddStatFromFileImage, в которую передается имя графического файла. Эта функция потом вызывает функцию Train, в которую передается загруженное из файла изображение. вот весь код: void DataBase::AddStatFromFileImage(System::String^ SFilename) { char* filename = (char*)Marshal::StringToHGlobalAnsi(SFilename).ToPointer(); printf(filename); CvSize size; img_load = cvLoadImage(filename); Marshal::FreeHGlobal((System::IntPtr)filename); IplImage* img[1]; size=cvSize(img_load->width,img_load->height); img[0] = cvCreateImage( size, IPL_DEPTH_8U, 1 ); cvSplit(img_load,img[0],NULL,NULL,NULL); CvEHMM* stat=0; stat = Train(img,1); } void DataBase::ExtractDCT( float* src, float* dst, int numVec, int dstLen ) { float *tmpSrc = src + 1; float *tmpDst = dst; int i; for( i = 0; i < numVec; i++ ) { memcpy( tmpDst, tmpSrc, dstLen * sizeof( float ) ); tmpSrc += dstLen + 1; tmpDst += dstLen; } } CvEHMM * DataBase::Train(IplImage **images,int numImages/*,CvEHMM *tmplEhmm*/) { //Параметры обучения const int OBS_WIDTH = 12; const int OBS_HEIGHT = 12; const int NO_DCT_COEFF_X = 4; const int NO_DCT_COEFF_Y = 4; const int STEP_X = 4; const int STEP_Y = 4; const bool SUPPRESS_INTESITY = false; const int MAX_ITER = 80; const double STOP_STEP_ITER = 0.01; CvEHMM *tmplEhmm; // 5 - суперсостояний по 3,6,6,6,3 - соответственно состояний в каждом int noStates[] = { 5, 3, 6, 6, 6, 3 }; // количество Гауссовых смесей для каждого состояния. int numMixtures[] = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }; //NO_DCT_COEFF_X * NO_DCT_COEFF_Y - 1 т.к. не учитываем первый коэффициент int vecSize = NO_DCT_COEFF_X * NO_DCT_COEFF_Y - 1; // Переводим в cvSize что бы удобнее было использовать CvSize dctSize = cvSize( OBS_WIDTH, OBS_HEIGHT); CvSize stepSize = cvSize( STEP_X, STEP_Y ); CvSize noDCTCoeff = cvSize( NO_DCT_COEFF_X, NO_DCT_COEFF_Y); // Вектор наблюдений CvImgObsInfo **obsInfoVec; // Временное изображение IplImage *iplImg; // Размерность вектора наблюдений int obsVecLen = NO_DCT_COEFF_X * NO_DCT_COEFF_Y; // Количество наблюдений CvSize noObs; // Создали тренируемый объект tmplEhmm = cvCreate2DHMM( noStates, numMixtures, vecSize ); // Для хранения предыдущего значения степени похожести float oldLikelihood = 0; // Счетчик итераций int counter = 0; int i; if( SUPPRESS_INTESITY ) { //Подавляем первый коэффициент дискретного косинусного преобразования (ДКП) obsVecLen--; } // Создаем массив наблюдений obsInfoVec = new CvImgObsInfo*[ numImages ]; for( i = 0; i < numImages; i++ ) { // Загружаем указатель на изображение iplImg = images[i]; // Рассчитываем, сколько нужно произвести ДКП (DCT) noObs.width = ( iplImg->width - dctSize.width + stepSize.width ) / stepSize.width; noObs.height = ( iplImg->height - dctSize.height + stepSize.height ) / stepSize.height; // Создаем наблюдения для каждого преобразования obsInfoVec[ i ] = cvCreateObsInfo( noObs, obsVecLen ); if( SUPPRESS_INTESITY ) { float *observations = new float[ noObs.height * noObs.width * ( obsVecLen + 1 ) ]; cvImgToObs_DCT( iplImg, observations, dctSize, noDCTCoeff, stepSize ); // Подавляем первый коэффициент ДКП ExtractDCT( observations, obsInfoVec[ i ]->obs, noObs.height * noObs.width, obsVecLen ); // Очистка if ( observations ) { delete( observations); } } // Если не подавляем первый коэффициент else { cvImgToObs_DCT( iplImg, obsInfoVec[ i ]->obs, dctSize, noDCTCoeff, stepSize ); } cvUniformImgSegm( obsInfoVec[ i ], tmplEhmm ); cvReleaseImage( &iplImg ); } cvInitMixSegm( obsInfoVec, numImages, tmplEhmm ); int trained=0; // Процедура обучения while( ( !trained ) &&( counter < MAX_ITER ) ) { int j; float likelihood = 0; counter++; cvEstimateHMMStateParams( obsInfoVec, numImages, tmplEhmm ); cvEstimateTransProb( obsInfoVec, numImages, tmplEhmm); for( j = 0; j < numImages; j++ ) { ////////////////////////////////////////////////////////////////////////////////// // вылетает во время выполнения следующей строки cvEstimateObsProb( obsInfoVec[ j ], tmplEhmm ); ////////////////////////////////////////////////////////////////////////////////// likelihood += cvEViterbi( obsInfoVec[ j ], tmplEhmm ); } likelihood /= numImages * obsInfoVec[ 0 ]->obs_size; cvMixSegmL2( &obsInfoVec[ 0 ], numImages, tmplEhmm ); trained = ( fabs( likelihood - oldLikelihood ) < STOP_STEP_ITER ); oldLikelihood = likelihood; } // Очистка for( i = 0; i < numImages; i++ ) { cvReleaseObsInfo( &(obsInfoVec[ i ]) ); } delete []obsInfoVec; return tmplEhmm; }
  4. После предыдущей ошибки появилась сразу следующая. Программа всегда вылетает на вот этой строке cvEstimateObsProb( obsInfoVec[ j ], tmplEhmm ); Бьюсь несколько дней над этой проблемой. Ничего не могу сделать. Пробовал как с этим исходником, так и с исходником, с которого был сделан этот исходник. Использую Visual Studio 2008. Делал как в C++, так и в С++/CLI. Ничего не работает. Документация по OpenCV не помогает. Если у вас есть время, то помогите пожалуйста. Очень интересно все-таки разобраться с этим методом.
  5. Извините. Все, разобрался. Проблема была в том, что забыл преобразовать изображение в изображение только с градациями серого перед отправкой в функцию тренировки Марковской модели.
  6. Позвольте спросить. Я взял ваш исходник и решил немного модифицировать так, чтобы работало с WPF и Framework 3.5. Поэтому делаю на C++/CLI. Взял ваши функции для тренировки и распознавания. Но при тренировке во время выполнения программа вылетает после следующей строки: cvImgToObs_DCT( iplImg, observations, dctSize, noDCTCoeff, stepSize ); Сама ошибка пишется так: An unhandled exception of type 'System.Runtime.InteropServices.SEHException' occurred in HMMFace.exe Additional information: External component has thrown an exception. В консоли пишет следующее: OpenCV Error: Unsupported format or combination of formats () in c vImgToObs_DCT, file .\cvhmmobs.cpp, line 627 Я, честно говоря в тупике - не знаю в чем проблема и бьюсь головой об стену уже второй день. Может быть сможете помочь и прояснить в чем суть ошибки? Заранее благодарен. Это второй исходник в сети, в котором я нашел реализацию HMM в OpenCV. Первый лежит в вашем архиве.
×