今天五一假期最后一个晚上,写篇博客回回神,今天早上跑了30公里,没啥状态,死撑了4个小时,前两天到处逛,没休息好,今天跑完,睡了一下午,囧……
OpenCV提供了人脸识别的训练数据,因此,可以用它的训练数据来对人脸进行识别,打开opencv的安装目录看看,在share目录下,opencv给我们提供了不少训练结果的xml文件,我们找到圈住的这个:
这里我们使用xcode编写程序来测试,不过都是c++代码,移植到其他平台很容易都可以使用的。
1. 首先,包含必要头文件:
2.把前面说到的"haarcascade_frontalface_alt.xml"文件拉到项目工程目录下
3. 接下来,大家让开,我要开始识(zhaung)别(bi)人脸了,代码如下:
-(IBAction)btnFaceAndDetection:(id)sender {
CascadeClassifier face_cascade;
if (!face_cascade.load([PATH_FACE_DETECTION_XML UTF8String])) {
[self showAlertWindow:@"加载脸部识别神经网络数据文件错误,请重试"];
return;
}
if (![self hasImageShow]) {
NSAlert *alert = [[NSAlert alloc] init];
[alert setMessageText:@"请先选择图片"];
[alert runModal];
return;
}
Mat img = imread([_curFullFilePath UTF8String]);
std::vector<cv::Rect> faces;
Mat frame_gray;
cvtColor(img, frame_gray, COLOR_BGR2GRAY);
equalizeHist(frame_gray, frame_gray);
face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0|CASCADE_SCALE_IMAGE, cv::Size(30, 30));
for (size_t i = 0; i < faces.size(); i++) {
cv::Point center(faces[i].x+faces[i].width/2, faces[i].y+faces[i].height/2);
ellipse(img, center, cv::Size(faces[i].width/2, faces[i].height/2), 0, 0, 360, cv::Scalar(255, 0, 0), 2, 8, 0);
}
imwrite([PATH_FACE_DETECT_OUT_TMP UTF8String], img);
[_imageOutput setImage:[[NSImage alloc] initWithContentsOfFile:(NSString *)PATH_FACE_DETECT_OUT_TMP]];
}
步骤说明:
1. 首先加载脸部识别训练好的数据xml文件,加载失败则直接退出
2. 判断是否选择了要识别的图片
3. 读入图片到img对象,接着把它转为灰度图像,便于后续处理
4. 对3步得到的灰度图像进行直方图均衡化,它是通过拉伸像素强度分布范围来增强图像对比度的一种方法,比如处理前图像的灰度直方图呈中间高两边低,处理后,则在两边进行了增强,从而和中间差别进一步降低
5. 调用识别对象函数:
6. 描绘识别到的人脸并进行显示,下面是效果:
最近《人民的名义》电视剧比较火,就拿它来“开刀”吧~
OK,识别到3个人脸。