【学习opencv】opencv人脸检测

首先利用opencv自带的训练文件haarcascade_frontalface_alt.xml和haarcascade_eye.xml检测人脸及人眼,其次初步尝试如何利用opencv训练数据以及获得训练文件(.xml).

一、利用opencv自带训练文件检测人脸

1. 创建级联分类器
2. 加载训练数据
3. 使用detectMultiScale方法检测人脸
4. 在人脸检测的基础上检测人眼
注意:在人脸的图片上检测人眼,则最后在原图画人眼时,注意坐标的转换

void detectMultiScale(
const Mat& image,
CV_OUT vector& objects,
double scaleFactor = 1.1,
int minNeighbors = 3,
int flags = 0,
Size minSize = Size(),
Size maxSize = Size()
);
参数1:待检测图片,一般为灰度图像加快检测速度;
参数2:检测结果容器;
参数3:表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%;
参数4:表示构成检测目标的相邻矩形的最小个数(默认为3个)。
参数5:flag默认值,可用默认值,也可设置CV_HAAR_DO_CANNY_PRUNING,那么函数将会使用Canny边缘检测来排除边缘过多或过少的区域。
参数6、7:minSize和maxSize用来限制得到的目标区域的范围。

代码:


#include<opencv2\opencv.hpp>
#include<opencv2\objdetect.hpp>
#include<opencv2\ml.hpp>
#include<iostream>
using namespace cv;
using namespace std;

string face_cascade_name = "E:\\myopencv\\install\\etc\\haarcascades\\haarcascade_frontalface_alt.xml";
//string face_cascade_name = "F:\\opencv3.0.1\\Standard Project\\CreateXml\\Create\\xml\\cascade.xml";
//使用自己的训练数据效果不好
string eye_cascade_name = "E:\\myopencv\\install\\etc\\haarcascades\\haarcascade_eye.xml";

int main()
{
Mat img = imread("pic\\face1.jpg",1);
Mat gray(img.rows*0.5,img.cols*0.5,CV_8UC1);
resize(img, img, gray.size());
//创建级联分类器对象
CascadeClassifier face_cascade, eye_cascade;
//加载级联分类器文件
if (!face_cascade.load(face_cascade_name))
{
cout << "face打开错误!" << endl;
return 0;
}
if (!eye_cascade.load(eye_cascade_name))
{
cout << "eye打开错误!" << endl;
return 0;
}

cvtColor(img,gray,CV_BGR2GRAY);
equalizeHist(gray,gray);
vector<Rect>faces;
face_cascade.detectMultiScale(gray,faces, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));
for (int i =0; i < faces.size(); i++)
{
//画矩形
rectangle(img,faces[i],Scalar(255,0,225),2,8);
Mat faceROI = gray(faces[i]);
//找眼睛
vector<Rect>eyes;
eye_cascade.detectMultiScale(faceROI,eyes, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));
for (int j = 0; j < eyes.size(); j++)
{
eyes[j].x = eyes[j].x + faces[i].x;
eyes[j].y = eyes[j].y + faces[i].y;
rectangle(img,eyes[j],Scalar(255,255,0),1,8);
}

}
imshow("facedect",img);
waitKey(0);
return 0;
}

结果图片

二、利用opencv训练的数据进行检测人脸

具体步骤参见博客:采用opencv_cascadetrain进行训练的步骤及注意事项

1. 准备正负样本
2. 生成vec文件
3. 利用opencv_cascadetrain.exe进行训练
注意点:负样本数目要比正样本数目多,而且负样本数量不能太少
从命令窗口进入opencv_cascadetrain.exe,
参数设置:
正样本数量为100,负样本数量为50的具体参数

opencv_traincascade.exe -data xml -vec pos.vec -bg neg.txt -numPos 10
-numNeg 50 -numStages 16 -precalcValbufSize 200 -precalcdxBufSize 1000 -featureType LBP


4.训练好后把生成的cascade.xml替换上述程序中的opencv自带的xml文件
结果:

效果不理想,正负样本的选择以及训练不到位。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值