OpenCV4.x(C++)人脸检测(眼睛、侧脸、正脸)

news2025/5/14 14:47:06

一、前言

OpenCV是一款广泛使用的计算机视觉库,提供了许多强大的功能,包括人脸检测和识别。人脸分类器是OpenCV中用于人脸检测的关键工具之一,能够快速准确地检测出图像中的人脸。

本文将介绍如何使用OpenCV自带的人脸分类器,并对比不同分类器的精度。

在日常生活中,人脸检测的应用非常广泛,例如安防、人机交互、智能交通等领域。而在计算机视觉领域,人脸检测也是一个非常热门的研究方向。OpenCV作为一款免费、开源的计算机视觉库,为我们提供了一种方便快捷的人脸检测方法。使用OpenCV的人脸分类器,可以快速地检测出图像中的正脸、侧脸和眼睛等部位,进而实现更加智能的应用。

OpenCV自带的Haar级联分类器模型:

haarcascade_eye.xml: 这个模型用于检测眼睛。
haarcascade_eye_tree_eyeglasses.xml: 这个模型用于检测眼镜。
haarcascade_frontalcatface.xml: 这个模型用于检测猫脸。
haarcascade_frontalcatface_extended.xml: 这个模型用于扩展的猫脸检测。
haarcascade_frontalface_alt.xml: 这个模型是一个备用的面部检测模型。
haarcascade_frontalface_alt2.xml: 这个模型是另一个备用的面部检测模型。
haarcascade_frontalface_alt_tree.xml: 这个模型是用于面部检测的备用树模型。
haarcascade_frontalface_default.xml: 这个模型是用于面部检测的默认模型。
haarcascade_fullbody.xml: 这个模型用于全身检测。
haarcascade_lefteye_2splits.xml: 这个模型用于检测左眼。
haarcascade_licence_plate_rus_16stages.xml: 这个模型用于检测俄罗斯车牌。
haarcascade_lowerbody.xml: 这个模型用于下半身检测。
haarcascade_profileface.xml: 这个模型用于侧面脸部检测。
haarcascade_righteye_2splits.xml: 这个模型用于检测右眼。
haarcascade_russian_plate_number.xml: 这个模型用于检测俄罗斯车牌号码。
haarcascade_smile.xml: 这个模型用于微笑检测。

这些文件在OpenCV的安装目录下。

image-20230920150013691

二、代码实现

2.1 人脸分类器检测人脸

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/imgproc/imgproc.hpp>

int main()
{
    // 加载人脸分类器
    cv::CascadeClassifier faceCascade;

    //分类器文件下载地址: https://github.com/opencv/opencv/tree/master/data/haarcascades
    //在OpenCV的源码目录下其实也有(opencv\build\etc\haarcascades)。
    //下载后放到C盘根目录即可.
    faceCascade.load("C:/haarcascade_frontalface_alt2.xml");

    // 打开摄像头
    cv::VideoCapture capture(0);
    if (!capture.isOpened())
    {
        std::cout << "无法打开摄像头" << std::endl;
        return -1;
    }

    // 创建窗口
    cv::namedWindow("Face Detection", cv::WINDOW_NORMAL);

    while (true)
    {
        cv::Mat frame;
        capture >> frame; // 读取视频帧

        // 将彩色图像转换为灰度图像以加快处理速度
        cv::Mat grayFrame;
        cv::cvtColor(frame, grayFrame, cv::COLOR_BGR2GRAY);

        // 对图像进行人脸检测
        std::vector<cv::Rect> faces;
        faceCascade.detectMultiScale(grayFrame, faces, 1.1, 3, 0, cv::Size(30, 30));

        // 在图像上绘制人脸边界框
        for (size_t i = 0; i < faces.size(); i++)
        {
            cv::rectangle(frame, faces[i], cv::Scalar(0, 255, 0), 2);
        }

        // 显示结果图像
        cv::imshow("Face Detection", frame);

        // 按下ESC键退出循环
        if (cv::waitKey(1) == 27)
            break;
    }

    // 释放摄像头和窗口资源
    capture.release();
    cv::destroyAllWindows();

    return 0;
}


