OpenCV中文网站

 找回密码
 立即注册
搜索
热搜: 安装 配置
查看: 3355|回复: 3

是内存还是文件的原因?

[复制链接]
发表于 2010-1-8 12:08:54 | 显示全部楼层 |阅读模式
我现在也在做人脸检测的代码移植工作,目前使用的是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( &quot;Failed in allocate memory for cascade.stage_classifier[%d]!\n&quot;, 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( &quot;Failed in allocate memory for cascade.stage_classifier[%d].classifier[%d].threshold!\n&quot;, 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( &quot;Failed in allocate memory for cascade.stage_classifier[%d].classifier[%d].left!\n&quot;, 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( &quot;Failed in allocate memory for cascade.stage_classifier[%d].classifier[%d].right!\n&quot;, 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( &quot;Failed in allocate memory for cascade.stage_classifier[%d].classifier[%d].alpha!\n&quot;, 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( &quot;Failed in allocate memory for cascade.stage_classifier[%d].classifier[%d].haar_feature!\n&quot;, 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这一段地址上面,就不知道,现在的问题在哪里?
回复

使用道具 举报

 楼主| 发表于 2010-1-8 15:24:40 | 显示全部楼层

是内存还是文件的原因?

把heap放到SRAM中,设置heap越大,函数运行的i,j值越大。应该是内存的原因,但是SRAM太小了,容不下多少数据,而分类器有185K,不知前面的人是如何做的?还有应该怎么样在外部内存里面分配空间?
回复 支持 反对

使用道具 举报

发表于 2010-1-10 19:54:40 | 显示全部楼层

是内存还是文件的原因?

在i = 1时分配内存返回值正常,但i = 1,j = 15的时候就无法运行,也无法读出cascade.stage_classifier.classifier[j]的地址,为了有比较大的内存,我已经把.sysmem放到 o: 0x00060000 l : 0x00100000这一段地址上面,就不知道,现在的问题在哪里?
可能是地址对齐的问题,察看一下ccs下存放的数据。
回复 支持 反对

使用道具 举报

发表于 2010-4-1 17:44:03 | 显示全部楼层

是内存还是文件的原因?

说一下我做的,我以前导入是txt文件,它直接读入代码在cvhaar.cpp中,内存分配在大一点,太小了会出错

这里应该已经有人直接导入XML文件成功的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|OpenCV中文网站

GMT+8, 2024-3-28 21:31 , Processed in 0.010727 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表