我在opencv 2.1中通过“opencv_createsamples.exe”创建示例,但我在第1行有解析错误。
文件positives.txt
包含:
c:\haar\Positives\PosImg_0.jpg 1 175,120,275,240
c:\haar\Positives\PosImg_1.jpg 1 175,120,275,240
c:\haar\Positives\PosImg_10.jpg 1 175,120,275,240
...(--and so on )
我在cmd中所做的是:
c:\Haar>C:\OpenCV2.1\bin\opencv_createsamples.exe -info positives.txt -vec Posi
tivesMany.vec -num 15 -w 24 -h 24 PAUSE
Info file name: positives.txt
Img file name: (NULL)
Vec file name: PositivesMany.vec
BG file name: (NULL)
Num: 15
BG color: 0
BG threshold: 80
Invert: FALSE
Max intensity deviation: 40
Max x angle: 1.1
Max y angle: 1.1
Max z angle: 0.5
Show samples: FALSE
Width: 24
Height: 24
Create training samples from images collection...
positives.txt(1) : parse errorDone. Created 0 samples
所有信息文件路径都是正确的。
答案 0 :(得分:10)
我遇到了同样的问题,在我的情况下,我通过传递给opencv_createsamples -num参数来解决它,其中包含描述文件中描述的图像样本总数。我想通过的一个小数字也可以。
请注意,省略-num参数也会产生解析错误,即使在您想要处理所描述的所有样本时,它显然也是一个冗余参数。
答案 1 :(得分:1)
您需要删除positives.txt文件中的逗号。
像这样:
c:\haar\Positives\PosImg_0.jpg 1 175 120 275 240
c:\haar\Positives\PosImg_1.jpg 1 175 120 275 240
c:\haar\Positives\PosImg_10.jpg 1 175 120 275 240
...(--and so on )
此外,您的所有照片都在完全相同的位置,这似乎很奇怪......
答案 2 :(得分:0)
我遇到了同样的问题,我在this training page
上找到了解决方案答案 3 :(得分:0)
我有相同的错误消息,但在我的情况下,它是由错误的对象实例数量引起的。
答案 4 :(得分:0)
我的注释文件内容有问题。 opencv_createsamles已经破坏,没有在注释文件中指出它出现的行号。 搜索所需的线路一直很乏味和乏味。
我收到此错误消息:
Create training samples from images collection... OpenCV Error: Assertion failed (rect.width >= 0 && rect.height >= 0 && rect.x < image->width && rect.y < image->height && rect.x + rect.width >= (int)(rect.width > 0) && rect.y + rect.height >= (int)(rect.height > 0)) in cvSetImageROI, file /home/kostya/work/opencv/opencv-2.4.13.6/modules/core/src/array.cpp, line 3006
terminate called after throwing an instance of 'cv::Exception'
what(): /home/kostya/work/opencv/opencv-2.4.13.6/modules/core/src/array.cpp:3006: error: (-215) rect.width >= 0 && rect.height >= 0 && rect.x < image->width && rect.y < image->height && rect.x + rect.width >= (int)(rect.width > 0) && rect.y + rect.height >= (int)(rect.height > 0) in function cvSetImageROI
我创建了简单的perl脚本来指向文件中的坏行。 当找到坏线时,我决定检查图像文件的内容和坐标。 碰巧发现,有些点坐标超出了图像大小。怎么回事,我不知道。 我使用opencv_annotation来创建这个注释文件。 我的脚本代码如下:
#!/usr/bin/perl
use strict;
use warnings;
my $TARGET_FILE = 'annotations.txt';
my $MIN_W = 70;
my $MIN_H = 14;
main();
sub main
{
open F, $TARGET_FILE;
my $cur_line = 1;
while (my $inp_str = <F>)
{
print "line: $cur_line\n";
if ($inp_str =~ m/0 0 0 0/)
{
print "Bad coordinates! Line: $cur_line\n";
close F;
die;
}
open W, '>temp_annotations.txt';
print W $inp_str;
close W;
my $res = `opencv_createsamples -info temp_annotations.txt -bg negatives_cam.txt -vec temp.vec -w $MIN_W -h $MIN_H -num 1 2>&1`;
if ($res =~ m/Error/)
{
print "Broken line: $cur_line\n";
print "Original error message: \n\n $res\n\n";
close F;
die;
}
$cur_line++;
}
close F;
print "File is correct\n";
}
答案 5 :(得分:0)
Hariseldon78的解决方法对我有用。
为清楚起见(我首先误解了),要提供的数字(在--num参数中)不是行数,而是样本总数。
就我而言,错误消息甚至显示了所需的数字。
> opencv_createsamples.exe -vec result.vec -info info.txt
Info file name: info.txt
Img file name: (NULL)
Vec file name: result.vec
...
Create training samples from images collection...
info.txt(335) : parse errorDone. Created 460 samples
在最后一行中,460是样本数(而335是我文件中的行数)。 因此,为应用程序提供460作为要处理的样本数就足以避免出现错误消息。
> opencv_createsamples.exe -vec result.vec -info info.txt -num 460
Info file name: info.txt
Img file name: (NULL)
Vec file name: result.vec
...
Create training samples from images collection...
info.txt(335) : parse error
Done. Created 460 samples
另外:我不确定错误消息是否有意义,我只能说前面两个命令生成的.vec文件是不同的