数字图像处理课程设计-疲劳检测系统

article/2025/9/23 20:15:13

文章目录

  • 数字图像处理课程设计-疲劳检测系统
    • 前言
    • 一、课程设计任务
    • 二、设计框图
    • 三、准备工作
    • 四、任务流程
      • 4.1视频预处理
      • 4.2图片分割
    • 五、结果
    • 六、项目总结

数字图像处理课程设计-疲劳检测系统

前言

  • 此系统基于MATLAB设计,核心思想是PERCLOS算法.

  • 参考文章MATLAB疲劳检测系统 - 知乎

  • 需要源码的,私信或者留下邮箱

    一、课程设计任务

应用数字图像处理相关知识和技术实现某一应用,如人脸识别、动物识别、水果识别等综合性任务,题目自选。

本文在matlab R2018b开发环境下,实现人脸检测系统。

疲劳检测可以应用于大巴车司机,货车司机疲劳驾驶监测,现在很多情况下大巴车或者货车等司机都由于休息不好,疲劳上路,这就给安全造成了及其大的隐患。如果有一套系统,可以实时接入车辆摄像头,摄像头对准司机,当检测到司机疲劳状态的时候,则提醒后台并且语音提醒,以做出正确决策,避免车祸等悲剧的发生。该系统也可以应用于上课学生专注度分析,进行疲劳预警。

二、设计框图

在这里插入图片描述

三、准备工作

  • 开发环境:windows 10,matlab R2018b
  • 制图软件:visio 2013
  • 素材示意:人脸图像/视频
    在这里插入图片描述

四、任务流程

4.1视频预处理

  1. 首先将彩色视频video.avi读入,将图像分帧。
obj = VideoReader(uigetfile('*.avi','选择视频'));%输入视频位置
setappdata(0,'obj',obj);%设置全局变量
Show_Frames=read(obj,1);%显示第一帧作为封面
axes(handles.axes1);
imshow(Show_Frames);
set(handles.listbox1,'String','分帧开始...');prompt={'输入图片名是几位数:'};defans={'2'};%默认两位数p=inputdlg(prompt,'输入位数',1,defans);numzeros=str2num(p{1});nz = strcat('%0',num2str(numzeros),'d');numFrames = obj.NumberOfFrames;% 帧的总数
for k = 1 :5  % 读取前5帧  numFrames
frame = read(obj,k);%读取第几帧
id=sprintf(nz,k);
imwrite(frame,strcat('video_images/',id,'.jpg'),'jpg');% 保存帧
end
set(handles.listbox1,'String','分帧结束');
  1. 利用MATLAB函数rgb2gray转换成灰度图像。

  2. 去除视频黑边,定位有效图像区域。

  3. 将结果输出到指定路径images下。

function [Irect, rect] = GetValideImage(Img, flag)
% 获取有效图像区域
if nargin < 2flag = 1;
end% 灰度化
if ndims(Img) == 3I = rgb2gray(Img);
elseI = Img;
end
% 去除视频黑边,定位有效图像区域
tol = 1000;
sz = size(I);
cs = sum(I, 1);
c = find(cs > tol);
cmin = min(c);
cmax = max(c);
rect = [cmin 1 cmax-cmin sz(1)];
% 图像切割,获取有效区域图像
Irect = imcrop(Img, rect);
% 显示中间处理过程图像
if flagfigure;subplot(2, 2, 1); imshow(Img, []); title('原图像');subplot(2, 2, 2); imshow(I, []); title('灰度图像');subplot(2, 2, 3); imshow(Img, []); title('有效区域图像标记');hold on;rectangle('Position', rect, 'EdgeColor', 'r', 'LineWidth', 2);hold off;subplot(2, 2, 4); imshow(Irect, []); title('有效区域图像');
end

4.2图片分割

4.2.1 人脸定位

  1. 读入images路径下所有jpg图像。

  2. 利用MATLAB函数rgb2hsv将RGB颜色转换为HSV。

% 颜色空间转换
hsv = rgb2hsv(Img);
h = hsv(:, :, 1);
s = hsv(:, :, 2);
v = hsv(:, :, 3);
% 区域数据范围
hsp = [0.01 0.5];
ssp = [0.1 0.85];
vsp = [0.25 0.85];
sz = size(h);
  1. 根据HSV对肤色定位,提取人脸区域。
