OpenCV训练人脸分类器步骤解析

从网上下载人脸图片正样本,背景负样本各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文件,双击这个文件。等待。。。,然后就生成如下图所示几个文件夹。

OpenCV训练人脸分类器步骤解析_第1张图片

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个参数,分别是

第一个参数image: 要检测的图片,一般为灰度图

第二个参数objects: Rect型的容器,存放所有检测出的人脸,每个人脸是一个矩形

第三个参数scaleFactor: 缩放因子,对图片进行缩放,默认为1.1

第四个参数minNeighbors: 最小邻居数,默认为3

第五个参数flags: 兼容老版本的一个参数,在3.0版本中没用处。默认为0

第六个参数minSize: 最小尺寸,检测出的人脸最小尺寸

第七个参数maxSize: 最大尺寸,检测出的人脸最大尺寸

OpenCV自带的分类器在source/data/haarcascade文件目录下。

你可能感兴趣的:(OpenCV图像处理)