opencv实现自己训练的Adaboost(Haar-like)检测识别库

来源:互联网 发布:linux c 创建文件 编辑:程序博客网 时间:2024/05/19 09:40

前几周在网上看到了利用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。
这里写图片描述

此时弹出选择框,我用的是2013,opencv是64位,所以我选择vs2013 64位的。点击Finish。
这里写图片描述
程序开始执行
这里写图片描述
直到Generate可以选择时,点击Generate。等待Open Project可以选择时,打开生成的工程文件。点击生成解决方案。又是等待,等待执行完成。直到出现如下图
这里写图片描述
这里又是会有失败项,或者跳过项,这里我们看生成的文件里面如果包含opencv_createsamplesd.exe和opencv_haartrainingd.exe文件时,就不用管这些错误。我们需要的已经得到了。
将这两文件拷贝到训练文件下。
文件下包含如下文件
这里写图片描述
其中negdata.txt和posdata.txt文件获取方法。
在对应 图片文件夹下,建立pos.bat文件。
这里写图片描述
在对应的bat文件中输入对应的命令
这里写图片描述
这里写图片描述
将对应txt文件替换为如图格式
这里写图片描述
这里写图片描述
其中0 0为图片起始点,20 20为结束点。

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

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

接着输入opencv_createsamplesd.exe -info posdata.txt -vec pos.vec -num 18587 -w 20 -h 20
其中18587是图片个数
此时会在文件夹下生成pos.vec文件
这里写图片描述
接着输入opencv_haartrainingd.exe -data xml -vec pos.vec -bg negdata.txt -nsplits 1 -sym -w24 -h 24 -mode all -mem 1280指令。如图
这里写图片描述
这里需要注意,此训练至少需要半个小时,如果半个小时以后没有数据没有刷新,可以强制结束(Ctrl+C)。
此时可以看到xml下生成了相应的数据。
这里写图片描述

此时在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文件
这里写图片描述

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

    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);

好了,整个过程结束了。
资源下载链接:http://download.csdn.net/download/oemt_301/10154511

阅读全文
0 0
原创粉丝点击