一、项目简介
本系统是一个基于MATLAB GUI的人脸及人眼检测与疲劳状态识别系统。系统通过加载视频文件或图像序列,自动完成人脸区域检测、人眼区域定位、人眼精确定位以及睁闭眼状态判别,最终根据连续帧中眼睛闭合比例判断目标是否处于疲劳状态。系统整体由图像预处理模块、人脸检测模块、人眼检测模块、状态判别模块以及GUI交互界面构成。
图像预处理模块通过GetValideImage函数去除视频黑边和无效区域,将有效图像区域裁剪出来,为后续处理提供干净的输入图像。人脸检测模块在HSV颜色空间下利用肤色模型进行人脸区域定位,通过阈值分割并结合形态学闭运算、开运算以及孔洞填充,提取出最大连通区域作为人脸区域,再根据人脸几何比例裁剪出人脸图像。人眼检测模块在人脸区域内利用灰度积分投影进行人眼粗定位,随后通过二值化、边缘检测、形态学填充和连通区域分析实现人眼精确定位,标记出左右双眼的精确位置。状态判别模块统计每帧图像中眼睛区域的像素面积,经归一化后与设定阈值进行比较,判定当前帧为睁眼或闭眼状态,最后计算整个视频序列中闭眼帧数比例,依据疲劳判别标准输出疲劳或非疲劳的最终结果。
系统提供了完整的GUI操作界面,用户可选择视频文件进行分帧处理,逐帧显示检测过程与判别结果,并支持疲劳阈值的手动调节,具备良好的可视化效果和交互友好性。
二、部分源码
function pushbutton1_Callback(hObject, eventdata, handles)
% 显示figure标记
flag = 1;
% 获取图片库文件列表
files = ls('video_images/*.jpg');
N = size(files, 1);
kk=0;
for i = 1 : N
file = fullfile(pwd, 'video_images', files(i, :));
Img = imread(file);
axes(handles.axes1);
imshow(Img);
%imwrite(Img,'原图.jpg')
% 图像预处理
Im1, rectValide = GetValideImage(Img, 0);%自定义的函数
%axes(handles.axes2); imshow(Im1, \[\]); title('有效区域图像');
m n=size(Im1);
% 人脸区域定位
Im2, bw, rectFace = GetFaceAreaImg(Im1, 0);
axes(handles.axes3); imshow(Im2, \[\]); title('人脸区域图像');
% 人眼区域定位
imm=Im2;
%Im3, rectEye = GetEyeAreaImg(Im2, 0);%被 拆解
%%%把GetEyeAreaImg子函数写入主函数
% 获取人眼区域图像
if nargin < 2
flag = 1;
end
% 灰度化
if ndims(imm) == 3
I = rgb2gray(imm);
else
I = imm;
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);
% 人眼区域定位
cstart = max(sz(2)-indmaxcs-35, 8);
csend = min(indmaxcs + 15, sz(2)-20);
rstart = max(indmaxrs-40, 25);
rsend = indmaxrs;
rectEye = cstart rstart csend-cstart rsend-rstart;
% 人眼区域裁剪
Im3 = imcrop(imm, rectEye);
axes(handles.axes5); imshow(Im3, \[\]); title('人眼区域图像');
axes(handles.axes3);%在上一步基础上框定 出 眼睛
hold on
rectangle('Position', rectEye, 'EdgeColor', 'r');
hold off;
% 人眼精确定位
iiim=Im3;
% 获取精确人眼区域
if nargin < 2
flag = 1;
end
% 灰度化
if ndims(iiim) == 3
I = rgb2gray(iiim);
else
I = iiim;
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
% 提取定位结果
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;
% 标记结果
r = iiim(:, :, 1);
g = iiim(:, :, 2);
b = iiim(:, :, 3);
r(bwf) = 255;
g(bwf) = 0;
b(bwf) = 0;
Im4 = cat(3, r, g, b);
nv = sum(bwf(:));
% 显示结果
axes(handles.axes14); imshow(Im4, \[\]); title('标记图像');
% 统计特征信息
Nv(i).file = file;%%帧图像名称路径
Nv(i).nv = nv;%921
Nv(i).rectEye = rectEye;%8 31 163 40
Nv(i).rectEyes = rect;%1x4 1x4
Nv(i).rectFace = rectFace;%90.5000 153.0000 198 192
Nv(i).rectValide = rectValide;%301 1 359 600
% 解析文件名称
pathstr, name, ext = fileparts(file);
%fprintf('\n--------处理%s--------\n', name, ext);
set(handles.listbox1,'string',name, ext)
if flag
% figure(i);
axes(handles.axes1);%原图基础上显示
hold on;
三、运行结果

四、总结
本文设计并实现了一个基于MATLAB的人眼检测与疲劳识别系统,涵盖了从视频读取、图像预处理、人脸检测、人眼粗定位、人眼精确定位到状态判别的完整处理链路。系统在HSV肤色空间下实现了人脸区域的有效提取,利用灰度积分投影与形态学处理完成了人眼的精确定位,并通过眼睛区域面积归一化与阈值比较实现了睁闭眼状态的自动判别。实验结果表明,系统能够较为准确地检测人脸和人眼区域,并在正常光照条件下对受试者的疲劳状态做出有效判断。系统的主要不足在于对光照变化较为敏感,当图像亮度过暗或过曝时,肤色分割和人眼定位的准确率会有所下降;此外,当受试者佩戴眼镜或头部转动角度较大时,人眼检测的稳定性也有待进一步提升。后续工作可考虑引入深度学习目标检测算法以提高复杂场景下的鲁棒性。
五、代码获取
接matlab程序定制和论文设计,方向如下:
图像处理|语音识别|图像识别|目标检测|深度学习|神经网络|强化学习|机器学习|通信系统|信号处理|时频分析|小波降噪|路径规划|优化算法|智能算法|数据处理|数学建模|文献复现|算法复现|模型复现等
程序包运行成功,零基础的可以远程帮你运行,赠送安装包。
作为初学者,遇见不会的问题是非常正常的事情,具体代码仿真可通过主页 私信博主。