OpenCV人脸识别:识别是否是人脸,是的话用红线把人脸框出来

一、效果展示

OpenCV人脸识别:识别是否是人脸,是的话用红线把人脸框出来_第1张图片 

 

二、代码如下

#include 
#include 
#include "opencv2/imgproc/imgproc_c.h"
using namespace cv;
using namespace std;

//人脸识别
void datectFace(Mat& frame, CascadeClassifier cascade, double scale)
{
    //灰度化处理 节省内存
    Mat gray;
    cvtColor(frame, gray, COLOR_RGB2GRAY);

    //级联分类器比帧差法还更慢,因此,需要再将灰度图大小压缩一半左右 行列压缩
    Mat smalling(cvRound(frame.rows / scale), cvRound(frame.cols / scale), CV_8UC1);
    //按存储大小计算  压缩方式采用线性压缩
    resize(gray, smalling, smalling.size(), 0, 0, INTER_LINEAR);

    //直方图均值化 让灰度图经过直方图函数处理 黑白分明
    equalizeHist(smalling, smalling);
    //imshow("smalling",smalling);

    //调用级联分类器进行模型匹配并进行框选识别 使用模型去进行每一个像素点的遍历
    vectorfaces;
    //使用CV_HAAR_SCALE_IMAGE算法 图像甄别
    cascade.detectMultiScale(smalling, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
    //绘制矩形
    vector::const_iterator iter;
    //使用到容器迭代器进行遍历
    for (iter = faces.begin(); iter != faces.end(); iter++)
    {
        rectangle(frame,
            cvPoint(cvRound(iter->x * scale), cvRound(iter->y * scale)),//左上
            cvPoint(cvRound((iter->x + iter->width) * scale), cvRound((iter->y + iter->height) * scale)),//右下
            Scalar(0, 0, 255), 2, 8//颜色 像素位
        );
    }
    imshow("frame", frame);
}

int main(int argc, char* argv[])
{
    //级联分类器对象
    CascadeClassifier cascade;
    //读取级联分类器
    cascade.load("D:/桌面上的文件/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml");

    Mat frame;
    //视频路径的获取
    VideoCapture cap(0);
    while (cap.read(frame))
    {
        //将读到的帧进行显示
        imshow("frame", frame);
        //检测识别 图像 级联分类器 比例
        datectFace(frame, cascade, 2);
        waitKey(3);
    }
    return 0;
}

你可能感兴趣的:(opencv,图像处理)