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)

        编译如下:

        程序运行输出如下:

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

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

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

相关文章

如何识别并选择正规、优质的外汇交易平台?

外汇市场的日益繁荣吸引了越来越多的投资者&#xff0c;但同时也带来了众多外汇平台的涌现。如何在这些平台中筛选出正规、可信的平台&#xff0c;成为了每位外汇交易者必须面对的首要问题。以下&#xff0c;我们将为您揭示如何鉴别外汇平台真伪的几个关键方法&#xff1a; 首先…

7个卖出信号出现,昂首资本立即盈利收场

在上篇文章中&#xff0c;我们和各位投资者讨论了如果使用匕首交易策略进行交易&#xff0c;但是如果只买进不卖出&#xff0c;是不是还是盈利不了&#xff1f;Anzo Capital昂首资本认为只有低买高卖才能盈利赚钱&#xff0c;只要发现盈利信号就要立即卖出盈利收场&#xff01;…

HTTP/超文本传输协议(Hypertext Transfer Protocol)及HTTP协议通信步骤介绍和请求、响应阶段详解;

目录 一、HTTP/超文本传输协议 特点和功能 请求-响应模型 版本和扩展 安全性和加密 二、HTTP协议通信步骤介绍 三、请求、响应阶段详解 HTTP请求 HTTP响应 示例 一、HTTP/超文本传输协议 HTTP/超文本传输协议&#xff08;Hypertext Transfer Protocol&#xff09;是…

Spring Cache自定义序列化解决乱码问题

Spring Cache数据缓存到 Redis中的 value是乱码问题&#xff08;包含日期格式转换&#xff09;&#xff0c;主要是因为序列化方式导致的。 Spring Cache使用 Redis缓存管理器时&#xff0c;默认 value使用的是 JDK序列化值的方式&#xff0c;所以导致缓存的 value乱码的问题。 …

Java八股文面试全套真题

Java八股文面试全套真题 一、Redis1.1、你在最近的项目中哪些场景使用了redis呢&#xff1f;1.2、缓存穿透1.3、布隆过滤器1.4、缓存击穿1.5、缓存雪崩1.6、redis做为缓存&#xff0c;mysql的数据如何与redis进行同步呢&#xff1f;&#xff08;双写一致性&#xff09;1.6.1、读…

nginx与nginx-rtmp-module安装

nginx与nginx-rtmp-module安装 画了好几天图&#xff0c;实在有些乏力&#xff0c;找点有意思的事情做做 觉得视频流传输挺有意思&#xff0c;B站找了些视频&#xff0c;但感觉有些大同小异&#xff0c;讲得不是很清楚 FFmpeg/RTMP/webRTC丨90分钟搞定直播逻辑-推流-流媒体服…

君子签打造“签+存+管”一体化签署平台,助推信创数字化改造

近年来&#xff0c;在国家信创战略的引导下&#xff0c;在建设数字中国、网络安全强国、推动产业升级等背景下&#xff0c;中国信创产业规模持续扩大&#xff0c;展现出前所未有的活力。根据艾媒咨询市场调研&#xff0c;2023年中国信创产业规模将达20961.9亿元&#xff0c;202…

怎么把图片大小调小?在线改图片大小的方法

怎么把比较大的图片压缩变小呢&#xff1f;在使用图片的时候&#xff0c;比较常见的一个问题就是图片太大导致无法正常上传&#xff0c;需要将图片处理到合适的大小之后&#xff0c;才可以正常在网上上传。现在一般调整图片大小多会通过使用在线改图片大小的在线工具来处理&…

信息素养大赛晋级复赛,你们都刷题库了吗?

2024年全国青少年信息素养大赛初赛成绩之前发布了&#xff0c;今天同学们可以查询是否晋级信息素养大赛复赛了&#xff0c;复赛应该会难度比较大&#xff0c;7月复赛&#xff0c;8月全国总决赛&#xff0c;据6547网题库获悉&#xff0c;今年初赛的人数近22万人。 查询方式&…

【面试干货】事务的并发问题(脏读、不可重复读、幻读)与解决策略

