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

news2024/11/25 6:59:52

Windows环境中配置OpenCV

  • 关于在Windows环境中配置opencv的说明,具体可以参考:VS2022 配置OpenCV开发环境详细教程。

CascadeClassifier 分类器

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

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

利用CascadeClassifier 人脸识别

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

    namedWindow("美女");

    imshow("美女", img);

    waitKey(0);
    return 0;
}

运行结果如下,显示出图片,则表示VS2022已经配置OpenCV环境。
在这里插入图片描述
2. 进行图片的人脸识别过程

  • imread函数读入一张本地图片;
  • 加载人脸识别分类器CascadeClassifier 中人脸模型haarcascade_frontalface_default.xml,该分类器一般在OpenCV安装目录opencv//build//etc//haarcascades下;
  • 利用分类器CascadeClassifierdetectMultiScale函数识别人脸;
  • rectangle函数绘制检测到的人脸,标注矩形框,并打印坐标;
  • imshow函数显示识别结果。
  1. 人脸识别c++ demo
#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)
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Java面向对象-final关键字

Java面向对象-final关键字 一、final1、修饰变量2、修饰方法3、修饰类4、案例 一、final 可以修饰变量、方法、类 1、修饰变量 final修饰一个变量&#xff0c;变量的值不可以改变&#xff0c;这个变量就变成一个字符常量&#xff0c;约定俗称的规定&#xff1a;名字大写。 f…

基于ChatGPT的大型语言模型试用心得

近年来&#xff0c;ChatGPT这样的大型语言模型&#xff0c;它如同一颗冉冉升起的新星&#xff0c;迅速在商业、教育、娱乐等多个领域照亮了创新的天空&#xff0c;极大地革新了我们的工作与日常生活。 最近我发现一些国内用户也能自由访问的中文ChatGPT APP。这个平台不仅提供…

python-pip配置镜像源加速下载Python包安装:快速配置pip源-国内加速源

&#x1f308;所属专栏&#xff1a;【pip】✨作者主页&#xff1a; Mr.Zwq✔️个人简介&#xff1a;一个正在努力学技术的Python领域创作者&#xff0c;擅长爬虫&#xff0c;逆向&#xff0c;全栈方向&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff01; 您的点赞…

struts2框架漏洞

title: struts2框架漏洞 categories: 漏洞复现 abbrlink: 48203 date: 2024-06-14 15:45:27 前言知识 ognl表达式注入 对象导航图语言&#xff0c;用于访问对象的字段、方法。基于简化访问java对象属性和调用方法需求&#xff0c;实现字段类型转化等功能&#xff1b;访问列表…

基于Matlab的BP神经网络的车牌识别系统(含GUI界面)【W7】

简介&#xff1a; 本系统结合了图像处理技术和机器学习方法&#xff08;BP神经网络&#xff09;&#xff0c;能够有效地实现车牌的自动识别。通过预处理、精确定位、字符分割和神经网络识别&#xff0c;系统能够准确地识别各种车牌图像&#xff0c;并在智能交通管理、安防监控等…

Java | Leetcode Java题解之第155题最小栈

题目&#xff1a; 题解&#xff1a; class MinStack {Deque<Integer> xStack;Deque<Integer> minStack;public MinStack() {xStack new LinkedList<Integer>();minStack new LinkedList<Integer>();minStack.push(Integer.MAX_VALUE);}public void …

java问题解决: IDEA java 警告 源发行版 17 需要目标发行版 17

效果图 问题原因 jdk和你实际安装的jdk不匹配 解决问题 1.点击File -->Project Structure–>Project 修改这两处 2. 在Project Structure–>Modules中的红框位置都要调整对应版本 3、点击File–>settings–>java compile将对应框的版本修改成对应版本即可–改…

Docker的基本操作 及 容器与外部机互相通讯(持续更新中)

Docker入门&#xff1a; Docker 入门教程 - 阮一峰的网络日志 (ruanyifeng.com)docker入门&#xff0c;这一篇就够了。-CSDN博客Docker 容器使用 | 菜鸟教程 (runoob.com)Docker自定义网络和运行时指定IP_docker run ip-CSDN博客 基本命令 链接&#xff1a;docker入门&#…

MVC 框架安全

在现代 Web 开发中&#xff0c;使用 MVC 架构是一种流行的做法。MVC 是 Model-View-Controller 的缩写&#xff0c;它将 Web 应用分为三层&#xff0c;View 层负责用户视图、页面展示等工作&#xff1b;Controller 负责应 用的逻辑实现&#xff0c;接收 View 层传入的用户请求&…

