从网上下载人脸图片正样本,背景负样本各1000张,正样本放在D:\classify\posdata文件夹下,负样本放在D:\classify\negdata文件夹下,正负样本要裁剪一样大小,在此作者采用样20*20大小样本,准备工作做完。
1、生成负样本描述文件negdata.dat,(注意这是.dat格式文件不是.bat批处理文件)路径为D:\classify\negdata\negdata.dat,即与负样本放在同一文件夹中,怎么生成,打开系统dos命令,第一步进入negdata文件夹,输入dos命令,cd\ 回车再输入d:回车再输入cd\classify\negdata回车,第二步创建负样本描述文件,接着输入dos命令 dir /b>negdata.dat,这时回车即可,这时会发现在负样本文件夹中生成了negdata.dat文件,用记事本打开这个文件,将最后一行negdata.dat删除,然后保存关闭。至此,负样本描述文件就生成了。
2、生成正样本描述文件posdata.bat路径为D:\classify\posdata\posdata.dat,即与正样本放在同一文件夹中,生成方式与负样本生成方式相同,生成posdata.bat后,打开,删除最后一行posdata.dat,选择记事本的替换功能,将bmp替换成bmp 1 0 0 20 20 ,保存退出,这五个数字分别表示图片数量,0 0 表示要训练的目标区域的起始坐标,20 20表示训练的目标区域的宽和高,所以(0 0 20 20)就是一个和样本大小相同的矩形。至此,正样本描述文件就生成了。
3、接着生成正样本描述文件,因为Haartraining训练器输入的正样本文件是.vec格式,所以要把posdata.dat文件生成posdata.vec文件,生成路径为D:\classify\data\posdata.vec;怎么生成,打开OpenCV的bin文件,里面有一个opencv_createsamples.exe可执行文件,记住它;在D:\classify文件下新建记事本,编辑D:\OpenCV_MSVC\bin\opencv_createsamples.exe -vec D:\classify\data\posdata.vec -info D:\classify\posdata\posdata.dat -num 1000 -w 20 -h 20 中间不要有回车,保存重命名run.bat文件,双击这个文件,在D:\classify\data文件夹下生成了posdata.vec文件,这就是用于输入的正样本文件,说明一下这几个命令行,-vec是要生成.vec文件,-info是正样本描述文件,-num是样本的数量,-w -h是样本的宽和高。
4、训练自己的分类器,在D:\classify文件夹下,新建记事本,编辑d:\OpenCV_MSVC\bin\opencv_haartraining.exe -data d:\classify\data -vec d:\classify\data\posdata.vec -bg d:\classify\negdata\negdata.dat -npos 100 -nneg 100 -w 20 -h 20 保存,重命名classify.bat文件,双击这个文件。等待。。。,然后就生成如下图所示几个文件夹。
5、将上一步生成的文件生成xml文件,在opencv的目录下找到convert_cascade.c文件,我的路径是D:\OpenCV\opencv\sources\samples\c用VS新建工程,工程命名cascade,复制出convert_cascade.c里面的代码,配置好这个工程,编译之,VS的有些版本会报错sscanf这个函数不安全,解决方法:右击工程,点击属性按键,点击C/C++,点击预处理器,点击预处理器定义,加上一行,_CRT_SECURE_NO_WARNINGS,保存关闭,编译成功后,在工程目录中生成了cascade.exe文件,打开dos命令,输入cd\,输入d:,输入cd desktop\VS\Cascade\cascade\Release进入cascade.exe这个目录下,再输入cascade --size=20x20 D:\calssify\data D:\classify\data\cascade.xml回车,就会在data文件夹中生成cascade.xml文件。至此,分类器就已经训练好了,下一步该怎么应用这个分类器了。
应用代码如下:
string xmlPath = "D:/cascade.xml";
CascadeClassifier ccf;
Mat img = imread("D:/Pic/Face/1.jpg");
if(!ccf.load(xmlPath))
{
qDebug()<<"can not load xml.";
}
vector faces;
Mat gray;
cvtColor(img,gray,CV_BGR2GRAY);
equalizeHist(gray,gray);
ccf.detectMultiScale(gray,faces,1.1,3,0,Size(10,10),Size(100,100));
for(vector::const_iterator iter=faces.begin();iter!=faces.end();iter++)
{
rectangle(img,*iter,Scalar(0,0,255),2,8);
}
imshow("faces",img);
函数原型:
void CascadeClassifier::detectMultiScale(InputArray image, vector& objects, double scaleFactor=1.1, int minNeighbors=3, int flags=0, Size minSize=Size(), Size maxSize=Size())
总共有7个参数,分别是
OpenCV自带的分类器在source/data/haarcascade文件目录下。