OpenCV createsamples示例

OpenCV createsamples示例,opencv,Opencv,我正在尝试从OpenCV库运行createsamples示例。我可以一次加载一个图像,看起来效果不错。然而,当我试图加载一组图像时,我得到了一个解析错误。我不确定我的收藏文件中是否有无效的内容,或者我是否在其他地方遗漏了一些内容。下面是我的文本文档的确切格式 文本文档详细信息: Target1.JPG 1 0 0 1296 1152 Target2.jpg 1 0 0 1890 709 命令行调用: -info "C:\Users\seb\Desktop\Learning Samples\Ta

我正在尝试从OpenCV库运行
createsamples
示例。我可以一次加载一个图像,看起来效果不错。然而,当我试图加载一组图像时,我得到了一个解析错误。我不确定我的收藏文件中是否有无效的内容,或者我是否在其他地方遗漏了一些内容。下面是我的文本文档的确切格式

文本文档详细信息:

Target1.JPG 1 0 0 1296 1152
Target2.jpg 1 0 0 1890 709
命令行调用:

-info "C:\Users\seb\Desktop\Learning Samples\Target\Target.txt" -num 10 -vec "C:\Users\seb\Desktop\Learning Samples\Target\Target.vec" -maxxangle 0.6 -maxyangle 0 -maxzangle 0.3 -maxidev 100 -bgcolor 0 -bgthresh 0 -w 20 -h 20

非常感谢您的帮助。

Target1.JPG
-它必须是createsamples.exe的相对路径。不是指向Target.txt

我已经在我的机器上进行了测试,结果如下:

d:\Programs\OpenCV-2.2.0\msvs-build\bin\Release>opencv_createsamples.exe -info "d:\Programs\OpenCV-2.2.0\msvs-build\bin\Release\Target.dat" -num 10 -vec "d:\Programs\OpenCV-2.2.0\msvs-build\bin\Release\Target.vec" -maxxangle 0.6 -maxyangle 0 -maxzangle 0.3 -maxidev 100 -bgcolor 0 -bgthresh 0 -w 20 -h 20
Info file name: d:\Programs\OpenCV-2.2.0\msvs-build\bin\Release\Target.dat
Img file name: (NULL)
Vec file name: d:\Programs\OpenCV-2.2.0\msvs-build\bin\Release\Target.vec
BG  file name: (NULL)
Num: 10
BG color: 0
BG threshold: 0
Invert: FALSE
Max intensity deviation: 100
Max x angle: 0.6
Max y angle: 0
Max z angle: 0.3
Show samples: FALSE
Width: 20
Height: 20
Create training samples from images collection...
d:\Programs\OpenCV-2.2.0\msvs-build\bin\Release\Target.dat(3) : parse errorDone. **Created 2 samples**