运行效果:

image-20230920145118684

2.2 侧脸分类器检测人脸

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/imgproc/imgproc.hpp>

int main()
{
    // 加载人脸分类器
    cv::CascadeClassifier faceCascade;

    //分类器文件下载地址: https://github.com/opencv/opencv/tree/master/data/haarcascades
    //在OpenCV的源码目录下其实也有(opencv\build\etc\haarcascades)。
    //下载后放到C盘根目录即可.
    faceCascade.load("C:/haarcascade_profileface.xml");

    // 打开摄像头
    cv::VideoCapture capture(0);
    if (!capture.isOpened())
    {
        std::cout << "无法打开摄像头" << std::endl;
        return -1;
    }

    // 创建窗口
    cv::namedWindow("Face Detection", cv::WINDOW_NORMAL);

    while (true)
    {
        cv::Mat frame;
        capture >> frame; // 读取视频帧

        // 将彩色图像转换为灰度图像以加快处理速度
        cv::Mat grayFrame;
        cv::cvtColor(frame, grayFrame, cv::COLOR_BGR2GRAY);

        // 对图像进行人脸检测
        std::vector<cv::Rect> faces;
        faceCascade.detectMultiScale(grayFrame, faces, 1.1, 3, 0, cv::Size(30, 30));

        // 在图像上绘制人脸边界框
        for (size_t i = 0; i < faces.size(); i++)
        {
            cv::rectangle(frame, faces[i], cv::Scalar(0, 255, 0), 2);
        }

        // 显示结果图像
        cv::imshow("Face Detection", frame);

        // 按下ESC键退出循环
        if (cv::waitKey(1) == 27)
            break;
    }

    // 释放摄像头和窗口资源
    capture.release();
    cv::destroyAllWindows();

    return 0;
}

三、OpenCV安装

3.1 OpenCV下载

OpenCV下载地址:https://opencv.org/releases/page/3/

目前最新的版本是4.3,那么就下载最新的版本。

image-20230906101920240

image-20230906102004369

下载下来是一个exe文件,双击就可以安装,实际就是解压,可以选择解压的路径,解压出来的文件包含源文件、库文件一大堆,比较大,可以直接放在一个固定的目录,后面程序里直接填路径来调用即可。 这个下载下来的库文件里只包含了X64的库,适用于MSVS 64位编译器。

image-20230906102712398

解压完成。

image-20230906103311462

解压后在build目录下看到有VC14和VC15的目录。这表示什么含义呢?

OpenCV VC14和VC15的区别在于它们所使用的编译器版本不同。VC14使用的是Visual Studio 2015的编译器,而VC15使用的是Visual Studio 2017的编译器。这意味着VC15可以利用更先进的编译器技术,从而提高代码的性能和效率。此外,VC15还支持更多的C++11和C++14特性,使得开发更加方便和灵活。

image-20230906103633870

3.2 VS2022环境

我这里介绍下我用的环境安装过程。 所有版本的VS都可以的,OpenCV只是个第三方库,哪里调用都行。

我当前环境是在Windows下,IDE用的是地表最强IDEVS2022。

下载地址:https://visualstudio.microsoft.com/zh-hans/downloads/

image-20230913173131481

因为我这里只需要用到C++和C语言编程,那么安装的时候可以自己选择需要安装的包。

image-20230913173258088

安装好之后,创建项目。

image-20230913173330580

image-20230913173349914

3.3 新建工程

这是创建好的空工程,我写了一段OpenCV的代码。

image-20230913173536785

工程创建好之后需要添加OpenCV头文件的引用和OpenCV库文件的引用。

点击这个属性。

image-20230913173632169

第一步在C++、常规 选项里添加用到的OpenCV头文件路径。

image-20230913173709390

这个路径具体在哪里,要看自己的OpenCV安装路径。

image-20230913173753881

为了方便大家粘贴,我这里贴出来。

C:/opencv_4.x/opencv/build/include/opencv2
C:/opencv_4.x/opencv/build/include/opencv
C:/opencv_4.x/opencv/build/include

第二步就是设置库文件的路径。 在链接器-输入 选项里,添加依赖选项。

