news 2026/4/15 11:59:44

基于OpenCV的安全帽佩戴识别的分析与实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于OpenCV的安全帽佩戴识别的分析与实践

三、安全帽佩戴识别的设计

3.1、实现思路
本次实验主要是要实现安全帽的佩戴识别,在实现识别的基础上验证安全帽佩戴的可行性,设计了基于安全帽识别的两个系统,动态监测系统和联动门禁系统。
实现安全帽佩戴的识别的实现步骤:
1、导入被识别图片;
2、将图片降噪,灰度化;
3、调用安全帽分类器进行计算;
4、输出结果。

图3-1安全帽识别流程
动态检测系统的实现思路:
获得视频源;
1.对视频进行行人识别,获得视频中的行人图片;
2.对获得的行人图片进行灰度化;
3.对灰度化的图片进行安全帽识别;
4.得到结果。

图3-2动态监测的流程图

四、制作安全帽分类器

分类器是整个安全帽识别的基石,在前文说过现代的图像识别的原理便是通过事先准备好的特征库,让机器对图像与特征库里的特征进行匹配比较,从而进行判断。分类器就是我们这次实验的特征库,通过对正负样本的处理,获取安全帽的特征,制作成本次实验的安全帽分类器。

图4-1训练分类器流程图
4.1、获取样本
样本的获取有很多种方法,从网上寻找图片下载、获取别人的数据集、从视频中分解出图片等等其最终的目的都是获取大量的相关图片。关于样本,这里还分为两种,一种是实验所要识别的物品的图片,称之为正样本;另一种为不包含实验所要识别的物品的图片,即负样本。对于正样本,他所展示的实验识别物品需要尽量的多样化,不要只收集实验物品的正面图片,单一环境的图片,尽可能地拥有各种可能性下出现的物品状态的图片。如,在不同灯光照射下的图片、不同角度的图片、被遮掩的图片,这样能提高实验的对物品的识别率,降低识别时环境因素的干扰。而负样本的话,则尽量多元化,选择不含实验物品的图片,譬如这次实验需要识别安全帽,负样本便可选择未戴安全帽的人,不包含安全帽的风景照,要和正样本要有差别但是也不能差别太大,不然会在后面的步骤在第一级就全部被分类器reject,训练时不能显示负样本的个数,从而导致卡死。
本次实验采用对视频流的分解获取图片,开启笔记本的摄像头,拍摄到佩戴安全帽的人员,编写代码,使用opencv对视频流的处理,对每一帧进行判断,识别人脸,扩大识别到的范围,截取头部及安全帽部分。这样便获得了实验所需的正样本,而负样本可以从网上下载。获得正样本数量777,负样本数量1349。
下面是截取图片的部分代码:

dets = detector(img, 1) dist = [] for face in dets: # 将识别的框扩大 left = int(face.left()*0.9) top = int(face.top()*0.4) right = int(face.right()*1.1) bottom = int(face.bottom()) global index index= index + 1 ha = img[int(top):int(bottom), int(left):int(right)] cv2.rectangle(img, (left, top), (right, bottom), (0, 255, 0), 2) # 沿着框截取图片保存下来 cv2.imwrite(str(index)+'.jpg',ha,[cv2.IMWRITE_JPEG_QUALITY, 100]) print(index) for k, d in enumerate(dets): shape = sp(img, d) face_descriptor = facerec.compute_face_descriptor(img, shape) d_test = numpy.array(face_descriptor) # 计算欧式距离 for i in descriptors: dist_ = numpy.linalg.norm(i - d_test) dist.append(dist_)

4.2、样本的预处理(灰度化,大小规格)
获取到的样本并不能直接进行训练,还需要对其进行预处理。我们对图片进行计算时,一般都是到像素点这一层次进行计算的,而对于现在的图片一般都是bgr颜色模式,即每个像素点都会包含各自b、g、r的值,这会让我们对图片进行计算时计算量成倍地加大。在bgr颜色模型中B=G=R时,是一种灰色,所以便可以在灰度图片中,每一个像素点以一个字节存放灰度值,因此将图片转化成灰度图片,可以大大减少计算量。
正负样本需要转化成灰度图,规格统一为25*25,或者其他的大小格式。图片的尺寸和规格控制在合适的范围内,因为如果图片过大将会产生很多的haar特征,不仅影响分类器的工作效率也会增加图片遍历的时间。一般情况下,负样本的尺寸要大于或等于正样本图片的尺寸。因此直接将负样本的图片尺寸设置成和正样本想听,即可减少图片的遍历的时间和处理的过程。
关于图片的预处理的部分代码:

获得高水平梯度和低垂直梯度的图像区域

gradX = cv2.Sobel(img_gray, ddepth=cv2.CV_32F, dx=1, dy=0, ksize=-1)
gradY = cv2.Sobel(img_gray, ddepth=cv2.CV_32F, dx=0, dy=1, ksize=-1)
img_gradient = cv2.subtract(gradX, gradY)
img_gradient = cv2.convertScaleAbs(img_gradient)