Luma AI如何注册:文生视频领域的新星

文章目录 Luma AI如何注册&#xff1a;文生视频领域的新星一、Luma 注册方式二、Luma 的效果三、Luma 的优势四、Luma 的功能总结 Luma AI如何注册&#xff1a;文生视频领域的新星 近年来&#xff0c;Luma AI 凭借其在文生视频领域的创新技术&#xff0c;逐渐成为行业的新星。…

【如何保持专注】

今日&#x1f4d2;&#xff0c;看博主分享下保持专注的新方法&#xff0c;有点意思 &#xff0c; 怎么保持专注&#xff0c;给大家分享两个极客的方法啊。 第一个呢是来自于一个非常著名的程序员啊&#xff0c;叫做这个尼克温特&#xff0c;大家有兴趣可以查一下&#xff0c;就…

Linux源码学习笔记01-Linux内核源码结构

Linux内核特性 是一个类Unix操作系统&#xff0c;但不是简化的Unix&#xff1b;不仅继承了Unix的特征&#xff0c;还有其他特性。 Linux内核的组织形式&#xff1a;整体式的结构&#xff0c;方便每个领域的开发人员参与开发&#xff1b;Linux进程调度方式简单高效&#xff1a…

结构设计模式 - 桥接设计模式 - JAVA

桥接设计模式 一. 介绍二. 桥接模式示例2.1 定义实现部分和具体实现2.2 定义抽象部分和细化抽象部分2.3 测试2.4 解释 三. 结论 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 一.…

串口触摸屏分割字符串

分割字符串的方法1、split2、indexOf()3、substr(start,length) 分割字符串的方法 1、split&#xff1a;将一个字符串分割为子字符串&#xff0c;然后将结果作为字符串数组返回。 2、indexOf() &#xff1a;返回某个指定的字符串值在字符串中首次出现的位置&#xff08;从左向右…

Vue55-TodoList案例-本地存储

一、TodoList案例-本地存储 此时&#xff0c;修改对象里面的属性&#xff0c;watch监视不到&#xff01; 需要深度监视&#xff0c;就不能用简写形式&#xff01; 二、jeecg-boot中的本地存储 jeecg-boot中&#xff0c;浏览器的本地存储&#xff0c;存储的是token&#xff01;…

Vue56-组件的自定义事件

一、什么是自定义事件 二、子组件—【传值】—>父组件 2-1、prop属性 2-2、自定义事件 v-on在谁身上&#xff0c;就给谁绑定事件&#xff01; 给谁绑定的事件&#xff0c;想触发就找谁&#xff01; 2-3、prop属性VS自定义属性 2-4、简写形式 2-5、ref属性实现 加了ref属性…

Matlab自学笔记三十一:结构数组的创建、索引和预分配内存

1.概念 结构&#xff08;structure array&#xff09;是一种具有容器特性的数据类型&#xff0c;它使用称为字段的数据容器对相关数据进行分组&#xff0c;每个字段可以包含任何类型或大小的数据&#xff0c;所有元素都具有相同数量的字段和相同的字段名称。&#xff08;与元胞…

【安装笔记-20240616-Windows-Gpg4win 证书管理器】

安装笔记-系列文章目录 安装笔记-20240616-Windows-Gpg4win 证书管理器 文章目录 安装笔记-系列文章目录安装笔记-20240616-Windows-Gpg4win 证书管理器 前言一、软件介绍名称&#xff1a;Gpg4win主页官方介绍 二、安装步骤测试版本&#xff1a;Gpg4win 4.3.1下载链接安装界面…

深入了解RSA加密算法

目录 前言 一、什么是RSA&#xff1f; 二、RSA加密的基本概念 1.非对称加密 2.密钥生成 3.加密和解密 三、RSA加密的工作原理 四、RSA的应用场景 五、RSA加密解密的实现 六、RSA算法的局限性及改进措施 前言 在当今的数字化时代&#xff0c;信息的安全性成为了人们关注…

课设--学生成绩管理系统(三)

欢迎来到 Papicatch的博客 文章目录 &#x1f349;报告目的 &#x1f349;总体设计 &#x1f348; 模块处理逻辑 &#x1f349;数据库设计 &#x1f348;总览表 &#x1f348;表设计 &#x1f34d;管理员信息表 &#x1f34d;课程基本信息表 &#x1f34d;课程扩展信息…