image-20230913173957033

这个库在哪里,根据自己OpenCV解压的路径进行填。

image-20230913174030657

这是我的路径:

C:/opencv_4.x/opencv/build/x64/vc15/lib/opencv_world430.lib

3.4 运行库的拷贝

如果写好了OpenCV代码,直接按下Ctrl + F5 运行程序,如果第一次运行,会报错。

提示如下:

image-20230913174225139

这个提示是告诉我们,程序运行时找不到OpenCV的运行库。 只要使用了第三方库都需要知道这一点,运行的时候需要把用到的库拷贝到生成的exe同级目录下。

把OpenCV解压目录下的opencv_world430.dll文件拷贝到编译出来的exe运行同级目录下。 否则程序运行因为找不到库而导致异常结束。

image-20230912102245746

拷贝到这里。

image-20230913174403148

再次运行,程序就正常的运行了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1383273.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【SpringMVC快速使用】1.@RestController @RequestMapping 2.logback的使用

背景&#xff1a;为何从这个最简单的 例子写起呢&#xff1f; 那是因为我们的管理后台之类的都是别人写的&#xff0c;我也听说了大家说&#xff1a;只用Post请求就足够了&#xff0c;但是却发现&#xff0c;在浏览器中测试时&#xff0c;默认是GET请求&#xff0c;如果直接写…

【论文阅读】Consistency Models

文章目录 IntroductionDiffusion ModelsConsistency ModelsDefinitionParameterizationSampling Training Consistency Models via DistillationTraining Consistency Models in IsolationExperiment Introduction 相比于单步生成的模型&#xff08;例如 GANs, VAEs, normalizi…

自行车商城网站网页设计与制作web前端设计html+css+js成品。电脑网站制作代开发。vscodeDrea

【自行车商城网站网页设计与制作web前端设计htmlcssjs成品。电脑网站制作代开发。vscodeDrea】 https://www.bilibili.com/video/BV1wT4y1p7jq/?share_sourcecopy_web&vd_sourced43766e8ddfffd1f1a1165a3e72d7605

Docker五部曲之四:Docker Compose

文章目录 前言Compose应用程序模型Compose规范顶层属性servicenetworkvolumesconfigssecrets 环境变量.env文件environment属性主机shell中的环境变量 Profiles&#xff08;剖面&#xff09;启动剖面自动启动剖面和依赖项解析 多compose.yml文件共享与扩展构建规范构建属性 部署…

MySQL主从复制配置(双主双从)

一、架构规划 一主多从可以缓解读的压力&#xff0c;但是如果主宕机了&#xff0c;所有从都不能写了&#xff0c;因此我们配置双主双从。 1、规划图 master1和master2互为主从关系&#xff0c;slave1是master1的从&#xff0c;slave2是master2的从。 2、环境准备 准备四台机…

浅谈对Maven的理解

一、什么是Maven Maven——是Java社区事实标准的项目管理工具&#xff0c;能帮你从琐碎的手工劳动中解脱出来&#xff0c;帮你规范整个组织的构建系统。不仅如此&#xff0c;它还有依赖管理、自动生成项目站点等特性&#xff0c;已经有无数的开源项目使用它来构建项目并促进团队…

WEB服务器-Tomcat

3. WEB服务器-Tomcat 3.1 简介 3.1.1 服务器概述 服务器硬件 指的也是计算机&#xff0c;只不过服务器要比我们日常使用的计算机大很多。 服务器&#xff0c;也称伺服器。是提供计算服务的设备。由于服务器需要响应服务请求&#xff0c;并进行处理&#xff0c;因此一般来说…

浅谈缓存最终一致性的解决方案

浅谈缓存最终一致性的解决方案 作者&#xff1a;clareguo&#xff0c;腾讯 CSIG 后台开发工程师 来源&#xff1a;腾讯技术工程open in new window 到底是更新缓存还是删除缓存? 到底是先更新数据库&#xff0c;再删除缓存&#xff0c;还是先删除缓存&#xff0c;再更新数据…

(Java企业 / 公司项目)分布式事务Seata详解(含Seata+Nacos组合使用)(二)

