首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >OpenCV系列(17)|人脸检测

OpenCV系列(17)|人脸检测

作者头像
用户9831583
发布2022-06-16 16:19:52
发布2022-06-16 16:19:52
6670
举报
文章被收录于专栏:码出名企路码出名企路

应用:人脸检测并画人脸框,但是精度不高。

实现:

代码语言:javascript
复制

#include <opencv2/imgproc.hpp>  
#include <opencv2/core.hpp>       
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>  
#include <opencv2/features2d.hpp>
#include <opencv2/objdetect.hpp>
#include <iostream>

#include <stdio.h>

using namespace std;
using namespace cv;

const string WindowName = "Face Detection example";

class CascadeDetectorAdapter: public DetectionBasedTracker::IDetector
{
    public:
        CascadeDetectorAdapter(cv::Ptr<cv::CascadeClassifier> detector):
            IDetector(),
            Detector(detector)
        {
            CV_Assert(detector);
        }

        void detect(const cv::Mat &Image, std::vector<cv::Rect> &objects) 
{
            Detector->detectMultiScale(Image, objects, scaleFactor, minNeighbours, 0, minObjSize, maxObjSize);//检测人脸
        }

        virtual ~CascadeDetectorAdapter() 
        {}

    private:
        CascadeDetectorAdapter();
        cv::Ptr<cv::CascadeClassifier> Detector;
 };

int main(int , char** )
{
    namedWindow(WindowName);

    VideoCapture VideoStream(0);

    if (!VideoStream.isOpened())
    {
        printf("Error: Cannot open video stream from camera\n");
        return 1;
    }

    std::string cascadeFrontalfilename = ("../../data/lbpcascades/lbpcascade_frontalface.xml");//训练结果
    cv::Ptr<cv::CascadeClassifier> cascade = makePtr<cv::CascadeClassifier>(cascadeFrontalfilename);//智能指针
    cv::Ptr<DetectionBasedTracker::IDetector> MainDetector = makePtr<CascadeDetectorAdapter>(cascade);//创建一个跟踪适配器
    if ( cascade->empty() )
    {
      printf("Error: Cannot load %s\n", cascadeFrontalfilename.c_str());
      return 2;
    }
    //创建一个跟踪适配器
    cascade = makePtr<cv::CascadeClassifier>(cascadeFrontalfilename);
    cv::Ptr<DetectionBasedTracker::IDetector> TrackingDetector = makePtr<CascadeDetectorAdapter>(cascade);
    if ( cascade->empty() )
    {
      printf("Error: Cannot load %s\n", cascadeFrontalfilename.c_str());
      return 2;
    }
    //利用跟踪适配器
    DetectionBasedTracker::Parameters params;
    DetectionBasedTracker Detector(MainDetector, TrackingDetector, params);
    //开启跟踪器
    if (!Detector.run())
    {
        printf("Error: Detector initialization failed\n");
        return 2;
    }

    Mat ReferenceFrame;
    Mat GrayFrame;
    vector<Rect> Faces;//矩形框合集

    do
    {
        VideoStream >> ReferenceFrame;
        cvtColor(ReferenceFrame, GrayFrame, COLOR_BGR2GRAY);
        //增强对比度 (直方图均衡)
        equalizeHist(GrayFrame, GrayFrame);
        //人脸个数
        Detector.process(GrayFrame);
        Detector.getObjects(Faces);

        for (size_t i = 0; i < Faces.size(); i++)
        {   
            std::cout<<Faces[i].tl()<<" "<<Faces[i].br()<<" "<<Faces[i].width<<" "<<Faces[i].height;
            rectangle(ReferenceFrame, Faces[i], Scalar(0,255,0));
        }

        imshow(WindowName, ReferenceFrame);
    } while (waitKey(3) < 0);

    Detector.stop();

    return 0;
}

效果:


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码出名企路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档