% 初始化模板
mask = zeros(sz);
% 肤色定位
for i = 1 : sz(1)for j = 1 : sz(2)if h(i, j) > hsp(1) && h(i, j) < hsp(2) && ...s(i, j) > ssp(1) && s(i, j) < ssp(2) && ...v(i, j) > vsp(1) && v(i, j) < vsp(2)mask(i, j) = 1;endend
end
% 形态学处理
mask = logical(mask);
mask = imclose(mask, strel('disk', 15));
mask = imopen(mask, strel('disk', 15));
mask = imfill(mask, 'holes');
% 提取人脸区域
[L, num] = bwlabel(mask);
stats = regionprops(L);
Ar = cat(1, stats.Area);
[Ar, ind] = sort(Ar, 'descend');
bw = mask;
bw(L ~= ind(1)) = 0;

4.2.2人眼定位

  1. 先对图像预处理,利用MATLAB函数rgb2gray转换成灰度图像。利用函数medfilt2对图像中值滤波,利用灰度积分find进行投影。
% 灰度化
if ndims(Img) == 3I = rgb2gray(Img);
elseI = Img;
end
% 中值滤波
I = medfilt2(I, [5 5]);
% 灰度积分投影
sz = size(I);
[r, c] = find(I > 0);
rmin = min(r);
rmax = max(r);
cs = sum(I, 1);
rs = sum(I, 2);
[maxcs, indmaxcs] = max(cs);
[maxrs, indmaxrs] = max(rs);
  1. 对人眼区域定位。
% 人眼区域定位
cstart = max(sz(2)-indmaxcs-35, 8);
csend = min(indmaxcs + 15, sz(2)-20);
rstart = max(indmaxrs-40, 25);
rsend = indmaxrs;
rect = [cstart rstart csend-cstart rsend-rstart];
  1. 裁掉多余的区域。
% 人眼区域裁剪
Im = imcrop(Img, rect);
if flagfigure;subplot(2, 2, 1); imshow(Img, []); title('原图像');subplot(2, 2, 2); imshow(I, []); hold on;rectangle('Position', rect, 'EdgeColor', 'r');hold off;title('灰度图像');subplot(2, 2, 3); plot(1:sz(2), cs);  title('列投影曲线');subplot(2, 2, 4); plot(rs, 1:sz(1)); title('行投影曲线');
end

4.2.3人眼精确定位

  1. 图像预处理,利用MATLAB函数rgb2gray对图像进行灰度化。利用函数graythresh进行二值化。提取图像边缘。
% 获取精确人眼区域
if nargin < 2flag = 1;
end% 灰度化
if ndims(Img) == 3I = rgb2gray(Img);
elseI = Img;
end
% 二值化
th = max(graythresh(I)*0.4, 0.1);
bw = im2bw(I, th);
% 提取边缘
bwe = edge(bw, 'canny');
% 填孔处理
bwd = imfill(bwe, 'holes');
bwf = bwd;
bwf = imdilate(bwf, strel('square', 3));
bwf = imfill(bwf, 'holes');
% 去掉边缘噪声
[L, num] = bwlabel(bwf);
stats = regionprops(L);
Ar = cat(1, stats.Area);
[Ar, ind] = sort(Ar, 'descend');
if num > 2for j = 3 : numbwf(L == ind(j)) = 0;end
end
  1. 提取定位结果。
% 提取定位结果
rect1 = stats(ind(1)).BoundingBox;
rect2 = stats(ind(2)).BoundingBox;
rect1(2) = rect1(2) - 2;
rect2(2) = rect2(2) - 2;
rect{1} = rect1;
rect{2} = rect2;

4.3疲劳检测

  1. 利用PERCLOS算法,计算人眼在单位时间内闭合所占比。
data = cat(1, Nv.nv);
Nmin = min(data);
Nmax = max(data);
rate = (data-Nmin)./(Nmax-Nmin);
set(handles.listbox3,'string',rate)
pause(5) %%%%每间隔2s时间处理下一帧图像
  1. 输出结果, 计算的perclos值与tol做比较判断是否疲劳
tol = 0.4;  %%%归一化判断标准
status = '正常';
for i = 1 : Nif rate(i) < tol && isequal(status, '正常')status = '疲劳';start = i;endif rate(i) < tol && isequal(status, '疲劳') && i - start > 1status = '睡着';start = i;endif rate(i) < tol && isequal(status, '睡着') && i - start > 2status = '疲劳';start = i;endif rate(i) > tolstatus = '正常';endNv(i).status = status;end

五、结果

  1. GUI界面
    在这里插入图片描述

  2. 输入视频,分帧处理,分割图像

在这里插入图片描述

  1. 输出结果
    在这里插入图片描述

六、项目总结

使用图像预处理技术得到灰度分配较为均匀的图像,然后分别利用水平和垂直灰度积分投影曲线结合人脸的结构特征找到眼睛的位置坐标,实现了准确的眼睛定位,通过perclos技术技术眨眼率,根据先验值得到是否疲劳。完成了疲劳检测系统的设计。

