基于Python通过OpenCV实现的口罩识别系统操作篇

基于Python通过OpenCV实现的口罩识别系统操作篇


前言

理论思路介绍篇,可以查看往日文章。
项目实现环境:
基于Python 3.8.1版本
opencv-python 4.2.0.34版本
需要自己下载OpenCV的库文件,添加其中的分类器


一、级联分类器

首先要引入相应的级联分类器
本项目一共使用了三个级联分类器:
人脸面部识别树:haarcascade_frontalface_alt2.xml
人脸面部鼻子识别树:haarcascade_mcs_nose.xml
口罩检测识别训练树:cascade.xml(这个训练的级联分类器是第三方制作文件,非OpenCV原厂训练文件)

二、使用步骤

1.引入库

import cv2.cv2 as cv
import time
import numpy as np
import pygame
import threading

以上的相应库函数,通过python的pip可以进行添加,添加OpenCV库的时候容易出现多个bug,建议参考以前的文章OpenCV的安装。

2.引入级联分类器

引入分类器时候,注意使用分类器是要将其引入的地址填写正确。

face_cascade = cv.CascadeClassifier('D:/OPENCV/opencv/build/etc/haarcascades/haarcascade_frontalface_alt2.xml')#人脸面部识别
eye_cascade = cv.CascadeClassifier('D:/OPENCV/opencv/build/etc/haarcascades/haarcascade_eye_tree_eyeglasses.xml')#面部眼镜识别
nose_cascade = cv.CascadeClassifier('D:/OPENCV/opencv/build/etc/haarcascades/haarcascade_mcs_nose.xml')#人脸面部鼻子识别
mask_detector = cv.CascadeClassifier("D:/OPENCV/opencv/build/etc/haarcascades/cascade.xml")#人脸佩戴口罩识别

3.对象识别方式

特征比对函数
可以看到一共有8个参数。

1.img(必需)

这个不用多解释,显然是要输入的图像。图像可以是彩色也可以是灰度的。

2.foundLocations

存取检测到的目标位置

3.hitThreshold (可选)

opencv documents的解释是特征到SVM超平面的距离的阈值(Threshold for the distance between features and SVM classifying plane)

所以说这个参数可能是控制HOG特征与SVM最优超平面间的最大距离,当距离小于阈值时则判定为目标。

4.winStride(可选)

HoG检测窗口移动时的步长(水平及竖直)。

winStride和scale都是比较重要的参数,需要合理的设置。一个合适参数能够大大提升检测精确度,同时也不会使检测时间太长。

5.padding(可选)

在原图外围添加像素,作者在原文中提到,适当的pad可以提高检测的准确率(可能pad后能检测到边角的目标?)

常见的pad size 有(8, 8), (16, 16), (24, 24), (32, 32).

6.scale(可选)
在这里插入图片描述
图是一个图像金字塔,也就是图像的多尺度表示。每层图像都被缩小尺寸并用gaussian平滑。

scale参数可以具体控制金字塔的层数,参数越小,层数越多,检测时间也长。 一下分别是1.01 1.5 1.03 时检测到的目标。 通常scale在1.01-1.5这个区间
在这里插入图片描述
在这里插入图片描述
7.finalThreshold(可选)

这个参数不太清楚,有人说是为了优化最后的bounding box

8.useMeanShiftGrouping(可选)

bool 类型,决定是否应用meanshift 来消除重叠。

default为false,通常也设为false,另行应用non-maxima supperssion效果更好。

实际代码

ret, frame = cameraCapture.read()#首先是将摄像头转化的输出转化为一帧一帧的图像
        gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)将图像转化为灰度图像,减少运算量
        faces = face_cascade.detectMultiScale(gray, 1.2, 10)#运用比对函数1.2为每次以1.2倍移动比对,10为识别次数为10次便认为是我们需要的图像。
        masks = mask_detector.detectMultiScale(gray, 1.03, 5)#
        noses = nose_cascade.detectMultiScale(gray, 1.2, 10)#

对比参数需要按照实际情况进行测试和调整,有时候将对比次数调整的过高将会导致程序的运算量过大,虽然准确无误,但是又会忽略许多的残缺实际对象,比如上图中的小孩子,就会被忽略。

三、画出识别对象

代码操作方式

代码如下(示例):

ret, frame = cameraCapture.read()
        gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
        faces = face_cascade
  • 45
    点赞
  • 148
    收藏
    觉得还不错? 一键收藏
  • 21
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值