目标检测笔记(十一):如何结合特定区域进行目标检测(基于OpenCV的人脸检测实例)
文章目录
- 背景
- 代码
- 结果
背景
由于我们在做项目的时候可能会涉及到某个指定区域进行目标检测或者人脸识别等任务,所以这篇博客是为了探究如何在传统目标检测的基础上来结合特定区域进行检测,以OpenCV自带的包为例。
一般来说有两种方式实现区域指定:
- 第一种:在网络处理之前,将特定区域划分出来,然后在送入到神经网络进行检测
- 第二种:在网络处理之后,直接来划分区域的坐标对网络处理后目标进行判定,判定此目标是否在这个区域中,如果在则show,否则则略过
很明显通过第一种方式,网络可以减少很大的计算复杂度,因为不用将整张图片送入到网络中进行处理。
代码
这个代码是直接通过对特定区域结合OpenCV自带人脸检测器来进行人脸检测。若区域内,目标则被检测,超过区域则不被记录。
import cv2face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
cap = cv2.VideoCapture(0)
# 定义感兴趣区域的坐标和大小
roi_x = 200
roi_y = 100
roi_width = 300
roi_height = 300while True:# 读取一帧图像ret, frame = cap.read()if not ret:print("无法读取摄像头图像")break# 获取感兴趣区域roi = frame[roi_y:roi_y+roi_height, roi_x:roi_x+roi_width]# 将感兴趣区域转换为灰度图像gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)# 使用人脸检测器检测人脸区域faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))# 在原始图像上绘制感兴趣区域矩形cv2.rectangle(frame, (roi_x, roi_y), (roi_x+roi_width, roi_y+roi_height), (255, 0, 0), 2)# 在感兴趣区域上绘制人脸区域矩形for (x, y, w, h) in faces:cv2.rectangle(roi, (x, y), (x+w, y+h), (0, 255, 0), 2)# 在窗口中显示图像cv2.imshow("Camera", frame)if cv2.waitKey(1) == 27:breakcap.release()
cv2.destroyAllWindows()
这个代码在上面代码的基础上,加入了鼠标点击事件,用户可以通过自己来划分特定检测区域,划分之后将从整张图片的检测转换为特定区域的检测。
import cv2def draw_roi(event, x, y, flags, param):global roi_x, roi_y, roi_width, roi_height, drawingif event == cv2.EVENT_LBUTTONDOWN:# 鼠标按下,开始绘制roi_x, roi_y = x, yelif event == cv2.EVENT_LBUTTONUP:# 鼠标释放,结束绘制roi_width, roi_height = x - roi_x, y - roi_ydrawing = Trueif __name__ == '__main__':# 创建一个全局变量来存储感兴趣区域的坐标和大小roi_x, roi_y, roi_width, roi_height = 0, 0, 0, 0drawing = Falseover = 0cap = cv2.VideoCapture(0)# 创建窗口并绑定鼠标事件cv2.namedWindow("Camera")cv2.setMouseCallback("Camera", draw_roi)# 加载人脸检测器face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')while True:ret, frame = cap.read()if not ret:print("无法读取摄像头图像")break# 如果触发了鼠标事件,则在感兴趣区域上运行人脸检测器roi = frame[roi_y:roi_y + roi_height, roi_x:roi_x + roi_width]# 在原始图像上绘制感兴趣区域矩形cv2.rectangle(frame, (roi_x, roi_y), (roi_x + roi_width, roi_y + roi_height), (255, 0, 0), 2)if drawing:gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))for (x, y, w, h) in faces:cv2.rectangle(roi, (x, y), (x + w, y + h), (0, 255, 0), 2)else:gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))for (x, y, w, h) in faces:cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)cv2.imshow("Camera", frame)if cv2.waitKey(1) == 27:breakcap.release()cv2.destroyAllWindows()
结果
相关文章:

目标检测笔记(十一):如何结合特定区域进行目标检测(基于OpenCV的人脸检测实例)
文章目录 背景代码结果 背景 由于我们在做项目的时候可能会涉及到某个指定区域进行目标检测或者人脸识别等任务,所以这篇博客是为了探究如何在传统目标检测的基础上来结合特定区域进行检测,以OpenCV自带的包为例。 一般来说有两种方式实现区域指定&…...

PID直观感受简述
0、仿真控制框图 1、增加p的作用(增加响应)P 2、增加I的作用(消除稳差)PI 3、增加D的作用(抑制波动)PID 加入对噪声很敏 4、综合比对...

Tomcat运行后localhost:8080访问自己编写的网页
主要是注意项目结构,home.html放在src/resources/templates下的home.html下,application.properties可以不做任何配置。还有就是关于web包的位置,作者一开始将web包与tabtab包平行,访问8080出现了此类报错: Whitelabel…...

传感网应用开发1+X实训室建方案
一、概述 1.1建设背景 从院校实际教学情况与人才培养计划为出发点,贯彻传感网应用开发1X实训室职业技能等级标准,充分考虑传感网应用开发1X实训室从业人员的职业发展路径与成长路径,以职业素养、职业技能、知识水平为主要框架结构ÿ…...

