(八)基于OpenCV的人脸检测功能

我们都知道OpenCV是一个开源的视觉库,可以完成很多图像处理的工作,这次我要加入的功能是人脸检测。从摄像头获取的数据中,再每一帧中寻找人脸,并且框处人脸的范围。注意:这里的人脸检测并不是分辨不同的人脸,而是检测图像中是否存在人脸。

首先我们要采集摄像头的每一帧数据,这段代码在第一章中就已经完成,接下来就是人脸检测的环节。

我才用了haar级联算子进行人脸检测,这也是OpenCV中最常用的一种方法,首先我们要声明一个级联分类器

cv::CascadeClassifier faceCascade;

有了级联分类器之后,我们还需要加载级联文件,这个文件在源码包的data文件夹下,可以看到有一个haarcascades命名的文件夹

可以看到,这个文件夹里面的文件都是使用haar级联算子完成的,包括人脸检测,人眼、身体,笑脸等等,这些文件都是官方训练好的文件,可以直接使用。当然如果你需要其他的特征的检测,也可以自己进行训练。

这一次我们使用的文件是haarcascade_frontalface_alt2.xml

将文件导入分类器

faceCascadeName = "/home/project/opencv/test/7/opencv_7/haarcascades/haarcascade_frontalface_alt2.xml";
faceCascade.load(faceCascadeName.toStdString()

人脸检测部分的代码如下

cv::Mat MainWidget::faceCasePic(cv::Mat img)
{
    using namespace cv;

    Mat frame, frameGray;
    frame = img;

    //缩放系数
    float scalingFactor = 0.75;
    std::vector<Rect> faces;

    //改变大小
    cv::resize(frame, frame, Size(), scalingFactor, scalingFactor, INTER_AREA);

    //转换灰度
    cvtColor(frame, frameGray, CV_BGR2GRAY);

    //均衡直方图
    equalizeHist(frameGray, frameGray);

    //检测脸部
    faceCascade.detectMultiScale(frameGray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30,30));

    //框出人脸
    for(uint i=0; i < faces.size(); i++)
    {
        Rect feceRect(faces[i].x, faces[i].y, faces[i].width, faces[i].height);

        rectangle(frame, feceRect, Scalar(0,0,255), 2, LINE_AA);
    }

    return frame;
}

传入需要检测的图像,返回框出人脸的图像,如果没有检测到人脸,则返回原图像。

 

完整的源码放在github上,有需要可以自行下载。 代码名称为190526.zip

https://github.com/ljy980330/opencv_face_sys

 

有任何问题可以在下面给我留言!大家一起学习!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值