OpenCV:如何创build.vec文件以使用opencv_traincascade

正如我在我以前的post中解释的,我正在尝试生成一些cascade.xml文件来识别在我的iOS应用程序中使用的欧元硬币。 无论如何,我在理解如何生成一个.vec文件给opencv_traincascade作为input时opencv_traincascade很多困难。 这是因为我听到了许多不同的意见:有人告诉我,vector文件只能包含仅包含要识别的对象的正面图像; 别人(也可以在我的教程中阅读)说,vector文件必须包含“样本”图像,换句话说,要识别的对象已被opencv_createsamples添加到的随机背景中。 用另外的话来说:

opencv_createsamples -img positives/1.png -bg negatives.txt -info 1.txt -num 210 -maxxangle 0.0 -maxyangle 0.0 -maxzangle 0.9 -bgcolor 255 -bgthresh 8 -w 48 -h 48

其中生成了12000个图像。 最后,我已经创build了.vec文件:

cat *.txt > positives.txt

opencv_createsamples -info positives.txt -bg negatives.txt -vec 2.vec -num 12600 -w 48 -h 48

所以,我想问问你哪个正确的图像包含在以下两个vector文件中:

在这里输入图像说明

在这里输入图像说明

而且,这是最后一次发起培训的命令吗? 这是我迄今使用过的:

opencv_traincascade -data final -vec 2.vec -bg negatives.txt -numPos 12000 -numNeg 3000 -numStages 20 -featureType HAAR -precalcValBufSize 2048 -precalcIdxBufSize 2048 -minHitRate 0.999 -maxFalseAlarmRate 0.5 -w 48 -h 48 -mode ALL

.vec文件包含12000个样本图像(背景+识别硬币)。 如果.vec文件只包含正面图像(只有硬币),我应该如何告诉opencv_traincascade使用示例图像进行训练?

我真的需要知道如何做正确的事情,因为我已经开展了很多培训,导致没有正确的结果,因为他们需要很多时间或几天执行,我不能再浪费时间了。

感谢大家的关注。

更新我设法用LBP创build一个cascade.xml文件。 如果我将一个用作训练样本的图像发送给一个简单的OpenCV程序,看看会发生什么情况:

在这里输入图像说明

而像这样的图像:

在这里输入图像说明

它根本不工作。 我真的不知道我犯了什么错误。

更新也许首先转换正面图像灰度可以帮助? 在这里输入图像说明

OpenCV级联(HAAR,LBP)可以很好地检测具有永久特征的对象。 举例来说,所有的脸部在相同的地方都有鼻子,眼睛和嘴巴。 训练OpenCV级联以search所需类别对象中的常用特征,并忽略从对象到对象变化的特征。 问题是,级联使用矩形的search窗口,但硬币是圆形的。 因此,硬币的形象总是会有一部分背景。 因此,培训硬币的图像必须包括所有可能的背景,以便分类器可以忽略它们(否则将仅在特定背景上检测硬币)。

因此,所有训练样本必须具有相同的图像比例,硬币的大小和位置(硬币在中心,硬币直径= 0.8-0.9图像宽度的方形图像)以及不同的背景!

我使用了INRIA培训的negative samples数据库http://pascal.inrialpes.fr/data/human/

和这个input(在硬币周围有alpha透明度的png):

在这里输入图像说明

使用这个命令:

opencv_createsamples -img pos_color.png -num 10 -bg neg.txt -info test.dat -maxxangle 0.6 -maxyangle 0 -maxzangle 0.3 -maxidev 100 -bgcolor 0 -bgthresh 0

产生这样的输出:

在这里输入图像说明

在这里输入图像说明

所以背景颜色显然不起作用。 转换到灰度在开始,但给我这个input:

在这里输入图像说明

和相同的命令产生这样的输出:

在这里输入图像说明

在这里输入图像说明

在这里输入图像说明

在这里输入图像说明

我知道这不是你所有问题的答案,但也许还是有帮助的。