Qt+Opencv:人脸检测

话接上一篇,我们仍使用在上篇《Qt+Opencv:Qt中部署opencv》创建的Qt项目来测试opencv提供的sample。

在正式开始本篇之前,我们先说做一下准备工作:

一、opencv官方文档

学习最权威和最可靠的方式,就是阅读官方文档和实践模块samples。同样,opencv的文档个人觉得做的还是可以的,当然,相对于我们熟悉Qt开发的朋友来说,这帮助文档还是“略微逊色”。
上篇,我们选定opencv 3.4.16 版本进行工程实践,所以我们对应去看该版本的文档即可。
doc地址:https://docs.opencv.org/3.4.16/
在这里插入图片描述

有朋友会问3.0和4.0的版本有什么大的变化么,答案是我目前也不知道,后面在逐渐精进深入的过程中,版本特性比较,必然也是我们要做的工作之一。所谓知己知彼,百战不殆。手握神剑,当然要尽可能把圣剑之威力发挥的淋漓尽致。不过话说回来,opencv太大面太广,深入研究某一模块到极致就可惊为天人了,不必泛泛求全。但是,保持对知识的贪婪和饥渴,总能促使人不断的学习和进步。话说,作者写这篇的时候已经忘记吃饭。

二、下载源码和samples

地址:https://github.com/opencv/opencv/tree/3.4

在这里插入图片描述
data中有我们本章人脸检测的数据模型,需要拷贝到我们Qt自己的项目目录下。譬如作者自己的:
在这里插入图片描述

三、项目实践

#include <QApplication>
#include <opencv.hpp>
#include <QDebug>
#include <opencv2/imgproc.hpp>  // Gaussian Blur
#include <opencv2/core.hpp>     // Basic OpenCV structures (cv::Mat, Scalar)
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>  // OpenCV window I/O
#include <opencv2/features2d.hpp>
#include <opencv2/objdetect.hpp>
#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) CV_OVERRIDE
        {
   
            Detector->detectMultiScale(Image, objects, scaleFactor, minNeighbours, 0, minObjSize, maxObjSize);
        }

        virtual ~CascadeDetectorAdapter() CV_OVERRIDE
        {
   }

    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 = samples::findFile("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);
        Detector.process(GrayFrame);
        Detector.getObjects(Faces);  
        
        for (size_t i = 0; i < Faces.size(); i++)
        {
   
            rectangle(ReferenceFrame, Faces[i], Scalar(0,255,0));  /// 人脸检测并绘制矩形
        }

        imshow(WindowName, ReferenceFrame);
    } while (waitKey(30) < 0);  /// 等待按键触发,退出检测loop

    Detector.stop();

    return 0;
}

四、效果演示(博主自爆了*)

在这里插入图片描述
下一张我们深入研究人脸检测(此模型只支持正脸)的实现,以及模型文件杂谈一二~

相关推荐

  1. 人脸检测算法

    2023-12-29 09:34:02       31 阅读
  2. 编写人脸检测程序

    2023-12-29 09:34:02       17 阅读
  3. python 人脸检测人脸识别

    2023-12-29 09:34:02       27 阅读
  4. 小程序人脸识别—检测人脸图片获取图片

    2023-12-29 09:34:02       26 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-29 09:34:02       14 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-29 09:34:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-29 09:34:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-29 09:34:02       18 阅读

热门阅读

  1. 短剧风吹到游戏:网易、完美世界前赴后继

    2023-12-29 09:34:02       28 阅读
  2. Tor网络-洋葱网络(匿名通信的网络)学习记录-简介

    2023-12-29 09:34:02       108 阅读
  3. c# 纤程 FiberTaskScheduler

    2023-12-29 09:34:02       27 阅读
  4. elementui 表单校验validate不起效果

    2023-12-29 09:34:02       43 阅读
  5. react 为什么要重构架构

    2023-12-29 09:34:02       34 阅读
  6. Android系列-LayoutInflater 几个 inflate方法的区别

    2023-12-29 09:34:02       37 阅读