使用OpenCV来进行人脸识别

今天五一假期最后一个晚上,写篇博客回回神,今天早上跑了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个人脸。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值