gpt4 book ai didi

OpenCV 创建样本示例

转载 作者:太空宇宙 更新时间:2023-11-03 20:43:04 25 4
gpt4 key购买 nike

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

非常感谢任何帮助。

最佳答案

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

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

  2. 您可以修改 OPENCV_ROOT_DIR/modules/haartraining/createsamples.cpp。不指定-num时,设置pos样本数为文本文档中对象边界框数

代码片段:在 createsamples.cpp 中整数 = 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;
}

关于OpenCV 创建样本示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6549052/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com