前几周在网上看到了利用opencv自带的人脸检测xml文件,实现人脸检测。最后想通过自己的训练来实现人脸检测,从而扩展到实现其他目标检测。在网上也看到了许多资料,都讲得特别好。我这里做个总结,防止忘记。

首先是环境:win10+vs2013+opencv-2.4.13+cmake-3.8.0

这里我想多说两句,由于opencv3.x没有源文件没有haartraining源文件,因此只能选择opencv2.x版本。其中尝试过奖opencv2.x里的文件拷到opencv3.x文件中,但是并cmake运行一直报错,通过该了内部文件,也没有现实利用opencv3.x来实现自己的训练库。且vs2013以后版本也不支持opencv2.x,因此。现在最高的版本就只能选择vs2013+opencv-2.4.13。不多说了,开始说如何利用相关软件实现自己的检测库。

首先是将opencv中的源文件编译为可执行文件。这里要使用cmake对源文件进行处理。

首先选择opencv源文件路径,在选择生成文件路径。最后点击Configure。

opencv模型训练负样本 opencv 训练_opencv

此时弹出选择框,我用的是2013,opencv是64位,所以我选择vs2013 64位的。点击Finish。

opencv模型训练负样本 opencv 训练_adaboost算法详解_02


程序开始执行

opencv模型训练负样本 opencv 训练_haar特征_03


直到Generate可以选择时,点击Generate。等待Open Project可以选择时,打开生成的工程文件。点击生成解决方案。又是等待,等待执行完成。直到出现如下图

opencv模型训练负样本 opencv 训练_opencv模型训练负样本_04


这里又是会有失败项,或者跳过项,这里我们看生成的文件里面如果包含opencv_createsamplesd.exe和opencv_haartrainingd.exe文件时,就不用管这些错误。我们需要的已经得到了。

将这两文件拷贝到训练文件下。

文件下包含如下文件

opencv模型训练负样本 opencv 训练_opencv_05


其中negdata.txt和posdata.txt文件获取方法。

在对应 图片文件夹下,建立pos.bat文件。

opencv模型训练负样本 opencv 训练_adaboost算法详解_06


在对应的bat文件中输入对应的命令

opencv模型训练负样本 opencv 训练_opencv_07


opencv模型训练负样本 opencv 训练_cmake-使用_08


将对应txt文件替换为如图格式

opencv模型训练负样本 opencv 训练_haar特征_09


opencv模型训练负样本 opencv 训练_haar特征_10


其中0 0为图片起始点,20 20为结束点。

其中xml文件夹为空文件,用来保存生成的数据文件。

下一步就是训练我们自己的库了。以管理员身份运行cmd,将路径指定到训练文件夹下

opencv模型训练负样本 opencv 训练_cmake-使用_11

接着输入opencv_createsamplesd.exe -info posdata.txt -vec pos.vec -num 18587 -w 20 -h 20

其中18587是图片个数

此时会在文件夹下生成pos.vec文件

opencv模型训练负样本 opencv 训练_opencv模型训练负样本_12


接着输入opencv_haartrainingd.exe -data xml -vec pos.vec -bg negdata.txt -nsplits 1 -sym -w24 -h 24 -mode all -mem 1280指令。如图

opencv模型训练负样本 opencv 训练_adaboost算法详解_13


这里需要注意,此训练至少需要半个小时,如果半个小时以后没有数据没有刷新,可以强制结束(Ctrl+C)。

此时可以看到xml下生成了相应的数据。

opencv模型训练负样本 opencv 训练_cmake-使用_14

此时在vs中输入如下程序

char*haartraining_ouput_dir = "C:\\Users\\xxxxxx\\Desktop\\haar_test\\xml"; //根据实际情况修改
    char*ouput_file = "C:\\Users\\xxxxxx\\Desktop\\haar_test\\xml\\haar_adaboost.xml";//根据实际情况修改

    const char *size_opt = "--size=";
    char comment[1024];
    CvHaarClassifierCascade*cascade = 0;
    CvSize size;

    size.width = 20; //根据实际情况修改
    size.height = 20; //根据实际情况修改

    cascade = cvLoadHaarClassifierCascade(haartraining_ouput_dir, size);

    cvSave(ouput_file, cascade, 0, comment, cvAttrList(0, 0));

可以生成用于检测的xml文件

opencv模型训练负样本 opencv 训练_haar特征_15

好,训练已经结束,下面就是检测了。

string xmlPath = "C:\\Users\\xxxxxx\\Desktop\\haar_test\\xml\\haar_adaboost.xml";
    CascadeClassifier ccf;   //创建分类器对象
    Mat img = imread("待检测图片路径");
    if (!ccf.load(xmlPath))   //加载训练文件
    {
        cout << "不能加载指定的xml文件" << endl;
        return 0;
    }
    vector<Rect> faces;  //创建一个容器保存检测出来的脸
    Mat gray;
    cvtColor(img, gray, CV_BGR2GRAY); //转换成灰度图,因为harr特征从灰度图中提取
    equalizeHist(gray, gray);  //直方图均衡行
    ccf.detectMultiScale(gray, faces, 1.1, 3, 0, Size(20, 20), Size(50, 50)); //检测人脸
    for (vector<Rect>::const_iterator iter = faces.begin(); iter != faces.end(); iter++)
    {
        rectangle(img, *iter, Scalar(0, 0, 255), 2, 8); //画出脸部矩形
    }
    imshow("faces", img);
    waitKey(0);

好了,整个过程结束了。