C/C++开发,opencv-objdetect模块,CascadeClassifier人脸识别应用

目录

一、CascadeClassifier应用简介

1.1 objdetect模块

1.2 CascadeClassifier类

1.3 detectMultiScale函数详解

二、CascadeClassifier应用示例

2.1 模型及图片下载准备

2.2 程序代码

2.3 程序编译及运行


一、CascadeClassifier应用简介

1.1 objdetect模块

        在OpenCV中,objdetect模块提供了对象检测的功能,特别是基于预训练分类器的对象检测,如人脸检测、人体检测或其他特定目标的检测。

        以下是objdetect模块中常用的一些类和函数:

  1. CascadeClassifier
    CascadeClassifier类用于加载预训练的分类器,如Haar特征或LBP特征的级联分类器,通常用于人脸检测。加载分类器后,可以使用detectMultiScale函数在图像中检测对象。

  2. HOGDescriptor
    HOGDescriptor类用于计算图像的Histogram of Oriented Gradients(HOG)描述符,通常与SVM分类器结合使用,进行行人检测等任务。

  3. DNN(深度神经网络)
    虽然DNN不是objdetect模块的直接部分,但OpenCV提供了dnn模块,该模块可以用于加载和运行深度学习模型进行对象检测。例如,你可以使用YOLO、SSD或Faster R-CNN等模型进行对象检测。

  4. 其他检测器
    除了上述的Haar和HOG检测器外,objdetect模块还包含其他类型的对象检测器,如基于LSD(Line Segment Detector)的线检测器和基于轮廓的方法。但是,这些功能可能不像Haar和HOG那样直接在该模块中提供,而是需要一些额外的处理和编程。

1.2 CascadeClassifier类

   CascadeClassifier 类用于对象检测,特别是基于Haar或LBP特征的级联分类器的对象检测,这种检测方法通常用于人脸检测,但也可以用于其他目标,如眼睛、鼻子等。

        以下是使用 CascadeClassifier 类进行人脸检测的基本步骤:

  1. 加载级联分类器:首先,你需要加载一个预训练的级联分类器文件(通常是一个.xml文件)。这个文件包含了用于对象检测的级联函数和特征。对于人脸检测,OpenCV提供了一些预训练的模型,如haarcascade_frontalface_default.xml
  2. 读取图像:使用 imread 函数读取要检测的图像。
  3. 预处理图像(可选):对于某些级联分类器,将图像转换为灰度可能是必要的,因为级联分类器通常是在灰度图像上训练的。使用 cvtColor 函数进行转换。
  4. 检测对象:使用 CascadeClassifier 类的 detectMultiScale 函数在图像中检测对象。这个函数会返回一组矩形区域,表示检测到的对象的位置和大小。
  5. 绘制检测结果:使用 rectangle 函数在原始图像上绘制检测到的对象的边界框。
  6. 显示或保存结果:使用 imshow 函数显示结果图像,或使用 imwrite 函数将结果保存到文件。
1.3 detectMultiScale函数详解

  CascadeClassifier 类的 detectMultiScale 函数是用于在图像中检测多个对象(如人脸)的。这个函数基于Haar或LBP特征的级联分类器来工作,并返回一系列矩形(cv::Rect),这些矩形表示在图像中检测到的对象的位置。

void CascadeClassifier::detectMultiScale(  
    InputArray image,  
    std::vector<Rect>& objects,  
    double scaleFactor = 1.1,  
    int minNeighbors = 3,  
    int flags = 0,  
    Size minSize = Size(),  
    Size maxSize = Size()  
);

        参数说明:

  1. image:待检测的输入图像。它应该是灰度图像(CV_8UC1),除非你已经对彩色图像训练了特定的分类器。
  2. objects:一个向量,用于存储检测到的对象的矩形边界框。每个矩形由其左上角坐标 (x, y) 和宽高 (width, height) 定义。
  3. scaleFactor:比例因子,用于表示在每次图像缩放时的大小变化率。较小的值会产生更精确的结果,但也会增加计算时间。默认为1.1。
  4. minNeighbors:构成检测到的对象的相邻矩形的最小数量。如果数量太少,可能会丢弃该检测。这个参数可以减少误检(假阳性)。默认为3。
  5. flags:修改检测方式的标志。它可以是以下值的组合:
    • CASCADE_SCALE_IMAGE:在检测过程中按比例缩放图像。如果未设置此标志,则会按比例缩放分类器检测窗口。默认为设置此标志。
    • CASCADE_FIND_BIGGEST_OBJECT:只返回最大的对象检测。
    • CASCADE_DO_ROUGH_SEARCH:做初步检测,接受被其他级联拒绝的候选对象。这可能会增加误检,但可能会找到一些遗漏的对象。
  6. minSize:检测窗口的最小可能大小。小于此尺寸的窗口将被忽略。默认为空,表示没有限制。
  7. maxSize:检测窗口的最大可能大小。大于此尺寸的窗口将被忽略。默认为空,表示没有限制。

        返回值

        此函数没有返回值。检测到的对象边界框存储在传入的 objects 向量中。

