#include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #includeusing namespace cv; using namespace std; #define DST_IMG_WIDTH 24 //需要的图像宽度 #define SRC_IMG_HEIGH 24 //需要的图像高度 int main() { cout<<"归一化开始........"< string output_f; output_f = string("F:\\opencv练习\\图像缩放\\图像缩放\\yale_faces_size\\"); for(int i=1;i<=15;i++) //15个人的人脸数据 { for(int j=1;j<=11;j++) //每个人的有11张人脸图像 { string path=format("yale_faces/s%d/%d_s%d.bmp",i,i,j); //初始化读取文件路径名 Mat src; src=imread(path,1); if(!src.data) { cout<<"图像加载失败"< exit(1); } imshow("src",src); Mat dst(DST_IMG_WIDTH,SRC_IMG_HEIGH,src.type()); resize(src,dst,dst.size(),0,0,INTER_LINEAR); string outName=format("%s/%d_s%d.bmp",output_f.c_str(),i,j);//初始化输出文件路径名 imwrite(outName,dst); imshow("2",dst); waitKey(100); //延时100ms.为了显示图像 } } cout<<"归一化结束........"< waitKey(0); return 0; }
(2)变换前图像
在yale_faces目录有15个人的人脸图像s1-s15,每个人有11张头像。
(3)变化后,图像输出24*24大小的图像。
2、准备正负样本
(1)正样本:标准化后24*24的图像用作训练用的正样本。选取其中的135张作为正样本图像,剩余30张作为测试图像。
(2)负样本:要求是:不能包含人脸,且图片大小也不需要归一化到正样本尺寸,只需比正样本尺寸大或者相等即可。建议负样本用灰度图,加快训练速度,且负样本一定不能重复,要增大负样本的差异性。
(3)新建两个文件夹p_images、neg_images和test_images,p_images中放入的是正样本图片,n_images放入的是负样本图片,test_images放入的是测试样本。并将后面要用到的2个工具.exe(opencv_haartraining.exe和opencv_createsamples.exe)文件也拷贝过来(在opencv的安装目录opencv\build\x86\vc10\bin下)。
(4)生成正负样本描述文件:
打开cmd命令行窗口,进入上图所在p_images文件夹内,可以看到此文件夹图片显示如下:
使用命令将图片名导入文件pos_images.txt中。命令为:dir /b >pos_images.txt
删除最后一行,最后将名字归一化如下所示
其中的p_images/是相对路径名,后面紧接着的是文件名,1代表一个文件,0 0 24 24表示这个文件的2个顶点位置坐标。保存退出即ok!
也是进入n_imgaes后在cmd内使用命令dir /b >n_images.txt,如图所示:
到此为止,训练数据准备完备了。
3、创建vec文件
(1) 在创建vec文件时,需要把pos_images.txt和n_images.txt两个样本描述文件剪切到上一目录,如图所示:
(2)然后利用opencv_createsamples.exe应用程序在该目录下使用如下cmd命令:
>opencv_createsamples.exe -vec pos.vec -info pos_images.txt -bg n_images.txt -w 24 -h 24 -num 135
有的也用作:>opencv_createsamples.exe -vec pos.vec -info pos_images.txt -num 135 -w 24 -h 24
其中:-vec是指定后面输出vec文件的文件名,-info指定正样本描述文件,-bg指定负样本描述文件,-w和-h分别指正样本的宽和高,-num表示正样本的个数。执行完该命令后就会在当前目录下生产一个pos.vec文件了。
4、使用opencv_haartraining.exe文件进行训练
(1) 首先在当前目录下新建一个xml文件夹用于存放生成的.xml文件。
在当前目录使用cmd命令:
>opencv_haartraining -data xml -vec pos.vec -bg n_images.txt -npos 20 -mem 200 -mode all -w 24 -h24
或者opencv_haartraining -data xml -vec pos.vec -bg n_images.txt -mem 200 -w 24 -h24
其中:
-mem 256表示允许使用计算机的256内存, -mode all 表示使用haar特征集的种类,BASIC仅仅使用垂直特征,ALL表示使用垂直以及45度旋转特征. -data 指定生成xml的文件目录, -vec vec文件名, -bg 负样本描述文件名称,也就是负样本的说明文件(.dat) -nstage 20 指定训练层数,推荐15~20,层数越高,耗时越长。 -nsplits 分裂子节点数目,选取默认值 2 -minhitrate 最小命中率,即训练目标准确度。 -maxfalsealarm最大虚警(误检率),每一层训练到这个值小于0.5时训练结束,进入下一层训练, -npos 在每个阶段用来训练的正样本数目, -nneg在每个阶段用来训练的负样本数目 这个值可以设置大于真正的负样本图像数目,程序可以自动从负样本图像中切割出和正样本大小一致的,这个参数一半设置为正样本数目的1~3倍 -w -h样本尺寸, -sym或者-nonsym,后面不用跟其他参数,用于指定目标对象是否垂直对称,若你的对象是垂直对称的,比如脸,则垂直对称有利于提高训练速度
5.实验验证