あなたが生成したいのPOS画像サンプルの数を指定しない場合は、createsamplesが使用するので、パースエラーがありますデフォルト値は1000です。しかし、注釈テキスト文書に1000個未満のオブジェクトの境界ボックスが含まれていると、解析エラーが発生します。トレーニングカスケードに.vecファイルを使用することはできます。唯一の問題は、番号の情報が間違っていることです。それを修正するには2つの方法があります。
テキストドキュメント内のオブジェクトバウンディングボックスの数を手動で数えます。オプション "-num"の数以下の値を指定してください。 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;
}
コマンドラインコール全体を過ぎてもいいですか? – red1ynx
質問を編集して、指定されたコマンドラインを含めるようにしました。また、テキストファイルは画像と同じディレクトリにあります。 – Seb