二、CascadeClassifier应用示例

2.1 模型及图片下载准备

        需要用到预先训练好的模型“haarcascade_frontalface_default.xml”,前往gitee网站下载haarcascade_frontalface_default.xml · Miwat/face_recognition_LBPH - Gitee.com

        前往网上,下载人物图片用于人脸识别验证。

2.2 程序代码

        main.cpp实现

#include <opencv2/opencv.hpp>  
#include <opencv2/objdetect/objdetect.hpp>  

int main(int argc, char** argv)  
{  
    // 加载预训练的人脸分类器  
    cv::CascadeClassifier face_cascade;  
    if (!face_cascade.load("haarcascade_frontalface_default.xml"))  
    {  
        std::cerr << "--(!)Error loading face cascade\n";  
        return -1;  
    }  

    // 读取图像  
    cv::Mat image = cv::imread(argv[1], cv::IMREAD_COLOR);  
    if (image.empty())  
    {  
        std::cerr << "--(!)Error loading image\n";  
        return -1;  
    }  

    // 转换为灰度图像(大多数级联分类器在灰度图像上工作得更好)  
    cv::Mat gray;  
    cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);  
    //获取训练集的原始尺寸,作为分类器的最小尺寸,这样能得到最佳的检测效果(不是必须的)
	// cv::Size original_size = face_cascade.getOriginalWindowSize();
    // std::cerr << "original_size = " << original_size << "\n";
    // 检测人脸  
    std::vector<cv::Rect> faces;  
    face_cascade.detectMultiScale(gray, faces, 1.1, 2, 0 | cv::CASCADE_SCALE_IMAGE, cv::Size(24, 16)/*original_size*//*cv::Size(30, 30)*/);  
    std::cerr << "faces.size() = " << faces.size() << "\n";
    // 在图像上绘制检测到的人脸  
    for (size_t i = 0; i < faces.size(); i++)  
    {  
        cv::rectangle(image, faces[i], cv::Scalar(255, 0, 0), 2);  
    }  

    // 显示结果  
    cv::imshow("Faces", image);  
    cv::waitKey(0);  

    return 0;  
}
2.3 程序编译及运行

        本文是采用win系统下,opencv采用MinGW编译的静态库(C/C++开发,win下OpenCV+MinGW编译环境搭建_opencv mingw-CSDN博客),建立makefile:

#/bin/sh
#win32
CX= g++ -DWIN32 
#linux
#CX= g++ -Dlinux 

BIN 		:= ./
TARGET      := opencv_objdetect01.exe
FLAGS		:= -std=c++11 -static
SRCDIR 		:= ./
#INCLUDES
INCLUDEDIR 	:= -I"../../opencv_MinGW/include" -I"./"
#-I"$(SRCDIR)"
staticDir   := ../../opencv_MinGW/x64/mingw/staticlib/
#LIBDIR		:= $(staticDir)/libopencv_world460.a\
#			   $(staticDir)/libade.a \
#			   $(staticDir)/libIlmImf.a \
#			   $(staticDir)/libquirc.a \
#			   $(staticDir)/libzlib.a \
#			   $(wildcard $(staticDir)/liblib*.a) \
#			   -lgdi32 -lComDlg32 -lOleAut32 -lOle32 -luuid 
#opencv_world放弃前,然后是opencv依赖的第三方库,后面的库是MinGW编译工具的库