通过本次项目设计,不仅熟练应用了MATLAB的基本函数,也学到了PERCLOS算法。

PERCLOS算法(Percentage of Eyelid Closure Over the Pupil Time的缩写,意为单位时间里眼睛闭合时间所占的百分比)

PERCLOS原理: F= t 3 − t 2 t 4 − t 1 \frac{t~3~-t~2~}{t~4~-t~1~} t 4 t 1 t 3 t 2 *100%

F是一的话就是睁眼;连续N帧后便可获取关于01之间的序列,然后分析0在该序列中所占比例来描述疲劳状态。

在这里插入图片描述


http://chatgpt.dhexx.cn/article/pLvNDjKI.shtml

相关文章

MATLAB的疲劳检测系统

一、课题介绍 本设计针对现有逐帧眼睛定位方法计算量大&#xff0c;速度慢的缺点&#xff0c;提出一种用于疲劳驾驶实时监测的眼睛定位方法&#xff0c;该方法能够在保证眼睛定位准确性的同时&#xff0c;减少人脸定位的计算量&#xff0c;从而提高图像处理速度&#xff0c;实现…

毕业设计 机器视觉 opencv 深度学习 驾驶人脸疲劳检测系统 -python

文章目录 0 前言1 课题背景2 Dlib人脸识别2.1 简介2.2 Dlib优点2.3 相关代码2.4 人脸数据库2.5 人脸录入加识别效果 3 疲劳检测算法3.1 眼睛检测算法3.2 打哈欠检测算法3.3 点头检测算法 4 PyQt54.1 简介4.2相关界面代码 5 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业…

利用opencv 做一个疲劳检测系统(2)

文章目录 杂谈实现步骤核心算法交互界面界面代码检测效果源代码 杂谈 最近发现视力下降严重&#xff0c; 可能跟我的过度用眼有关&#xff0c;于是想着能不能做一个检测用眼疲劳的&#xff0c;灵感来自特斯拉的疲劳检测系统。 效果如下&#xff1a; 实现步骤 实现核心算法制…

基于Matlab深度学习的驾驶员疲劳检测系统

随着城市化进程不断加快,中国汽车的需求 量和保有量也急剧上升。 截至 2020 年 9 月,中国 汽车保有量达到了 2.75 亿辆,随着车辆保有量的 增加,交通事故的发生率也在逐年上升。2017 年交通事故共计 20.3 万起,因车祸死亡人数 6.3 万 人,2018 年交通事故较 2017 年上升 20.6%,20…

基于MATLAB的疲劳检测系统

基于MATLAB的疲劳检测系统 一、课题介绍 随着汽车工业的不断发展,随之而来的社会问题也愈加严重。交通事故给人们造成巨大伤害的同时,也给社会带来沉重的负担和影响。由于疲劳驾驶是引起交通事故的一个主要原因。因此,研究一种合理有效、实时准确检测驾驶员疲劳驾驶的非接触式车…

基于图像分割的疲劳检测方法研究

问题&#xff1a; 随着社会的不断进步,汽车已经成为了当今世界拥有主宰地位的交通工具。然而汽车数量的上升同时也导致交通事故数量猛增,由司机疲劳驾驶引起的交通事故的发生频率更是不断攀升。疲劳的复杂性引起了各个学科的研究者广泛关注&#xff0c;传统的疲劳评估方法不仅需…

疲劳检测实验报告

疲劳检测实验报告 邢益玮 201930101151 2021/1/13 &#xff08;重度拖延症了&#xff0c;内容又有点多&#xff0c;学长和老师不好意思了&#x1f64f;&#x1f64f;&#x1f64f;&#xff09; 文章目录 疲劳检测实验报告前言一、最初的尝试——dlib库1.1 信息收集1.2 为Anac…

基于MATLAB的疲劳检测

在疲劳检测算法中&#xff0c;个人感觉最好的算法是 Dlib 这个库可以实现人脸的关键点的检测&#xff0c;有了人眼睛的点位&#xff0c;便可以检测眨眼之类的频率来进行人眼识别&#xff1b; 但是在matlab中调用dlip需要比较复杂的操做&#xff0c;有兴趣的可以网上搜索做法&am…

MATLAB疲劳检测系统

目录 摘要 I Abstract II 1 绪论 1 1.1 研究背景及意义 1 1.2 国内外疲劳驾驶研究现状 2 1.3本文的主要研究内容及组织结构 3 2 人脸检测与定位技术 4 2.1人脸检测与定位技术概述 4 2.1.1基于图像的人脸检测方法 4 2.1.2基于特征的人脸检测方法 5 2.2 Adaboost算法介绍 6 2.2.1…

