Windows环境利用 OpenCV 中 CascadeClassifier 分类器识别人脸 c++

Windows环境中配置OpenCV

CascadeClassifier 分类器

CascadeClassifier 是 OpenCV 库中的一个类,它用于实现一种快速的物体检测算法,称为级联分类器。这种分类器通常用于面部识别、行人检测等任务。级联分类器由多个阶段组成,每个阶段都包含一组分类器,通常是基于Haar 特征或 HOG 特征的简单分类器。这些分类器被训练来识别物体的不同特征。

  • 级联分类器的工作原理如下
    • 初始化阶段:使用一个较大的窗口在图像中滑动,寻找可能包含目标物体的区域。
    • 分类器级联:每个阶段的分类器都会对候选区域进行分类,如果候选区域通过当前阶段的分类器,它将被传递到下一个阶段的分类器。如果候选区域被拒绝,它将被排除。
    • 多尺度检测:在不同的缩放级别上重复这个过程,以检测不同大小的目标物体。
    • 非极大值抑制:在所有阶段完成后,可能会有多个重叠的候选区域被检测到。非极大值抑制用于选择最佳的候选区域。
  • 使用CascadeClassifier 的基本步骤包括
    • 加载一个预先训练好的分类器模型,这通常是一个 .xml 文件。
    • 使用分类器检测图像中的物体。
    • 根据需要调整参数,比如窗口大小、缩放因子等。

利用CascadeClassifier 人脸识别

  1. 验证VS2022是否配置好OpenCV环境
    读入一张本地图片,并显示,如下:
cpp 复制代码
#include <opencv2/opencv.hpp>
int main()
{
    Mat img = imread("amy.png");

    namedWindow("美女");

    imshow("美女", img);

    waitKey(0);
    return 0;
}

运行结果如下,显示出图片,则表示VS2022已经配置OpenCV环境。

  1. 进行图片的人脸识别过程
  • imread函数读入一张本地图片;
  • 加载人脸识别分类器CascadeClassifier 中人脸模型haarcascade_frontalface_default.xml,该分类器一般在OpenCV安装目录opencv//build//etc//haarcascades下;
  • 利用分类器CascadeClassifierdetectMultiScale函数识别人脸;
  • rectangle函数绘制检测到的人脸,标注矩形框,并打印坐标;
  • imshow函数显示识别结果。
  1. 人脸识别c++ demo
cpp 复制代码
#include <opencv2/opencv.hpp>
#include <string>

using namespace cv;
using namespace std;

int main(int argc, char** argv) {

    // 读取图像文件
    Mat image = imread("amy.png");
    if (image.empty()) {
        cout << "读取图像文件失败" << endl;
        return -1;
    }

    // 加载人脸识别分类器
    CascadeClassifier faceCascade;
    string faceCascadePath = "C://opencv//build//etc//haarcascades//haarcascade_frontalface_default.xml";
    if (!faceCascade.load(faceCascadePath)) {
        cout << "加载人脸识别分类器失败" << endl;
        return -1;
    }

    // 识别人脸
    std::vector<Rect> faces;
    faceCascade.detectMultiScale(image, faces, 1.1, 3, 0, Size(80, 80));

    // 绘制检测到的人脸
    for (const Rect& face : faces) {
        rectangle(image, face, Scalar(255, 0, 0), 2);
        
        // 打印人脸的坐标
        cout << "检测到人脸: 坐标 (" << face.x << ", " << face.y 
            << ") 尺寸 (" << face.width << "x" << face.height << ")" << endl;
    }
 
    // 显示结果图像
    imshow("人脸识别结果", image);

    waitKey(0);

    return 0;
}
  • 识别结果: 如下图,将陈昊宇的脸准确的识别出来了,对应的人脸坐标打印如下:

检测到人脸: 坐标 (248, 219) 尺寸 (421x421)

  1. 验证双人脸:换个2个人脸图像进行识别验证识别准确度;可以看到两个人也可以识别出来,对应人脸坐标如下:

检测到人脸: 坐标 (204, 128) 尺寸 (161x161)

检测到人脸: 坐标 (676, 133) 尺寸 (170x170)

  1. 验证多人脸:可以看到7个人脸识别过程中,识别错误了一个人脸位置,说明在多人识别的过程中,该模型的准确率需要进一步提升;对应的人脸坐标如下:

检测到人脸: 坐标 (901, 102) 尺寸 (100x100)

检测到人脸: 坐标 (827, 485) 尺寸 (105x105)

检测到人脸: 坐标 (657, 116) 尺寸 (100x100)

检测到人脸: 坐标 (1044, 74) 尺寸 (94x94)

检测到人脸: 坐标 (796, 89) 尺寸 (96x96)

检测到人脸: 坐标 (572, 259) 尺寸 (103x103)

检测到人脸: 坐标 (124, 197) 尺寸 (236x236)

相关推荐
余额瞒着我当琳4 小时前
C++--深拷贝三件套 + swap + 写时拷贝 + vector 扩容 + reserve
java·开发语言·c++
ShineWinsu5 小时前
对于C++:布隆过滤器(bloomfilter)的详细解析
c++·面试·位图·位运算·布隆过滤器·海量数据·比特位
牛油果子哥q9 小时前
C++内存模型与深浅拷贝万字详解:栈堆静态内存布局、深浅拷贝底层差异、内存泄漏根治、拷贝崩溃踩坑、手写深拷贝实战
java·开发语言·c++
大鹏的NLP博客9 小时前
通用 Linux 嵌入式板端 C/C++ ABI 与 Glibc 依赖治理规范
linux·c++·交叉编译
ysa05103010 小时前
c++常用自带函数用法与注意
c++·笔记·算法
hans汉斯10 小时前
采煤工作面隐患目标检测中YOLO11与Faster R-CNN的对比研究
人工智能·目标检测·计算机视觉·cnn·信息与通信·信号处理
qq_1508419912 小时前
从CVI(C)到Pyside(python)/Qt(C++)/VS(C#)的一点吐槽
c++·qt·c#
WA内核拾荒者12 小时前
WhatsApp账号运营SOP的可视化编排与流水线监控
大数据·数据库·windows
W_3260013 小时前
Python-OpenCV 轮廓进阶:旋转最小外接矩形、图像矩求质心、嵌套层级 hierarchy、轮廓形状匹配
图像处理·python·opencv·机器学习·计算机视觉
Java小白笔记14 小时前
Windows系统免软件命令激活
java·网络·人工智能·windows·ai·ai编程