去除噪声

blurred = cv2.blur(img_gradient, (9, 9))
(_, thresh) = cv2.threshold(blurred, 90, 255, cv2.THRESH_BINARY)

填充空白区域

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (25, 25))
closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)

腐蚀与膨胀

closed = cv2.erode(thresh, None, iterations=4)
closed = cv2.dilate(thresh, None, iterations=4)

绘制物体边框

(cnts, _) = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
c = sorted(cnts, key=cv2.contourArea, reverse=True)[0]
rect = cv2.minAreaRect©
box = np.int0(cv2.boxPoints(rect))
cv2.drawContours(img_gray, [box], -1, (0, 255, 0), 3)

截取区域

Xs = [i[0] for i in box]
Ys = [i[1] for i in box]
x1 = min(Xs)
x2 = max(Xs)
x1_ = int((x2-x1)/2-125)
x2_ = int((x2-x1)/2+125)

y1 = min(Ys)
y2 = max(Ys)
y1_ = int((y2 - y1)/2-125)
y2_ = int((y2 - y1)/2+125)
cv2.rectangle(img_gray,(x1_,y1_),(x2_,y2_),(0,255,0),2)

五、安全帽识别设计与实现

本实验利用opencv进行视频流的识别。在对视频进行分析时,由于视频是由图片一帧一帧连接起来的,所以需要将视频进行分解,每几帧便截取一张图片出来分析,在分析中需要使用到安全帽相关的特征进行比较,关于安全帽的相关特征,通过opencv对正负样本的训练得到的安全帽分类器便是所需要的相关特征。最后得到分析结果,将分析结果输出。
5.1、安全帽识别实现
引用安全帽分类器cascade-v2.5.xml,将要识别的图片进行与正负样本相同的灰度化处理,因为之前的分类器是由灰度化的图片训练出来的,为了实验的准确性,所以需要将被识别的图片进行灰度化。灰度化之后对图片进行特征对比,将对比结果输出,采用cv2.rectangle函数对图片识别出的安全帽的边缘进行标识,最后通过cv2.imshow进行展示。
部分实现代码如下:
gray = cv2.cvtColor(input_img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.09, 1)
if faces != ():
color = (0, 255, 0)
for (xf, yf, wf, hf) in faces:
cv2.rectangle(input_img, (xf, yf), (xf + wf, yf + hf), (0, 255, 0), 2)
cv2.imshow(‘frame’, input_img)

运行结果:

图5-1安全帽识别

图5-3未戴安全帽的基于人脸的安全帽识别

文章底部可以获取博主的联系方式,获取源码、查看详细的视频演示,或者了解其他版本的信息。
所有项目都经过了严格的测试和完善。对于本系统,我们提供全方位的支持,包括修改时间和标题,以及完整的安装、部署、运行和调试服务,确保系统能在你的电脑上顺利运行。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/13 20:30:03

【Open-AutoGLM极致优化】:3种罕见延迟场景及对应加速方案

第一章:Open-AutoGLM操作延迟问题的现状与挑战在当前大模型推理系统中,Open-AutoGLM作为自动化代码生成与执行的核心组件,其操作延迟直接影响整体系统的响应效率与用户体验。随着任务复杂度上升和并发请求增长,延迟问题日益凸显&a…

作者头像 李华
网站建设 2026/4/10 19:29:31

基于单片机的护眼仪--结构设计

2 护眼仪的总体设计 2.1 概述 护眼的结构分为,墨镜片,主体外壳,松紧带,开关按键,磁石触头。 2.2 护眼仪的设计要求 2.2.1 护眼仪规格参数要求2.2.2 使用方式图2.1 护眼仪使用开关 图2.1是为护眼仪设计的三个开关&#…

作者头像 李华
网站建设 2026/4/14 6:23:37

从经验驱动到数学证明的范式转变

传统软件测试依赖测试用例设计与执行,本质上属于“样本验证”模式。形式化方法通过数学语言精确描述系统规约,将软件行为验证转化为逻辑命题证明,为测试领域提供了从“概率性缺陷发现”迈向“确定性质量论证”的理论桥梁。对于日均处理数百个…

作者头像 李华
网站建设 2026/4/10 15:07:31

【Open-AutoGLM内存优化终极指南】:揭秘千兆模型压缩背后的核心技术

第一章:Open-AutoGLM内存优化的核心挑战 在大规模语言模型(LLM)的部署与推理过程中,内存占用成为制约性能与可扩展性的关键瓶颈。Open-AutoGLM作为支持自动化任务生成与执行的开源框架,其运行时需加载多层级参数结构、…

作者头像 李华
网站建设 2026/4/15 11:12:40

Custom SRP - 16 Render Scale

Scaling Up and Down 这篇教程介绍如何解耦屏幕分辨率与渲染分辨率支持缩放支持每个摄像机不同的缩放在 post fx 之后恢复缩放,避免失真1 Variable Resolution程序运行在固定的分辨率下,一些程序允许在运行时更改分辨率,但这需要重新初始化图…

作者头像 李华