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
- opencv实现自己训练的Adaboost(Haar-like)检测识别库
- 使用OpenCV训练Haar like+Adaboost分类器的常见问题
- OpenCV学习记录(二):自己训练haar特征的adaboost分类器进行人脸识别
- 《FAQ:OpenCV Haartraining》——使用OpenCV训练Haar like+Adaboost分类器的常见问题
- 《FAQ:OpenCV Haartraining》——使用OpenCV训练Haar like+Adaboost分类器的常见问题
- 《FAQ:OpenCV Haartraining》——使用OpenCV训练Haar like+Adaboost分类器的常见问题
- 【原】训练自己的haar-like特征分类器并识别物体(3)
- 训练自己的haar-like特征分类器并识别物体(3)
- 【OpenCV】基于Adaboost和Haar-like特征人脸识别
- 【OpenCV】基于Adaboost和Haar-like特征人脸识别
- 【OpenCV】基于Adaboost和Haar-like特征人脸识别
- 【OpenCV】基于Adaboost和Haar-like特征人脸识别
- 【OpenCV】基于Adaboost和Haar-like特征人脸识别
- 车牌识别技术详解六--基于Adaboost+haar训练的车牌检测
- Boosting(Adaboost+Haar-like人脸识别)
- AdaBoost利用haar-like特征做人脸识别(1)
- AdaBoost利用haar-like特征做人脸识别(2)
- 【原】训练自己haar-like特征分类器并识别物体(1)
- 股票数据预处理
- leetcode 504. Base 7
- selenium + c#做自动化时遇到的问题
- 40 Three.js线性几何体材质THREE.LineDashedMaterial
- 手机窗体上悬浮显示
- opencv实现自己训练的Adaboost(Haar-like)检测识别库
- Java开发快递物流项目(7)
- TensorFlow的android移植
- TCP和UDP
- 编程教学虎书:实践最佳平滑路径与参考code,demobase
- 除了LINUX,我们真的有可选的第二开源操作系统吗?
- 无法运行"Hi3516CV-DEMB-uboot-DDR...-BUS_266M.xsl"宏。可能是因为该宏在此工作簿中不可用,或者所有的宏都被禁用。
- 初识Python
- 顺序表栈的基本操作