PDF校对:让您的文件无瑕疵
无论您是企业家、学生、教育者还是作家,我们都知道,提交或发布一个充满错误的PDF文件可能会给您的声誉或品牌带来严重损害。这就是为什么PDF校对如此关键的原因。现在,让我们深入了解PDF校对的重要性,以及如何确保您的文件尽可能完…...
SpringBoot--解决空字符串转枚举异常
原文网址:SpringBoot--解决空字符串转枚举异常_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何解决Java的SpringBoot中空字符串转枚举时报错的问题。 问题复现 org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot d…...
Redis的常用数据类型详解
Redis是一个开源的、基于内存的数据结构存储系统,它可以用作数据库、缓存和消息代理。Redis支持多种数据类型,包括字符串、列表、集合、有序集合、散列等。理解这些数据类型的特性和使用方式,对于充分利用Redis的能力至关重要。以下是对Redis…...
jpa里IdentityGenerator和IncrementGenerator的区别
IdentityGenerator 和 IncrementGenerator 的区别 IdentityGenerator 和 IncrementGenerator 都是 JPA 中可用的主键生成策略(GenerationType)之一。它们的区别如下: IdentityGenerator: IDENTITY 主键生成策略利用数据库自动生成的主键。在…...
基于element UI 实现 table 列 拖拽
问题描述 在开发中遇到一个需求,即实现table列的拖拽,但是调研发现,大部分是基于sorttable.js这个包实现的,但是通过实际应用,发现sorttable.js用在操作element table 组件中并不是很舒服,总会莫名其妙的冒…...
(GPT、GEE)遥感云大数据、洪涝灾害监测、红树林遥感制图、河道轮廓监测、洪涝灾害监测、GRACE重力卫星、源遥感影像
近年来遥感技术得到了突飞猛进的发展,航天、航空、临近空间等多遥感平台不断增加,数据的空间、时间、光谱分辨率不断提高,数据量猛增,遥感数据已经越来越具有大数据特征。遥感大数据的出现为相关研究提供了前所未有的机遇…...
vue中实现将页面或者div内容导出为pdf格式
将Vue单页面转成pdf并下载 步骤1:下载对应的库 npm install html2canvas;npm install jspdf --save 步骤2:创建一个htmlToPdf.js的js文件, 然后在main.js中全局引用一下,编写如下代码: // htmlToPdf.js // 导出页面为PDF格式 …...

Ubuntu 配置国内源
配置国内源 因为众所周知的原因,国外的很多网站在国内是访问不了或者访问极慢的,这其中就包括了Ubuntu的官方源。 所以,想要流畅的使用apt安装应用,就需要配置国内源的镜像。 市面上Ubuntu的国内镜像源非常多,比较有…...

分布式核心知识
文章目录 前言一、分布式中的远程调用1.1RESTful接口1.2RPC协议1.3区别与联系 二、分布式中的CAP原理 前言 关于分布式核心知识详解 一、分布式中的远程调用 在微服务架构中,通常存在多个服务之间的远程调用的需求。远程调用通常包含两个部分:序列化和通…...

【JMeter】常用线程组设置策略
目录 一、前言 二、单场景基准测试 1.介绍 2.线程组设计 3.测试结果 三、单场景并发测试 1.介绍 2.线程组设计 3.测试结果 四、单场景容量/爬坡测试 1.介绍 2.线程组设计 3.测试结果 五、混合场景容量/并发测试 1.介绍 六、稳定性测试 1.介绍 2.线程组设计 …...

【数据结构】回溯算法公式化解题 leetcode经典题目带刷:全排列、组合、子集
目录 回溯算法一、什么是回溯算法1、基本思想:2、一般步骤: 二、题目带练1、全排列2、组合3、子集 三、公式总结 回溯算法 一、什么是回溯算法 回溯算法(Backtracking Algorithm)是一种解决组合问题、排列问题、选择问题等一类问…...

WPF基础入门-Class3-WPF数据模板
WPF基础入门 Class3:WPF数据模板 1、先在cs文件中定义一些数据 public partial class Class_4 : Window{public Class_4(){InitializeComponent();List<Color> test new List<Color>();test.Add(new Color() { Code "Yellow", Name &qu…...

js将搜索的关键字加颜色
js将搜索的关键字加颜色 使用正则匹配关键字并加入span标签,页面渲染时使用v-html渲染即可 // 文本框内容 let searchCont 测试;const reg new RegExp((${searchCont.value}), g); let data 图片保存测试A; data data.replace(reg, <span style"color:…...
Docker安装Oracle数据库打开、链接速度很慢
问题: 使用Docker安装Oracle数据库打开、链接速度很慢,明显的在在转圈严重影响效率。 解决: 排查到DNS时,发现宿主机DNS配置清空后,通过JDBC连接目标Oracle数据库速度很快 进入容器中进行测试,发现清空DNS…...

学生分班查询系统的创建与使用指南
开学季,负责分班工作的老师们又面临一个难题:如何公布分班结果?将结果放在学校官网上可能会让很多无关人员看到,而不放则会导致家长们纷纷打电话来询问。那么,有没有一种方法可以让家长们自行查看分班结果呢࿱…...

全套解决方案:基于pytorch、transformers的中文NLP训练框架,支持大模型训练和文本生成,快速上手,海量训练数据!
全套解决方案:基于pytorch、transformers的中文NLP训练框架,支持大模型训练和文本生成,快速上手,海量训练数据! 1.简介 目标:基于pytorch、transformers做中文领域的nlp开箱即用的训练框架,提…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...