分析错误是因为当您未指定要生成的pos图像样本数时,createsamples将使用默认值1000。但是,如果注释文本文档包含的对象边界框少于1000个,则会出现解析错误。您仍然可以将.vec文件用于训练级联。唯一的问题是数字信息不正确。有两种方法可以解决这个问题

  • 手动计算文本文档中对象边界框的数量。并指定小于或等于选项“-num”的值 e、 g.createsamples-info xxxxx.txt-vec pos.vec-num[值]

  • 您可以修改OPENCV_ROOT_DIR/modules/haartraining/createsamples.cpp。如果未指定-num,请将pos样本数设置为文本文档中对象边界框的数目

  • 代码段: 在createsamples.cpp中 int num=0

    在cvsamples.cpp中

    void icvWriteVecHeader( FILE* file, int count, int width, int height )
    {
        int vecsize;
        short tmp;
    
        fseek ( file , 0 , SEEK_SET );
    
        /* number of samples */
        fwrite( &count, sizeof( count ), 1, file );
        /* vector size */
        vecsize = width * height;
        fwrite( &vecsize, sizeof( vecsize ), 1, file );
        /* min/max values */
        tmp = 0;
        fwrite( &tmp, sizeof( tmp ), 1, file );
        fwrite( &tmp, sizeof( tmp ), 1, file );
    
        fseek ( file , 0 , SEEK_END );
    }
    
    int cvCreateTrainingSamplesFromInfo( const char* infoname, const char* vecfilename,
                                         int num,
                                         int showsamples,
                                         int winwidth, int winheight )
    {
        char fullname[PATH_MAX];
        char* filename;
    
        FILE* info;
        FILE* vec;
        IplImage* src=0;
        IplImage* sample;
        int line;
        int error;
        int i;
        int x, y, width, height;
        int total;
    
        assert( infoname != NULL );
        assert( vecfilename != NULL );
    
        total = 0;
        if( !icvMkDir( vecfilename ) )
        {
    
    #if CV_VERBOSE
            fprintf( stderr, "Unable to create directory hierarchy: %s\n", vecfilename );
    #endif /* CV_VERBOSE */
    
            return total;
        }
    
        info = fopen( infoname, "r" );
        if( info == NULL )
        {
    
    #if CV_VERBOSE
            fprintf( stderr, "Unable to open file: %s\n", infoname );
    #endif /* CV_VERBOSE */
    
            return total;
        }
    
        vec = fopen( vecfilename, "wb" );
        if( vec == NULL )
        {
    
    #if CV_VERBOSE
            fprintf( stderr, "Unable to open file: %s\n", vecfilename );
    #endif /* CV_VERBOSE */
    
            fclose( info );
    
            return total;
        }
    
        sample = cvCreateImage( cvSize( winwidth, winheight ), IPL_DEPTH_8U, 1 );
    
        icvWriteVecHeader( vec, num, sample->width, sample->height );
    
        if( showsamples )
        {
            cvNamedWindow( "Sample", CV_WINDOW_AUTOSIZE );
        }
    
        strcpy( fullname, infoname );
        filename = strrchr( fullname, '\\' );
        if( filename == NULL )
        {
            filename = strrchr( fullname, '/' );
        }
        if( filename == NULL )
        {
            filename = fullname;
        }
        else
        {
            filename++;
        }
    
        while ( num<=0 || total<num )
        {
            int count;
    
            error = ( fscanf( info, "%s %d", filename, &count ) != 2 );
            if( !error )
            {
                src = cvLoadImage( fullname, 0 );
                error = ( src == NULL );
                if( error )
                {
    
    #if CV_VERBOSE
                    fprintf( stderr, "Unable to open image: %s\n", fullname );
    #endif /* CV_VERBOSE */
                }
            }
            else
                if ( num <= 0 ) break;
    
            for( i = 0; i < count; i++, total++ )
            {
                error = ( fscanf( info, "%d %d %d %d", &x, &y, &width, &height ) != 4 );
                if( error ) break;
                cvSetImageROI( src, cvRect( x, y, width, height ) );
                cvResize( src, sample, width >= sample->width &&
                          height >= sample->height ? CV_INTER_AREA : CV_INTER_LINEAR );
    
                if( showsamples )
                {
                    cvShowImage( "Sample", sample );
                    if( cvWaitKey( 0 ) == 27 )
                    {
                        showsamples = 0;
                    }
                }
                icvWriteVecSample( vec, sample );
    
                            if ( num > 0 && total >= num ) break;
            }
    
            if ( num<=0 )
                icvWriteVecHeader( vec, total, sample->width, sample->height );
    
            if( src )
            {
                cvReleaseImage( &src );
            }
    
            if( error )
            {
    
    #if CV_VERBOSE
                fprintf( stderr, "%s(%d) : parse error", infoname, line );
    #endif /* CV_VERBOSE */
    
                break;
            }
    
            }
    
        if( sample )
        {
            cvReleaseImage( &sample );
        }
    
        fclose( vec );
        fclose( info );
    
        return total;
    }
    
    void icvWriteVecHeader(文件*文件,整数计数,整数宽度,整数高度)
    {
    整数向量大小;
    短tmp;
    fseek(文件,0,搜索集);
    /*样本数量*/
    fwrite(&count,sizeof(count),1,文件);
    /*矢量大小*/
    尺寸=宽度*高度;
    fwrite(&vecsize,sizeof(vecsize),1,文件);
    /*最小/最大值*/
    tmp=0;
    fwrite(&tmp,sizeof(tmp),1,文件);
    fwrite(&tmp,sizeof(tmp),1,文件);
    fseek(文件,0,SEEK_END);
    }
    int cvCreateTrainingSamplesFromInfo(常量字符*infoname,常量字符*vecfilename,
    int num,
    int showsamples,
    int winwidth,int winheight)
    {
    字符全名[PATH_MAX];
    字符*文件名;
    文件*信息;
    文件*vec;
    IplImage*src=0;
    IplImage*样品;
    内线;
    整数误差;
    int i;
    整数x,y,宽度,高度;
    整数合计;
    断言(infoname!=NULL);
    断言(vecfilename!=NULL);
    总数=0;
    如果(!icvMkDir(vecfilename))
    {
    #如果CV_冗长
    fprintf(stderr,“无法创建目录层次结构:%s\n”,vecfilename);
    #endif/*CV_详细*/
    返回总数;
    }
    info=fopen(infoname,“r”);
    if(info==NULL)
    {
    #如果CV_冗长
    fprintf(stderr,“无法打开文件:%s\n”,infoname);
    #endif/*CV_详细*/
    返回总数;
    }
    vec=fopen(vecfilename,“wb”);
    如果(vec==NULL)
    {
    #如果CV_冗长
    fprintf(stderr,“无法打开文件:%s\n”,vecfilename);
    #endif/*CV_详细*/
    fclose(信息);
    返回总数;
    }
    示例=cvCreateImage(cvSize(winwidth,winheight),IPL_DEPTH_8U,1);
    icvWriteVecHeader(向量、数量、样本->宽度、样本->高度);
    如果(显示样本)
    {
    cvNamedWindow(“示例”,CV\u窗口\u自动调整大小);
    }
    strcpy(全名、信息名);
    filename=strrchr(全名“\\”);
    如果(文件名==NULL)
    {
    filename=strrchr(全名“/”);
    }
    如果(文件名==NULL)
    {
    filename=全名;
    }
    其他的
    {
    文件名++;
    }
    同时(num=样本->高度?CV\u内部区域:CV\u内部线性);
    如果(显示样本)
    {
    cvShowImage(“样本”,样本);
    如果(cvWaitKey(0)==27)
    {
    showsamples=0;
    }
    }
    icvWriteVecSample(vec,样品);
    如果(num>0&&total>=num)中断;
    }
    if(宽度,样本->高度);
    if(src)
    {
    cvReleaseImage(&src);
    }
    如果(错误)
    {
    #如果CV_冗长
    fprintf(stderr,“%s(%d):分析错误”,infoname,行);
    #endif/*CV_详细*/
    打破
    }
    }
    如果(样本)
    {
    cvReleaseImage(图像和样本);
    }
    fclose(vec);
    fclose(信息);
    返回总数;
    }
    
    原因之一可能是由于信息文件

    /家庭/地雷/面部探测器图像/正片/*.jpg

    确保任何文件夹名称的名称中不应有空格。就像上面显示的“人脸检测器图像”,这应该是一些其他名称,如“图像”或任何没有空间的东西

    在原始路径以及.info文件中重命名文件夹


    干杯

    我努力让
    opencv\u createsamples
    在我的windows机器上工作,结果它成功了。我想我会发布细节来帮助其他人。我正在Windows 7上使用
    opencv 2.4.8

    首先,我发现我需要使用路径变量中列出的目录中的
    opencv\u createsamples.exe
    文件
    opencv\u DIR
    。我无法将
    exe
    文件复制到更方便的地方

    我在这个目录中为我的图像和文本文件设置了一个子目录
    text\u classifier
    。我在命令行中使用了以下命令:

    F:\Apps\opencv\build\x64\vc10\bin>opencv\u createsamples.exe-vec 文本\分类器\文本\二进制\描述-信息 text\u classifier\positive\u examples.txt-num 146-w 1350-h900-bg text\u分类器\negative\u samples.txt

    请注意,我必须列出图像中选定区域的数量(-num 146)。我还列出了阳性样本的宽度和高度。