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

一、前言

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

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

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

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

cpp 复制代码
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的安装目录下。

二、代码实现

2.1 人脸分类器检测人脸

cpp 复制代码
#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;
}

运行效果:

2.2 侧脸分类器检测人脸

cpp 复制代码
#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下载地址:opencv.org/releases/pa...

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

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

解压完成。

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

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

3.2 VS2022环境

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

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

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

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

安装好之后,创建项目。

3.3 新建工程

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

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

点击这个属性。

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

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

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

cpp 复制代码
C:/opencv_4.x/opencv/build/include/opencv2
C:/opencv_4.x/opencv/build/include/opencv
C:/opencv_4.x/opencv/build/include

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

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

这是我的路径:

cpp 复制代码
C:/opencv_4.x/opencv/build/x64/vc15/lib/opencv_world430.lib

3.4 运行库的拷贝

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

提示如下:

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

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

拷贝到这里。

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

相关推荐
盛派网络小助手1 小时前
微信 SDK 更新 Sample,NCF 文档和模板更新,更多更新日志,欢迎解锁
开发语言·人工智能·后端·架构·c#
∝请叫*我简单先生1 小时前
java如何使用poi-tl在word模板里渲染多张图片
java·后端·poi-tl
zquwei2 小时前
SpringCloudGateway+Nacos注册与转发Netty+WebSocket
java·网络·分布式·后端·websocket·网络协议·spring
dessler3 小时前
Docker-run命令详细讲解
linux·运维·后端·docker
Q_19284999063 小时前
基于Spring Boot的九州美食城商户一体化系统
java·spring boot·后端
ZSYP-S4 小时前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
Yuan_o_4 小时前
Linux 基本使用和程序部署
java·linux·运维·服务器·数据库·后端
程序员一诺5 小时前
【Python使用】嘿马python高级进阶全体系教程第10篇:静态Web服务器-返回固定页面数据,1. 开发自己的静态Web服务器【附代码文档】
后端·python
DT辰白5 小时前
如何解决基于 Redis 的网关鉴权导致的 RESTful API 拦截问题?
后端·微服务·架构