OpenCV创建示例示例

时间:2011-07-01 14:08:12

标签: opencv

我正在尝试从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

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:7)

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

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

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

  3. 代码段: 在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;
    }
    

答案 1 :(得分:4)

我努力让opencv_createsamples在我的Windows机器上运行,它刚刚成功运行。我以为我会发布细节来帮助别人。我正在使用opencv 2.4.8 on Windows 7

首先,我发现我需要将路径变量中列出的目录中的opencv_createsamples.exe文件用作OPENCV_DIR。我无法将exe文件复制到更方便的位置。

我在此目录中为我的图像和文本文件设置了一个子目录text_classifier。我在命令行上使用了这个命令:

  

F:\ Apps \ opencv \ build \ x64 \ vc10 \ bin&gt; opencv_createsamples.exe -vec   text_classifier \ text_binary_desc -info   text_classifier \ positive_examples.txt -num 146 -w 1350 -h 900 -bg   text_classifier \ negative_samples.txt

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

在positive_examples.txt文件中,我需要列出这样的文件:

  

text_positives_clean \ 1839_Boettiger_001.JPG 1 708 35 471 793

换句话说,必须相对于文件positive_examples.txt列出文件,而不是相对于exe文件(opencv_createsamples.exe)。当我尝试列出相对于exe的文件时,例如:

  

text_classifier \ text_positives_clean \ 1839_Boettiger_001.JPG 1 708 35 471 793

     

然后我收到错误:无法打开图片:   text_classifier \ text_classifier \ text_positives_clean \ 1839_Boettiger_001.JPG

然后我注意到我创建此文件的特殊自动系统错误地将某些文件加载​​到目录中,因此在positive_examples.txt中列出的文件不在目录中。如果它发现positive_examples.txt中列出的东西不在目录中,那么exe就会摔倒。我填补了图像目录中的空白。

然后我得到一个奇怪的错误:无法打开图像:129

我发现我犯了这个错误:

  

text_positives_clean \ 1862_Streckfuss_0006.JPG 1 813 502 382 353 129 46   526 798 682 780 117 67

您是否注意到此处所选区域的数量为1(紧跟在“JPG”之后的数字),而所选区域的数量实际为3?因此opencv_createsamples.exe在获得单个选定区域后尝试打开它作为图像找到的下一个东西,即'129'。它再次崩溃了。

所以我将1更改为3.然后我得到了一个解析错误,实际上在我的positive_examples.txt文件中给了我一个行号。我去了那条线,发现我的一个条目在所选区域之间没有空格,例如:

  

949 315 157 67131 30 513 806

我修复了这个问题,添加了空格,最后我的所有146个样本都执行了。 Yoohoo!

希望这有助于某人。 : - )

答案 2 :(得分:0)

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**

答案 3 :(得分:0)

其中一个原因可能是因为信息文件。

/ home / mine / face detector image / positives / * .jpg

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

将文件夹重命名为原始路径以及.info文件。

干杯!!