我现在也在做人脸检测的代码移植工作,目前使用的是haarcascade_frontalface_alt2.xml这个分类器。为了读文件更方便一点,已经把分类器读出并写到一个二进制文件里,检测的时候是读这个二进制文件,并且读文件的函数在VC下运行很正常,但是在DM642上出现了问题。我的代码是
int ReadHaarCascadeFile( CvHaarClassifierCascade& cascade )
{
int i, j;
FILE* fSrcData;
fSrcData = fopen( "E:\\Develop\\SEEDVPM642_loop2\\myCascade1.dat", "rb" );
if( !fSrcData )
{
printf( "Failed in open source file\n" );
return;
}
fread( &cascade, sizeof(CvHaarClassifierCascade), 1, fSrcData );
cascade.hid_cascade = 0;
cascade.stage_classifier = 0;
cascade.stage_classifier = ( CvHaarStageClassifier* )malloc( sizeof( CvHaarStageClassifier ) * cascade.count );
if( cascade.stage_classifier == 0 )
{
printf( "Failed in allocate memory for cascade.stage_classifier!\n" );
return 0;
}
for( i = 0; i < cascade.count; i++ )
{
fread( &cascade.stage_classifier, sizeof(CvHaarStageClassifier), 1, fSrcData );
cascade.stage_classifier.classifier = 0;
cascade.stage_classifier.classifier = ( CvHaarClassifier* )malloc( sizeof( CvHaarClassifier )
* cascade.stage_classifier.count );
if( cascade.stage_classifier.classifier == 0 )
{
printf( "Failed in allocate memory for cascade.stage_classifier[%d]!\n", i );
return 0;
}
for( j = 0; j < cascade.stage_classifier.count; j++ )
{
cascade.stage_classifier.classifier[j].threshold = 0;
cascade.stage_classifier.classifier[j].left = 0;
cascade.stage_classifier.classifier[j].right = 0;
cascade.stage_classifier.classifier[j].alpha = 0;
cascade.stage_classifier.classifier[j].haar_feature = 0;
fread( &cascade.stage_classifier.classifier[j].count, sizeof( int ), 1, fSrcData );
if( cascade.stage_classifier.classifier[j].count == 1 )
{
cascade.stage_classifier.classifier[j].threshold = ( float* )malloc( sizeof(float) );
if( cascade.stage_classifier.classifier[j].threshold == 0 )
{
printf( "Failed in allocate memory for cascade.stage_classifier[%d].classifier[%d].threshold!\n", i, j );
return 0;
}
else
{
fread( cascade.stage_classifier.classifier[j].threshold, sizeof( float ), 1, fSrcData );
}
cascade.stage_classifier.classifier[j].left = ( int* )malloc( sizeof( int ) );
if( cascade.stage_classifier.classifier[j].left == 0 )
{
printf( "Failed in allocate memory for cascade.stage_classifier[%d].classifier[%d].left!\n", i, j );
return 0;
}
else
{
fread( cascade.stage_classifier.classifier[j].left, sizeof( int ), 1, fSrcData );
}
cascade.stage_classifier.classifier[j].right = ( int* )malloc( sizeof( int ) );
if( cascade.stage_classifier.classifier[j].right == 0 )
{
printf( "Failed in allocate memory for cascade.stage_classifier[%d].classifier[%d].right!\n", i, j );
return 0;
}
else
{
fread( cascade.stage_classifier.classifier[j].right, sizeof( int ), 1, fSrcData );
}
cascade.stage_classifier.classifier[j].alpha = ( float* )malloc( sizeof(float) * 2 );
if( classifier->alpha == 0 )
{
printf( "Failed in allocate memory for cascade.stage_classifier[%d].classifier[%d].alpha!\n", i, j );
return 0;
}
else
{
fread( &cascade.stage_classifier.classifier[j].alpha[0], sizeof( float ), 1, fSrcData );
fread( &cascade.stage_classifier.classifier[j].alpha[1], sizeof( float ), 1, fSrcData );
}
cascade.stage_classifier.classifier[j].haar_feature = ( CvHaarFeature* )malloc( sizeof( CvHaarFeature ) );
if( cascade.stage_classifier.classifier[j].haar_feature == 0 )
{
printf( "Failed in allocate memory for cascade.stage_classifier[%d].classifier[%d].haar_feature!\n", i, j );
return 0;
}
else
{
fread( cascade.stage_classifier.classifier[j].haar_feature, sizeof( CvHaarFeature ), 1, fSrcData);
}
}
}
}
fclose( fSrcData )
return 1;
}
在i = 1时分配内存返回值正常,但i = 1,j = 15的时候就无法运行,也无法读出cascade.stage_classifier.classifier[j]的地址,为了有比较大的内存,我已经把.sysmem放到 o: 0x00060000 l : 0x00100000这一段地址上面,就不知道,现在的问题在哪里? |