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

Eugene

Пользователи
  • Количество публикаций

    6
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные пользователем Eugene


  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. Позвольте спросить.

    Я взял ваш исходник и решил немного модифицировать так, чтобы работало с 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. Первый лежит в вашем архиве.

×