【面试干货】事务的并发问题&#xff08;脏读、不可重复读、幻读&#xff09;与解决策略 一、脏读&#xff08;Dirty Read&#xff09;二、不可重复读&#xff08;Non-repeatable Read&#xff09;三、幻读&#xff08;Phantom Read&#xff09;四、总结 &#x1f496;The Begi…

运维系列.Linux下的用户管理

运维系列 Linux下的用户管理 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/ar…

c# 输出二进制字符串

参考链接 C#二进制输出数据_c# 输出二进制 123.5的方法-CSDN博客https://blog.csdn.net/a497785609/article/details/4572112标准数字格式字符串 - .NET | Microsoft Learnhttps://learn.microsoft.com/zh-cn/dotnet/standard/base-types/standard-numeric-format-strings#BFo…

大规模团队的数据库开发,如何用OceanBase工具快速建立企业级账号体系

前言 为了让数据库开发的安全性与可靠性得以充分保障&#xff0c;数据库开发工具的管控能力显得尤为关键。构建一个健全的账号体系&#xff0c;能够协助开发团队实现对数据库开发工具的全方位管控&#xff0c;从而有效防范各类数据安全隐患&#xff0c;确保数据库开发的顺利进…

软件测试、测试模型、测试用例

软件开发的五个模型 瀑布模型&#xff08;Waterfall Model&#xff09; 瀑布模型是所有其他模型的基础框架&#xff0c;瀑布模型的每个阶段都只执行一次&#xff0c;因此是线性顺序进行的开发模式优点&#xff1a;强调开发的阶段性&#xff1b; 强调早期计划及需求调查&#…

01Linux以及操作系统概述

课程目标 1.了解现代操作系统的整体构成及发展历史 2.了解Linux操作系统及其分支版本 3.直观上理解服务器端与桌面端版本的区别 课程实验 1.通过对CentOS和Ubuntu的演示&#xff0c;直观理解Linux与Windows的异同 课堂引入 本章内容主要为大家详细讲解Linux操作系统(以下简…

ABB机器人碰撞检测灵敏度设置

机器人的碰撞灵敏度是指机器人对碰撞事件的识别和反应能力。碰撞灵敏度取决于机器人的感知和控制系统以及其硬件结构。控制系统则负责根据感知系统的反馈信息&#xff0c;对机器人进行相应的控制和调整&#xff0c;以减少或避免碰撞。控制系统可以根据碰撞的严重程度来判断机器…

计算机毕业设计Hadoop+Hive地震预测系统 地震数据分析可视化 地震爬虫 大数据毕业设计 Spark 机器学习 深度学习 Flink 大数据

2024 届本科毕业论文&#xff08;设计&#xff09; 基于Hadoop的地震预测的 分析与可视化研究 姓 名&#xff1a;____田伟情_________ 系 别&#xff1a;____信息技术学院___ 专 业&#xff1a;数据科学与大数据技术 学 号&#xff1a;__2011103094________ 指导…

微信小程序 自定义 tabBar

自定义 tabBar | 微信开放文档 本文案例使用的Taro 非原生微信小程序 使用流程 1. 配置信息 在 app.json 中的 tabBar 项指定 custom 字段&#xff0c;同时其余 tabBar 相关配置也补充完整。所有 tab 页的 json 里需声明 usingComponents 项&#xff0c;也可以在 app.json 全局…

【Qt秘籍】[001]-从入门到成神-前言

一、Qt是什么&#xff1f;[概念] Qt是一个跨平台的应用程序开发框架&#xff0c;简单来说&#xff0c;它是一套工具和库&#xff0c;帮助软件开发者编写可以在多种操作系统上运行的图形用户界面&#xff08;GUI&#xff09;应用程序。比如&#xff0c;你用Qt写了一个软件&#…

Visual Studio 2022 17.10.0 版 std::mutex报错问题解决方案

因为一时手欠点击了更新&#xff0c;把visual studio 2022从17.09版本升级到了17.10.0版本&#xff0c;俗话说尝鲜是要付出代价的&#xff0c;运行之前正常的程序后直接报错崩溃&#xff0c;通过windbg分析dmp文件定位报错位置&#xff0c;发现竟然是std::mutex报错&#xff0c…