LIBDIR 	    := -L $(staticDir) -lopencv_world460 -lade -lIlmImf -lquirc -lzlib \
				-llibjpeg-turbo -llibopenjp2 -llibpng -llibprotobuf -llibtiff -llibwebp \
				-lgdi32 -lComDlg32 -lOleAut32 -lOle32 -luuid 
source		:= $(wildcard $(SRCDIR)/*.cpp) 

$(TARGET) :
	$(CX) $(FLAGS) $(INCLUDEDIR) $(source)  -o $(BIN)/$(TARGET) $(LIBDIR)

clean:
	rm  $(BIN)/$(TARGET)

        编译如下:

        程序运行输出如下:

        大家可以调节各个参数来观察其效果。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

信号与槽函数的魔法:QT 5编程中的核心机制

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、信号与槽函数的基本概念 二、信号与槽函数的实现原理 三、信号与槽函数的代码实例 四…

Windows环境下 postgresql16 增量备份及恢复

修改postgresql.conf isten_addresses * wal_level replica archive_mode on archive_command copy /V "%p" C:\\backup\\wal_files\\%f 注意写法&#xff0c;这里有大坑 restore_command copy c:\\backup\\wal_files\\%f "%p" recov…

FatFs文件系统移植到MCU平台详细笔记经验教程

0、准备工作 在移植FatFs文件系统前&#xff0c;需要准备好一块开发板&#xff0c;和一张SD卡&#xff0c;且需要已经实现开发板正常的读写SD卡或其它硬件设备。 本文笔记教程中使用的硬件设备是STM32F407VET6开发板&#xff08;板载SD插槽&#xff09;&#xff0c;配备8G和32G…

vscode:多个Tab同时展示项目

打开设置 设置中搜索window.nativeTabs&#xff0c;打钩。 这样就可以了

【稳定检索/投稿优惠】2024年语言、文化与艺术发展国际会议(LCAD 2024)

2024 International Conference on Language, Culture, and Art Development 2024年语言、文化与艺术发展国际会议 【会议信息】 会议简称&#xff1a;LCAD 2024大会时间&#xff1a;2024-08-10截稿时间&#xff1a;2024-07-27(以官网为准&#xff09;大会地点&#xff1a;中国…

【Java面试】六、Spring框架相关

文章目录 1、单例Bean不是线程安全的2、AOP3、Spring中事务的实现4、Spring事务失效的场景4.1 情况一&#xff1a;异常被捕获4.2 情况二&#xff1a;抛出检查异常4.3 注解加在非public方法上 5、Bean的生命周期6、Bean的循环引用7、Bean循环引用的解决&#xff1a;Spring三级缓…

JS-51-Node.js10-yarn

一、yarn的简介 Yarn 是一款 JavaScript 的包管理工具&#xff08;npm的代替方案&#xff09;&#xff0c;是 Facebook, Google, Exponent 和 Tilde 开发的一款新的 JavaScript 包管理工具。 正如 Yarn 官网的介绍&#xff0c;Yarn 的具有速度快 、安全 、可靠 的优点&#x…

【机器学习】Transformer模型大小与性能探究

Transformer模型大小与性能&#xff1a;不仅仅是尺寸的问题 一、Transformer模型的挑战二、经验标度定律的局限性三、记忆过程与性能动态五、结论与展望 在人工智能和机器学习的领域里&#xff0c;模型的大小与性能之间的关系一直是研究人员关注的焦点。然而&#xff0c;最近的…

比较好的Python课程

最近在学习夜曲编程的Python进阶课程——办公效率化&#xff1b;夜曲编程之前有推出一款学习Python的入门课程&#xff0c;在手机端和电脑端都可以学习的&#xff0c;如果没有时间在手机端学习都很好的。每节课程学习下来&#xff0c;可以收集到Python入门的知识卡片&#xff0…

VNC server ubuntu20 配置

介绍 最近想使用实验室的4卡服务器跑一些深度学习实验&#xff0c;因为跑的是三维建图实验&#xff0c;需要配上可视化界面&#xff0c;本来自带的IPMI可以可视化&#xff0c;但分辨率固定在640*480&#xff0c;看起来很别扭&#xff0c;就捣鼓服务器远程可视化访问了两天&…

Python | Leetcode Python题解之第120题三角形最小路径和

题目&#xff1a; 题解&#xff1a; class Solution:def minimumTotal(self, triangle: List[List[int]]) -> int:n len(triangle)f [0] * nf[0] triangle[0][0]for i in range(1, n):f[i] f[i - 1] triangle[i][i]for j in range(i - 1, 0, -1):f[j] min(f[j - 1], …

Javaweb基础之Cookie会话技术

大家好&#xff0c;这里是教授.F 引入&#xff1a; 我们想在登录一个网站时&#xff0c;能够显示我们上一次的登录时间啊&#xff0c;或者我们在该网站的浏览痕迹。哪这些要怎么做到&#xff1f;我们想&#xff0c;这些数据不可能从服务端给你返回来&#xff0c;因为一旦用户…

react 怎样配置ant design Pro 路由?

Ant Design Pro 是基于 umi 和 dva 的框架&#xff0c;umi 已经预置了路由功能&#xff0c;只需要在 config/router.config.js 中添加路由信息即可。 例如&#xff0c;假设你需要为 HelloWorld 组件创建一个路由&#xff0c;你可以将以下代码添加到 config/router.config.js 中…

ArcGIS教程(04):查找最近的消防站

本节目标 创建、设置和求解最近设施点分析。在本练习中&#xff0c;将查找可对给定地址处发生的火灾做出最快响应的四个消防站。还将生成消防队员的行进路线和驾车方向。 准备视图 双击打开【Exercise04.mxd】启用 【ArcGIS Network Analyst 扩展模块】单击【自定义 > 工…

游戏安全 | 一款「安全」的SLG游戏应该是什么样的?

谈到SLG游戏&#xff0c;也许会想到《万国觉醒》&#xff0c;海外上线5个月后&#xff0c;以5400万美元的月流水创造了新的SLG手游海外收入纪录。 谈到SLG游戏&#xff0c;也许会想到《王国纪元》&#xff0c;通过两军对战的方式&#xff0c;以大面积消灭敌人的攻势&#xff0c…

台灯怎么选对眼睛好?今天来讲护眼台灯真的有用吗

现在我们很多家长对自己孩子的视力十分关心&#xff0c;生怕自己的孩子是近视、远视、弱视等等。对于父母而言&#xff0c;在孩子读书压力大课业重的关键时期&#xff0c;为孩子选择合适的桌椅&#xff0c;护眼灯从而保护孩子的眼睛是非常重要的事情!那么买给孩子读书做功课的台…

2024.5.29晚训参考代码

因为本套题没有BFS例题&#xff0c;所以我先把BFS模板放着 #include<bits/stdc.h> using namespace std; int n,m;//n*m的棋盘 int dis[402][402]; bool vis[402][402]; int X[]{-2,-2,-1,-1,1,1,2,2};//偏移量的表 int Y[]{-1,1,-2,2,-2,2,-1,1};//定义一个数组&…

我给线程池管理框架hippo4j找bug

1 虚拟机参数不生效 hippo4j的docker启动脚本位于 docker/docker-startup.sh 。从下图可以看到 JAVA_OPT放在了jar包名 hippo4j-server.jar之后&#xff0c;而只有项目参数才放在jar包名之后。 实际上这里JAVA_OPT中包含虚拟机参数&#xff0c;而虚拟机参数要放在jar包名之前…

【SpringMVC】_简单示例计算器

目录 1. 需求分析 2. 接口定义 3. 请求参数 4. 响应数据 5. 服务器代码 6. 前端页面代码 7. 运行测试 为阶段性总结与应用&#xff0c;现将以Spring MVC项目创建一个可以实现加法的计算器为例 1. 需求分析 加法计算器功能&#xff0c;对两个整数进行相加&#xff0c;需…

微软Edge浏览器深度解析:功能、同步、隐私与安全

微软Edge浏览器是微软公司开发的一款网页浏览器,它基于Chromium内核,提供了快速、安全和兼容性良好的网页浏览体验。以下是关于微软Edge浏览器的详细信息和使用指南: 微软Edge浏览器的主要特点: 1. 基于Chromium内核: 渲染引擎:Chromium内核是基于开源项目Blink的,它…