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

一、前言

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.hqwc.cn/news/339553.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

05- OpenCV:图像操作和图像混合

目录 一、图像操作 1、读写图像 2、读写像素 3、修改像素值 4、Vec3b与Vec3F 5、相关的代码演示 二、图像混合 1、理论-线性混合操作 2、相关API(addWeighted) 3、代码演示&#xff08;完整的例子&#xff09; 一、图像操作 1、读写图像 &#xff08;1&#xff09;…

阿赵UE学习笔记——8、贴图导入设置

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。   继续学习虚幻引擎的用法&#xff0c;这次来说一下贴图的导入设置。   在内容浏览器里面可以看到纹理类型的资源&#xff0c;就是贴图了&#xff0c;鼠标悬浮在上面可以看到这个纹理贴图的信息&#xff1a; 双击纹理贴图…

基于ssm文化遗产的保护与旅游开发论文

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古…

【Python程序开发系列】一文总结程序运行出现No module named ‘xxx‘的解决方案

这是Python程序开发系列原创文章&#xff0c;我的第196篇原创文章。 一、引言 "ModuleNotFoundError: No module named xxx"这个报错是个非常常见的报错&#xff0c;几乎每个python程序员都遇到过&#xff0c;导致这个报错的原因也非常多&#xff0c;解决这个问题之…

原生Camera2中CameraMetadata用法和代码流程详解

1&#xff0c;CameraMetadata介绍 CameraMetadata在Android的Camera2 API中起到了关键的作用。它提供了一种机制&#xff0c;使应用程序能够获取关于相机硬件和其当前状态的元数据。这些元数据包括各种信息&#xff0c;例如相机传感器的状态、镜头的朝向、闪光灯的充电状态、自…

智能AI一键养号,助力账号增加浏览轨迹的全新体验

我想分享一下我对亚马逊鲲鹏系统的智能AI一键养号功能的使用体验。这一创新性的功能让账号的养号过程变得更加轻松、灵活且有效。 首先&#xff0c;我对软件的AI功能页面印象深刻。通过勾选不同的姓名、职业、性别等选项&#xff0c;我可以生成各种不同的AI角色。这些角色使得账…

windows10 装docker和docker compose

一.windows环境准备 开启过程中的问题&#xff0c;进入bios修复 二.docker下载安装 1.下载 Docker Desktop: The #1 Containerization Tool for Developers | Docker 下载最新版有问题&#xff0c;下载老版本试试 Docker Desktop release notes | Docker Docs 2.安装 三.do…

C++11_lambda表达式

文章目录 一、lambda表达式1.lambda的组成2.[capture-list] 的其他使用方法2.1混合捕捉 二、lambda表达式的使用场景1.替代仿函数 总结 一、lambda表达式 lambda表达式是C11新引入的功能&#xff0c;它的用法与我们之前学过的C语法有些不同。 1.lambda的组成 [capture-list] …

有免费仓库出入库管理软件推荐吗?

有免费仓库出入库管理软件推荐吗&#xff1f; 对于希望仓库管理系统“简单易上手”的使用者来说&#xff0c;能够实现扫码出入库的系统无疑是最优选。这种方式以其直观的操作和高效的流程&#xff0c;极大地简化了仓库管理&#xff0c;为用户提供了许多实际的便利。 像我们公…

android 实时流媒体 实时流媒体播放

场景描述 将实时流采集终端的视频数据实时推送到另外一个&#xff08;多个&#xff09;播放终端&#xff0c;完成远距离实时视频播放的功能。典型场景&#xff1a; &#xff08;1&#xff09;远程查看监控摄像头。选择指定摄像头&#xff0c;将该摄像头采集到的实时数据推送到…

k8s的存储卷、数据卷---动态PV创建

当发布PVC之后可以生成PV&#xff0c;还可以在动态服务器上直接生成挂载目录。PVC直接绑定和使用PV。 动态PV需要两个组件 存储卷插件&#xff1a;Provisioner(存储分配器)根据定义的属性创建PV StorageClass&#xff1a;定义属性 存储卷插件 存储卷插件&#xff1a;k8s本…

【谭浩强C程序设计 学习辅导第3章】最简单的C程序设计——顺序程序设计(含详细源码)

文章目录 一、 顺序程序设计题的解题思路及注意事项解题思路注意事项 二、源码讲解第3章源码文件构成&#xff1a;main.c 文件内容说明chap3.c源码实现chap3.h声明头文件测试结果展示源码链接 说明&#xff1a;本学习辅导题适用于谭浩强教辅第四版。 一、 顺序程序设计题的解题…