一、前言
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的安装目录下。
二、代码实现
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;
}
运行效果:
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,那么就下载最新的版本。
下载下来是一个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。
下载地址:https://visualstudio.microsoft.com/zh-hans/downloads/
因为我这里只需要用到C++和C语言编程,那么安装的时候可以自己选择需要安装的包。
安装好之后,创建项目。
3.3 新建工程
这是创建好的空工程,我写了一段OpenCV的代码。
工程创建好之后需要添加OpenCV头文件的引用和OpenCV库文件的引用。
点击这个属性。
第一步在C++、常规 选项里添加用到的OpenCV头文件路径。
这个路径具体在哪里,要看自己的OpenCV安装路径。
为了方便大家粘贴,我这里贴出来。
C:/opencv_4.x/opencv/build/include/opencv2
C:/opencv_4.x/opencv/build/include/opencv
C:/opencv_4.x/opencv/build/include
第二步就是设置库文件的路径。 在链接器-输入 选项里,添加依赖选项。
这个库在哪里,根据自己OpenCV解压的路径进行填。
这是我的路径:
C:/opencv_4.x/opencv/build/x64/vc15/lib/opencv_world430.lib
3.4 运行库的拷贝
如果写好了OpenCV代码,直接按下Ctrl + F5
运行程序,如果第一次运行,会报错。
提示如下:
这个提示是告诉我们,程序运行时找不到OpenCV的运行库。 只要使用了第三方库都需要知道这一点,运行的时候需要把用到的库拷贝到生成的exe同级目录下。
把OpenCV解压目录下的opencv_world430.dll
文件拷贝到编译出来的exe运行同级目录下。 否则程序运行因为找不到库而导致异常结束。
拷贝到这里。
再次运行,程序就正常的运行了。