Спасибо за то, что отвечаете.
В консоли пишется следующее сообщение: 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;
}