目标检测分为三个步骤:
1、 样本的创建
2、 训练分类器
3、 利用训练好的分类器进行目标检测。
有了opencv自带的那些xml人脸检测文档,我们就可以用cvLoad()这个函数加载他们,让他们对我们的人脸进行检测,但是,现在生活中还有很多物品需要识别,所以,我们需要自己做个xml的检测文档。
一、正负样本的创建
1、首先就是图片库了,下载 face 和 nonface 库作为正负样本,分别放入pos_image和neg_image文件夹下,两个文件夹都在工程文件夹中,我这里分别取了100个20*20的样本。负样本图像的大小只要不小于正样本就可以,在使用负样本时,OpenCV 自动从负样本
图像中抠出一块和正样本同样大小的区域作为负样本。
2、将opencv_haartraining.exe ,opencv_createsamples.exe两个可执行文件拷贝到工程文件夹下。
(这里说一下:opencv2.4.4里面没有 opencv_haartraining.exe ,opencv_createsamples.exe这两个可执行文件。解决办法,下载了个opencv2.3.1,在安装目录C:\Program Files\opencv2.3.1\build\common\x86下找到并复制到工程文件夹中。这个时候点击会发现无法运行,因为缺少tbb.dll文件,这时候下一个这个动态链接库,然后拷贝到c:\Windows\SysWOW64下,32位系统的话拷贝到C:\Windows\SYSTEM32下)
3、生成正负样本描述文件
windows+R,输入cmd,打开dos命令窗口,分别进入正负样本所在文件夹,我这里输入E:\OpenCV\xiaqunfeng\pos_image回车就可以了。但是我这台电脑不知道怎么回事,老是要出错。解决办法,一步一步进入文件夹,每一步都要在前面加cd,然后就可以了。
再输入:dir /b >pos_image.txt,就在目标文件夹下生成了该文件,打开它,删掉最后一行。然后给文本文件里面的内容加上前缀和后缀,如下图所示:
加前缀方法:1、使用 EditPlus,先选中所有行,然后按 Tab键为每行增加一个制表位,将制表位全部替换为“pos_image/”即可。
2、新建个文本文档,在里面输入 如下代码:
@echo off
(for /f "delims=" %%a in (2.txt) do echo 前缀%%a)>b.txt //将 前缀 两字改为你要加的前缀
del /s/q 2.txt
ren b.txt 2.txt
存为a.bat 会变成可执行文件,若没变,修改工具文件夹—》隐藏已知文件扩展名,不选它
二、创建vec文件
将pos_image.txt和neg_image.txt两个样本描述文件分别剪切到上一目录,也就是工程目录下。如果不剪切过来的话也可以,就是在使用opencv_haartraining.exe ,opencv_createsamples.exe这两个的cmd命令时要加上描述文件的绝对地址。
正样本由程序createsample 程序来创建。该程序的源代码由OpenCV 给出,并且在bin 目录下包含了这个可执行的程序。
输入如下命令,执行完该命令后就会在当前目录下生产一个pos.vec文件了。
其中的-vec是指定后面输出vec文件的文件名,-info指定正样本描述文件,-bg指定负样本描述文件,-w和-h分别指正样本的宽和高,-num表示正样本的个数。
三、使用opencv_haartraining.exe文件训练分类器
输入如下cmd命令,在当前目录下生产了一个xml.xml文件。
其中-data为输出xml中间文件的位置,-sym表示训练的目标为垂直对称,-nsplits 1表示使用简单的stump classfier分类。-mem 1280 表示允许使用计算机的1280M内存,-mode all 表示使用haar特征集的种类既有垂直的,又有45度角旋转的。
参考资料:这篇博文里面的过程比较清晰,但是有几个地方的过度没有说清楚,我这里做了补充
新浪的一篇博客,里面还讲了关于正负样本大小不一样的问题,我没仔细研究
百度文库的一个例子