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

## 前言

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

• 需要源码的,私信或者留下邮箱*一、课程设计任务

[En]

The application of digital image processing related knowledge and technology to achieve an application, such as face recognition, animal recognition, fruit recognition and other comprehensive tasks, topics of choice.

[En]

Fatigue detection can be applied to bus drivers, truck drivers fatigue driving monitoring, now in many cases bus or truck drivers are due to poor rest, fatigue on the road, which has caused a great hidden danger to safety. If there is a system that can access the vehicle camera in real time, and the camera is aimed at the driver, when the driver’s fatigue is detected, it will remind the background and voice to make the right decision and avoid tragedies such as car accidents. The system can also be used to analyze the concentration of students in class and carry out fatigue early warning.

; 三、准备工作
• 开发环境：windows 10,matlab R2018b
• 制图软件：visio 2013
• 素材示意：人脸图像/视频

### ４.１视频预处理

1. 首先将彩色视频video.avi读入，将图像分帧。
obj = VideoReader(uigetfile('*.avi','选择视频'));%输入视频位置
setappdata(0,'obj',obj);%设置全局变量
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
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 < 2
flag = 1;
end

% 灰度化
if ndims(Img) == 3
I = rgb2gray(Img);
else
I = 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 flag
figure;
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对肤色定位，提取人脸区域。
% 初始化模板
% 肤色定位
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)
end
end
end
% 形态学处理
% 提取人脸区域
stats = regionprops(L);
Ar = cat(1, stats.Area);
[Ar, ind] = sort(Ar, 'descend');
bw(L ~= ind(1)) = 0;


4.2.2人眼定位

1. 先对图像预处理，利用MATLAB函数rgb2gray转换成灰度图像。利用函数medfilt2对图像中值滤波，利用灰度积分find进行投影。
% 灰度化
if ndims(Img) == 3
I = rgb2gray(Img);
else
I = 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 flag
figure;
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 < 2
flag = 1;
end

% 灰度化
if ndims(Img) == 3
I = rgb2gray(Img);
else
I = 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 > 2
for j = 3 : num
bwf(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 : N
if rate(i) < tol && isequal(status, '正常')
status = '疲劳';
start = i;
end
if rate(i) < tol && isequal(status, '疲劳') && i - start > 1
status = '睡着';
start = i;
end
if rate(i) < tol && isequal(status, '睡着') && i - start > 2
status = '疲劳';
start = i;
end
if rate(i) > tol
status = '正常';
end
Nv(i).status = status;

end


1. GUI界面
2. 输入视频，分帧处理，分割图像

1. 输出结果

; 六、项目总结

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在该序列中所占比例来描述疲劳状态。

Original: https://blog.csdn.net/qq_49488584/article/details/122314703
Author: 张时贰
Title: 数字图像处理课程设计-疲劳检测系统

(0)

### 大家都在看

• #### 常用音频接口简介(PDM/PCM/IIS/SLIMBUS)

缩写释义 CAS:随路信令,语音和信令在同一路话路中传送的信令CCS:共路信令,语音和信令分开传输ASLA – Advanced Sound Linux Archite…

人工智能 2022年9月11日
0275
• #### 【数值预测案例】(7) CNN-LSTM 混合神经网络气温预测，附TensorFlow完整代码

大家好，今天和各位分享一下如何使用 Tensorflow 构建 CNN卷积神经网络和 LSTM 循环神经网络相结合的混合神经网络模型，完成对多特征的时间序列预测。 本文预测模型的主…

人工智能 2022年12月21日
058
• #### CiteSpace知识图谱

一、准备 1.数据准备 新建文件夹，包含四个子文件夹：input、output、data、project 在中国知网上检索相关主题的论文，选中，导出参考文献，格式为Refworks…

人工智能 2022年10月1日
0150
• #### 树莓派4B使用NCNN部署Yolov5-lite

目录 文章目录 前言 一、树莓派配置NCNN 1.安装依赖 2.下载NCNN并编译 二、Yolov5-lite模型训练 1.源码地址 2.安装所需要的包 3.训练自己的数据集(YO…

人工智能 2022年11月15日
0149
• #### 机器学习之监督学习-分类模型K近邻(KNN)算法实现

机器学习之监督学习-分类模型K近邻(KNN)算法实现 监督学习中常用的分类分类模型有k近邻，逻辑斯谛回归，决策树。今天我们主要学习，K近邻模型。 最简单、最基本的分类器是记录训练数…

人工智能 2022年11月28日
064
• #### SVR和SVM之间有什么区别

你好，这篇文章咱们讨论一下关于「SVR和SVM之间有什么区别」的事情.. SVR和SVM的区别 什么是SVR和SVM？ SVR全称为Support Vector Regressio…

人工智能 2023年3月7日
05
• #### python深度学习之残差网络ResNets

文章目录 * – 1、什么是ResNets – 2、构建一个ResNet（50层） – + 2.1 identity block + 2.2 c…

人工智能 2022年12月8日
049
• #### Python索引index常用的8种操作

原始数据为 csv 文件。 data ”’ date,temperature,humidity 07/01/21,95,50 07/02/21,94,55 07/03/21,94…

人工智能 2022年12月3日
062
• #### HTML期末作业，基于html实现中国脸谱传统文化网站设计(5个页面)

🎉精彩专栏推荐 💭文末获取联系✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主💂 作者主页: 【主页——🚀获取更多优质源码】🎓 web前端期末大作业： 【📚毕设项目精品实战…

人工智能 2022年11月25日
084
• #### HDFS_06_HDFS服务器节点的分类

HDFS_06_HDFS服务器节点的分类 持续更新 &#x5927;&#x6570;&#x636E; 文章… 1. HDFS服务器节点的分类 ⭐…

人工智能 2022年11月28日
049
• #### tensorflow-gpu无法调用GPU的解决办法

配置：i5 6300HQ显卡是GTX950M 之前用tensorflow整天检测都是说False，捣鼓了一天，总结分享一下。 因为要使用pytorch，所以安装的cuda10.2（…

2022年8月22日
0186
• #### 机器学习—线性回归推广及案例

文章目录 * – + 引言 + 1.多项式回归 + 2.广义可加模型(GAM) 引言 在线性回归中，我们假设因变量与特征之间的关系是线性关系，这样的假设使得模型很简单，…

人工智能 2022年11月19日
065
• #### 中文NER的那些事儿3. SoftLexicon等词表增强详解&代码实现

前两章我们分别介绍了NER的基线模型Bert-Bilstm-crf, 以及多任务和对抗学习在解决词边界和跨领域迁移的解决方案。这一章我们就 词汇增强这个中文NER的核心问题之一来看…

人工智能 2022年8月18日
0827
• #### (未整理完)十月每日一题打卡

; 每日打卡 模拟题：特殊情况就是在最后划分完全部三个之后，还剩四个需要变成aa-bb class Solution { public: string reformatNumber…

人工智能 2022年11月26日
072
• #### 【RNN架构解析】GRU 模型 & 注意力机制

【NLP】GRU 模型 1. GRU 模型 * 1.1 GRU的内部结构图和计算公式 1.2 Pytorch中GRU工具的使用 1.3 GRU的优缺点 2. 注意力机制 * 2.1…

人工智能 2022年12月15日
038
• #### Multi-Task Learning Using Uncertainty to Weigh Losses for Scene Geometry and Semantics

目录 摘要 1 引言 2 相关工作 3. 结合同方差不确定性的multi-task learning 3.1 同方差不确定性作为任务依赖不确定性 3.2 多任务似然 4 视觉场景理…

人工智能 2022年9月14日
0142