一. Seata Server配置Nacos 什么是配置中心?配置中心可以说是一个"大货仓",内部放置着各种配置文件,你可以通过自己所需进行获取配置加载到对应的客户端.比如Seata Client端(TM,RM),Seata Server(TC),会去读取全局事务开关,事务会话存储模式等信息.Seata的配置中心…

PyTorch项目源码学习(3)——Module类初步学习

torch.nn.Module Module类是用户使用torch来自定义网络模型的基础&#xff0c;Module的设计要求包括低耦合性&#xff0c;高模块化等等。一般来说&#xff0c;计算图上所有的子图都可以是Module的子类&#xff0c;包括卷积&#xff0c;激活函数&#xff0c;损失函数节点以及相…

计算机缺失mfu140u.dll的5种解决方法,亲测有效

在计算机系统运行过程中&#xff0c;mfu140u.dll文件的丢失是一个较为常见的问题场景。这个动态链接库文件(mfu140u.dll)对于系统的正常运行具有关键作用&#xff0c;它的缺失可能导致相关应用程序无法启动或执行功能异常。具体来说&#xff0c;mfu140u.dll丢失的场景可能出现在…

QT上位机开发(QSS美化)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 我们早期学习过web开发的同学都知道&#xff0c;web开发有三个部分&#xff0c;分别是html、css和java script。其中html负责控件生成和布局&#…

基于Matlab/Simulink的MIL仿真验证解决方案

文章目录 需求追溯 虚拟环境 模型检查 仿真验证 测试报告 参考文献 针对模型开发阶段的ECU算法&#xff0c;可以很直接地将其与虚拟车辆模型连接起来&#xff0c;通过MIL对其进行验证和确认。可以在开发过程的早期检测到设计错误和不正确的需求&#xff0c;也有助于安全地…

DSL查询文档--各种查询

DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1查询所有 结果&#xff1a; 2全文检索&#xff08;full text&#xff09;查询 常见的全文检索查询包括&#xff1a; match查询&#xff1a;单字段查询 multi_match查询&#xff1a;多字段查询&#xff…

阿里云ingress配置时间超时的参数

一、背景 在使用阿里云k8s集群的时候&#xff0c;内网API网关&#xff0c;刚开始是用的是Nginx&#xff0c;后面又搭建了ingress。 区别于nginx配置&#xff0c;ingress又该怎么设置参数呢&#xff1f;比如http超时时间等等。 本文会先梳理nginx是如何配置&#xff0c;再对比…

AC修炼计划(AtCoder Beginner Contest 334)A~G

传送门&#xff1a;UNIQUE VISION Programming Contest 2023 Christmas (AtCoder Beginner Contest 334) - AtCoder A题是最最基础的语法题就不再讲解。 B - Christmas Trees 该题虽然分低&#xff0c;但我觉得还是很不错的。 给你 l 和 r &#xff0c;设满足题意的数字是x则…

TIFF转JPG助手:轻松批量转换,优化图片管理

在数字时代&#xff0c;图片已成为我们生活和工作中不可或缺的一部分。为了更好地管理和使用这些图片&#xff0c;我们需要一个强大的工具来帮助我们转换和优化图片格式。TIFF转JPG助手正是这样一款理想的解决方案 首先&#xff0c;我们进入首助编辑高手主页面&#xff0c;会看…

qayrup-switch开发文档

因为只是一个小组件,所以直接拿csdn当开发文档了 书接上文uniapp怎么开发插件并发布 : https://blog.csdn.net/weixin_44368963/article/details/135576511 因为我业没有开发过uniapp的组件,所以我看到下面这个文件还是有点懵的 也不清楚怎么引入, 然后去翻了翻官方文档,官方…

基于时域有限差分法的FDTD的计算电磁学算法-YEE网格下的更新公式推导

基于时域有限差分法的FDTD的计算电磁学算法&#xff08;含Matlab代码&#xff09;-YEE网格下的更新公式推导 参考书籍&#xff1a;The finite-difference time-domain method for electromagnetics with MATLAB simulations&#xff08;国内翻译版本&#xff1a;MATLAB模拟的电…