c++使用opencv完成人脸检测

1 篇文章 0 订阅
1 篇文章 0 订阅

opencv是开源的计算机视觉库,实现人脸检测我们使用的是opencv库中帮我们训练好的检测器,一般在D:\opencv\sources\data\haarcascades目录下有各种检测器。


可以根据各种要求选择不同的训练器,我是结合了官网中的demo检测了人脸和人眼。代码有详细的注释,当然我还添加了一部分对图像的处理函数,有兴趣的可以了解一下。

各种函数参数都可以取opencv官网查看。

我使用的是opencv4.11和vs2017.

 

#include<opencv2/opencv.hpp>
#include<iostream>

using namespace cv;
using namespace std;

//识别人眼
void eyeDetect(Mat& image,Mat& Frame,vector<Rect> Eyes,CascadeClassifier& EyeDetector,double s)
{
    EyeDetector.detectMultiScale(image, Eyes, 1.1, 3, 0, Size(0, 0));
    
    for (int i = 0; i < Eyes.size(); i++)
    {

        
        Mat roi = Frame(Rect(Eyes[i].x*s,Eyes[i].y*s,Eyes[i].width*s,Eyes[i].height*s));
        resize(roi, roi, Size(Eyes[i].width*s * 1.2, Eyes[i].height *s* 1.2));
        //Mat ROI = Frame(Rect((Eyes[i].x*s - (roi.cols-Eyes[i].width*s)/2), (Eyes[i].y*s - (roi.rows - Eyes[i].height*s) / 2),roi.cols,roi.rows));
        //Mat p = imread("2.jpg",0);
        //roi.copyTo(ROI);
        //生成矩形框,颜色为绿色
        rectangle(Frame, Point(Eyes[i].x, Eyes[i].y)*s, Point(Eyes[i].x + Eyes[i].width, Eyes[i].y + Eyes[i].height)*s, Scalar(0, 255, 0), 1, 8);
    
    }
    
}
//对暂时保存的图像进行亮度的调节
void beautifyFace(Mat& matSelfPhoto, float alpha, float beta)
{
    for (int y = 0; y < matSelfPhoto.rows; y++)
    {
        for (int x = 0; x < matSelfPhoto.cols; x++)
        {
            for (int c = 0; c < 3; c++)
            {
                matSelfPhoto.at<Vec3b>(y, x)[c] = saturate_cast<uchar>(alpha*(matSelfPhoto.at<Vec3b>(y, x)[c]) + beta);
            }
        }
    }
}
//人脸识别函数
void facedetected(Mat & IMG, Mat& Frame,vector<Rect>& faces1, CascadeClassifier& facedetect, double &Scale) {
    

    //人脸检测
    facedetect.detectMultiScale(IMG, faces1, 1.1, 3, 0, Size(0, 0));


    for (int i = 0; i < faces1.size(); i++)
    {
        Rect rect = faces1[i];

        //生成矩形框,颜色为绿色

        rectangle(Frame, Point(faces1[i].x, faces1[i].y)*Scale, Point(faces1[i].x + faces1[i].width, faces1[i].y + faces1[i].height)*Scale, Scalar(0, 255, 0), 1, 8);

        //设置矩形区域并将人脸设立成为感兴趣区域,并传入函数对所选取区域进行美颜

        Mat imageROI = Frame(Rect(faces1[i].x*Scale, faces1[i].y*Scale, faces1[i].width*Scale, faces1[i].height*Scale));


        //磨皮处理
        //bilateralFilter(imageROI, a, 30, 30 * 2, 30 / 2);
    }
}
    

    int main(int argc, const char** argv) {
        CascadeClassifier faceDector,eyesDector;
        eyesDector.load("D:/opencv/sources/data/haarcascades/haarcascade_eye.xml");
        faceDector.load("D:/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml");
        double scale = 4;
        //打开摄像头
        /*VideoCapture capture(0);
        //cout << capture.get(CAP_PROP_FPS) << endl;
        if (!capture.isOpened()) {
            cout << "摄像头打开失败" << endl;
            return -1;
        }*/


        Mat  img, a;
        vector<Rect> faces;
        vector<Rect> eyes;
        Mat frame0 = imread("1.jpg");
        imshow("1", frame0);
        Mat frame = frame0;
        if (frame.empty()) {
            cout << "打开失败";
            return -1;
        }
        
            //转成灰度图
            cvtColor(frame, img, COLOR_RGB2GRAY);
            //imshow("22222", img);
            //缩放图像提高效率         
            resize(img, img, Size(), 1 / scale, 1 / scale, INTER_LINEAR_EXACT);

            //直方图均衡化
            equalizeHist(img, img);
            

            eyeDetect(img, frame, eyes, eyesDector, scale);
            facedetected(img,frame, faces, faceDector, scale);
            //调用亮度调节函数
            //beautifyFace(frame, 1.1, 68);

            //高斯模糊
            //GaussianBlur(frame, frame, Size(9, 9), 0, 0);

            cv::imshow("2", frame);
            waitKey(0);
            return 0;

}

代码效果:


 

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值