python疲劳检测

疲劳驾驶检测 结合眼睛的闭合状态和嘴巴闭合状态&#xff0c;综合判断驾驶人员的疲劳状况。python编写&#xff0c;tensorflow&#xff0c;opencv和dlib实现人脸的检测和特征点提取。 效果图&#xff1a; 效果视频: python opencv 疲劳驾驶检测 项目代码下载&#xff1a; pyt…

疲劳检测(一)Landmark + HeadPose

数据集 1&#xff09;Drazy 数据集&#xff1a;红外&#xff0c;包含多种用于疲劳检测的数据&#xff0c;(有电极) 14*3*10min get http://www.drozy.ulg.ac.be/ 2&#xff09;NTHU 驾驶员疲劳检测数据集 http://cv.cs.nthu.edu.tw/php/callforpaper/datasets/DDD/ 3&am…

26.疲劳检测

目录 1 项目介绍 2 代码实现 2.1 导入库 2.2 定义68个关键点 2.3 定义eye_aspect_ratio() 2.4 定义参数 2.5 定义阈值 2.6 定义次数 2.7 创建检测器 2.8 获取左眼与右眼的起始点与终止点 2.9 读取视频 2.10 定义shape_to_np() 2.11 遍历每一帧 2.11…

Dlib模型之驾驶员疲劳检测一(眨眼)

目录 序目的技术背景 正文&#xff08;1&#xff09;环境搭建&#xff08;2&#xff09;下载开源数据集&#xff08;3&#xff09;视觉疲劳检测原理&#xff08;4&#xff09;主要代码思路&#xff08;5&#xff09;运行效果 序 目的 经查阅相关文献&#xff0c;疲劳在人体面…

Python人脸检测实战之疲劳检测

本文主要介绍了实现疲劳检测&#xff1a;如果眼睛已经闭上了一段时间&#xff0c;我们会认为他们开始打瞌睡并发出警报来唤醒他们并引起他们的注意&#xff0c;感兴趣的朋友可以了解一下。 今天我们实现疲劳检测。 如果眼睛已经闭上了一段时间&#xff0c;我们会认为他们开始打…

计算机视觉项目实战-驾驶员疲劳检测

&#x1f60a;&#x1f60a;&#x1f60a;欢迎来到本博客&#x1f60a;&#x1f60a;&#x1f60a; 本次博客内容将继续讲解关于OpenCV的相关知识 &#x1f389;作者简介&#xff1a;⭐️⭐️⭐️目前计算机研究生在读。主要研究方向是人工智能和群智能算法方向。目前熟悉深度学…

【毕业设计】深度学习疲劳检测 驾驶行为检测 - python opencv cnn

文章目录 0 前言1 课题背景2 相关技术2.1 Dlib人脸识别库2.2 疲劳检测算法2.3 YOLOV5算法 3 效果展示3.1 眨眼3.2 打哈欠3.3 使用手机检测3.4 抽烟检测3.5 喝水检测 4 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目…

Pandas和Numpy:常见函数参数inplace的作用

1.inplace参数的作用 pandas中&#xff0c;包括numpy中很多方法都设置了inplace参数。该参数的主要作用是指示是否在本地数据上做更改&#xff0c;其只能接受bool型参数&#xff0c;即 True和False. 具体示例如下&#xff1a; data为原始数据。接下来用dataframe.drop()删除Ti…

编译inplace_abn

出现以上问题 1、检查pytorch版本&#xff0c;一般1.5以上 2、检查cuda版本&#xff0c;一般10.1以上 3、检查环境变量设置 linux&#xff1a;export -p 重点检查 PATH 、LD_LIBRARY_PATH 不能重复设置变量&#xff0c;将重复的删掉 unset LANG 是将LANG删掉 declare -x LANG是…

build_ext --inplace 是什么意思

如果是做目标检测类的任务&#xff0c;经常需要用到cocoapi python setup.py build_ext --inplacebuild_ext是指明python生成C/C的扩展模块(build C/C extensions (compile/link to build directory))--inplace指示 将编译后的扩展模块直接放在与test.py同级的目录中。 流程如…

Bug集和之3:set_index 设定索引——inplace参数

知识点&#xff1a;set_index() 问题发现&#xff1a; 需要设定索引&#xff0c;以获取特定行的数据 &#xff0c;但最后结果运行的不理想 初始数据 index000056.OF…01998-3-27NaN……………70302023-1-132.573… 过程代码 result.set_index(index) df result.loc[20…