MATLAB教室人数统计开源代码(包含 GUI 注释 课题分析)
作者:互联网
MATLAB教室人数统计(免费开源代码)
本人参考了很多的资料最后总结整出来的,如果能够该博客对你的学习有所帮助的话,希望大家可以帮我点个赞,本人是抱着学习的态度进行分享,大家如果能在我的基础上进行二次创作的话,希望不要吝啬,分出来给大家,谢谢!
一、简介
开题报告参考链接:【人脸识别】基于GUI教室人数统计系统
1 课题背景
本课题为基于matlab的人数统计系统。近年来,很多行业对人流信息有极大的需求,如汽车公交站,地铁站台,商场出入口等。通过人数统计系统可以方便、可靠、实时地对各种场所的人流进行统计,而不对公众造成任何影响。结合其他图像分析技术,系统可以清楚快捷地掌握客流动态,提供数据支持,使决策者及时做出对策。利用图像处理来完成人数统计系统的主要优点就是图像信号非常直观,便于人为的理解。可以看出,图像的人数统计无论是在商业信息采集还是公共安全监控方面具有重要意义,图像的人数统计识别算法的研究无论在理论上还是在实际应用领域都有着诱人的发展前景。
2 课题分析
以往老师统计学生出勤情况基本上靠人工点名,但是这种方法往往会浪费大量的时间,效率低下,不是一个好的选择。本课题,基于MATLAB的教室人数统计,带有丰富的人机交互GUI界面。实现教室人数的计数统计,进而统计出勤率,上课认真听讲的比例。原先预设总人数,未出勤或者书本遮住脸部、趴着玩手机等必然无法采集到人脸,从而对应数量缺失,得出出勤率或听讲率。该课题采用肤色原理进行人脸定位和人脸分割。本课题中,为了界面GUI的美观,刻意将分割出的人脸单独显示在GUI对应的axes里。
3 社会需求分析
(1)对同学来说:脱离高中魔鬼式的学习,迈入高校的殿堂,许多在校大学生作息时间紊乱,课堂到课情况不理想。出现缺课、旷课情况,严重影响到学业成绩。更有少数学生利用上课时间出去游玩,发生意外。让学生养成一个好的作息习惯,规范学生的考勤,是很多高校最想做到的事情之。因此,快速、有效的出勤统计对大学生的学习以及学习至关重要。
(2)对老师来说:统计出勤情况是记录学生课程学习过程、提供平时成绩评定依据、减少学生发生意外的风险的有效方法。而传统考察出勤人数的方式大多耗时费力,在浪费宝贵课堂时间的同时,也为老师增添了负担。
4 可行性分析
4.1为了说明开发本项目—教室人员统计系统的必要性,我们对传统的考察出勤人数方式进行了分析。
(a)花名册顺序点名
教师或者教师让一名学生使用花名册进行顺序点名。
优点:每一名学生都要答到,教师可以有更多的机会认识每一位同学,比较真实的反应了学生的到课情况。
缺点:如果学生的人数比较多,会浪费学生和老师很多的宝贵时间,并且,存在其他同学帮忙答到的情况。
(b)花名册随机点名
教师第一次上课时,使用花名册进行顺序点名,未到的同学做好标记。下次上课的时候先点前几次未到的同学,然后再随机点几名同学。
优点:随机点名法节省了大量的时间,给那些点名未到的同学施加适当的压力,班级旷课的同学基本.上都是“老面孔”,这种方法可以让那些同学不敢再旷课。
缺点:第一次点名仍然要花费大量的时间,随机点名法存在很多“运气”成份,可能会有一些同学经常没来.上课,但没有被发现。
©固定座位
让所有的学生靠前坐,并给班级的每位学生固定座位,上课后,统计缺席人员名单。
优点:老师在上课的时候,可以清楚地看到学生的出勤情况。学生座位靠近讲台,可以提高学生的上课注意力。
缺点:高校学生上课要经常更换教室,固定座位的做法,随着教室的变动会带来很多不便。
(d)分组统计
将班级的学生分为多个小组,每个组选出一一个小组长,由小组长确定小组人员的到课情况,下课后, 小组长将名单交给老师。
优点:节省了老师的时间,便于进行以小组为单位的讨论和学习。
缺点:可能会存在小组长包庇组员的情况,教师无法确定学生的真实出勤率。
4.2为了了解大学生对本项目—教室人员统计系统的接受度,我们使用问卷星对大一至大四的在读本科生进行了问卷调查。以下为调查结果分析:
调查结果显示被调查者在校期间考察出勤的方式中传统点名占72.13%,软件签到占19.03,其他占9.84%。由此可见传统点名占占据考察方式的大多数,仍没有可以完全取代它的方式出现。
对于本项目中通过老师拍照的方式统计出勤人员可能涉及肖像权的问题,仅有9.67%人会有些介意,49.34%完全不在意。而更多则是没考虑过这个这问题,占总人数的40.98%。 由此可见忽略极少部分,可以认为通过拍照方式统计人数可以被大多数人接受。
被问及此项目优缺点时,认为这种方式速度快的占参与者的57.38%,方便占30.17%,其它占12.45%。而他们担心的问题中担心统计不准切导致“被”缺勤占比最高达83.61%。
综上调查,我们认为目前需要一种比传统点名更高效的方式出现。此项目正是想要弥补这一空缺。而提高系统性能,减少差错的出现是增强教室人员统计系统实用性的关键。
5 计算机视觉系统工具箱简介
计算机视觉系统工具箱(Computer Vision System Toolbox,CVST)是Matlab2012b版本自带工具箱。该工具箱不仅包括用于特征提取、运动检测、目标检测、目标跟踪、立体视觉、视频处理、视频分析的算法,还包括视频文件输入输出,视频显示,绘图以及合成。这些功能以Matlab函数、Matlab系统对象、Simulink块的形式提供。对于快速原型和嵌入式系统设计,该工具箱支持定点算法和C代码产生。
计算机视觉系统工具箱的人脸检测算法主要基于Viola-Jones的人脸检测,通过内置的类和函数进行人脸甚至是鼻子、嘴以及眼睛的自动检测。Viola-Jones人脸检测是Paul viola 和 Michael J Jones共同提出的一种人脸检测算法,该算法原理简单,耗费资源小,在提出后被广泛用于人脸检测。Viola-Jones人脸检测主要包含Haar-like特征、积分图、AdaBoost迭代算法和级联分类器等内容,实现人脸检测的主要步骤是:①利用Haar-like矩形特征表征人脸,使用“积分图”对图像中的矩形特征进行快速计算。②利用AdaBoost算法从数量巨大的Haar-like特征中训练出人脸检测所需要的分类器。③将训练得到的强分类器进行级联,利用级联的强分类器构成最终的分类器。
计算机视觉系统工具箱只需要用简单的命令即可实现人脸检测。调用工具箱中的vision.CascadeObjectDetector即可运行。不仅运行速度较快,且人脸检测准确度很高。经过自行改进,可进行批处理。
6 方案设计
6.1框架设计
该项目要完成的功能是:根据所给的图片,实现自动人脸检测,人数统计,要求含有GUI界面,且算法能够准确的实现人数的统计,拥有较快的运算速度,具有较好的实时性。
6.2界面设计
首先,将页面背景设置为灰白色,在中心及偏左页面设置两个坐标系axes1以及axes2,用以显示后来选中的图片和人脸识别后已框出人脸的图片。在坐标系右边从上到下依次拖拽设置pushbutton1、pushbutton2、edit1、text1、pushbutton2。其中,pushbutton1上编辑‘打开教室图片’字样,用以完成打开图片功能;edit1上编辑‘统计结果’字样;text4中显示‘统计结果’的结果;pushbutton2上编辑‘统计人数’,通过点击此按钮实现统计人数的功能;最后一个pushbutton3上编辑‘完成’字样,完成关闭功能。坐标轴上方还设置一个text2,编辑‘欢迎使用教室人数统计系统’作为标题。至此完成页面的界面设计。
GUI界面设计如下:
6.3功能设计
对于pushbutton1按钮,即点击‘打开教室图片’,打开选择文件对话框,此时会弹出此电脑的文件界面,选择一张带有人的图片后,点击确认即可在axes1上显示该选中图片,且在此图片上方设置标题‘教室照片’,完成选中图片功能。其次点击‘统计人数’按钮,在代码中取得打开图片的相关数据,将彩色图像转化为灰度图像等等处理,设置路径将此转化处理后的图像显示在axes2,此外还可找到图片中的人脸,绘制边框圈出来,统计出边框的个数反映在text2中,且在此图像上方设置标题‘框出人脸区域’。至此完成此设计的全部功能。下图为该项目的功能流程图:
7 项目配置
7.1下载相应的工具包
首先下载相应的工具包。matlab最方便的地方莫过于此了。直接下载、配置简单、而且能够查看源代码,这里给出相应的工具包下载地址:Face_Part_Detection工具包
7.2配置工具包
下载完毕后開始配置工具箱。首先须要强调一点,这种方法须要依赖两个Matlab图像处理方面的工具箱Image Processing Toolbox和Computer Vision System Toolbox。差点儿全部版本号的Matlab都默认集成了Image Processing工具箱。但对于Computer Vision System工具箱仅仅有相对较高版本号(Matlab2013及以上)的Matlab版本号才进行了集成,因此假设在程序运行过程中提示缺少相应的工具箱,则须要手动进行配置Computer Vision System。(一般Matlab在2013以上都不需要配置)
假设Matlab已经配置好了以上两个工具箱,接下来開始配置Face Parts Detection工具包,方法极其简单,仅仅需在Set Path对话框中将当前工具箱的目录(这里是Face_detection_Parts目录)路径加入到系统的搜索路径就可以:
8 源代码
8.1 face_collection.m 文件的源代码
源代码参考连接:Matlab人脸检測方法(Face Parts Detection)
function varargout = face_collection(varargin)
% FACE_COLLECTION MATLAB code for face_collection.fig
% FACE_COLLECTION, by itself, creates a new FACE_COLLECTION or raises the existing
% singleton*.
%
% H = FACE_COLLECTION returns the handle to a new FACE_COLLECTION or the handle to
% the existing singleton*.
%
% FACE_COLLECTION('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in FACE_COLLECTION.M with the given input arguments.
%
% FACE_COLLECTION('Property','Value',...) creates a new FACE_COLLECTION or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before face_collection_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to face_collection_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help face_collection
% Last Modified by GUIDE v2.5 05-Jul-2021 05:43:32
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @face_collection_OpeningFcn, ...
'gui_OutputFcn', @face_collection_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before face_collection is made visible.
function face_collection_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to face_collection (see VARARGIN)
% Choose default command line output for face_collection
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes face_collection wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = face_collection_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
function edit2_Callback(hObject, eventdata, handles)
% hObject handle to edit2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit2 as text
% str2double(get(hObject,'String')) returns contents of edit2 as a double
% --- Executes during object creation, after setting all properties.
function edit2_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% --- Executes on button press in pushbutton1.
%该回调方法实现了图像灰度化、人脸识别、人数统计
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
img = handles.img %赋值读取图像的信息
img2 = rgb2gray(img); %对图像进行灰度化
%将灰度图变为三通道图
if(size(img2,3) == 1)
image(:,:,1) = img2;
image(:,:,2) = img2;
image(:,:,3) = img2;
else
image = img2;
end
%对图像进行人脸检測�
FaceDetector = buildDetector();
[bbox,bbimg,faces,bbfaces] = detectFaceParts(FaceDetector,image,3);
%输入图像灰度化�
if 1 ~= size(img2,3)
img2 = rgb2gray(img2);
img2 = double(img2);
elseif 1 == size(img2,3)
img2 = double(img2);
end
%得到人脸区域框的中心点
%recFace.x = bbox(1,1);
%recFace.y = bbox(1,2);
%recFace.width = bbox(1,3);
%recFace.height = bbox(1,4);
%ptFaceCenter.x = recFace.x + recFace.width / 2;
%ptFaceCenter.y = recFace.y + recFace.height / 2;
%以中心点为基准进行外扩(即对人脸选框进行调整)
%recFace.x = ptFaceCenter.x - recFace.width * 0.4;
%recFace.y = ptFaceCenter.y - recFace.height * 0.35;
%recFace.width = recFace.width * 0.8 ;
%recFace.height = recFace.height * 0.8 ;
%Result = uint8(imcrop(img2,[recFace.x,recFace.y,recFace.width,recFace.height]));
%对识别的人脸进行统计
j = 0
for i=1 : length(faces)
if(~isempty(faces))
j = i;
end
end
str = num2str(j) %将整型数据转化为字符
axes(handles.axes2),imshow(bbimg);%将是框出人脸的灰度化图片显示在axes2
title('框出人脸区域') %在axes2上方显示标题
set(handles.text2,'String',str); %将统计的人数显示在text2中
function edit1_Callback(hObject, eventdata, handles)
% hObject handle to edit1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit1 as text
% str2double(get(hObject,'String')) returns contents of edit1 as a double
% --- Executes during object creation, after setting all properties.
function edit1_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% --- Executes during object creation, after setting all properties.
function text_CreateFcn(hObject, eventdata, handles)
% hObject handle to text (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% --- Executes on button press in pushbutton2.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
%打开对话框,选中文件后,将文件的文件名和路径赋值给filename和pathname两个变量
[filename, pathname] = uigetfile( ...
{'*.jpg;*.png;*.jpeg', 'Image Files (*.bmp;*.jpg;*.png;*.jpeg)'; ...
'*.*', 'All Files (*.*)'}, ...
'Pick an image');
if isequal(filename,0) || isequal(pathname,0)%判断文件名和文件路径是否为空
return;
end
fpath=[pathname filename]; %文件路径和文件名合并为根路径�
img=imread(fpath); %将文件转化成数据
axes(handles.axes1) %选中axes1框
imshow(img) %显示图片
title('教室图片') %在axes1上方添加标题”教室图片“
handles.img = img %在hanles中创建变量img并赋值,为img变量可以在其他回调函数中使用
guidata(hObject, handles);
%该方法的功能很简单,就是关闭程序
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
close(gcf)
% --- Executes during object creation, after setting all properties.
%该回调函数虽然什么事情都没做,但是必须要有,因为在
%pushbutton2中使用到了handles.text2,所以该方法不能少
function text2_CreateFcn(hObject, eventdata, handles)
% hObject handle to text2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
8.2 face_collection.fig(GUI界面设计)
打开编辑器
该GUI界面的设计大家可以自由发挥,本人的设计界面也是仅供大家参考:
9、运行结果
10、注意事项
1.本人该项目中使用到的face_Part_Detection文件中的detectFaceParts.m文件进行过调整,如果想要做成我的运行结果这样的话,请修改detectFaceParts.m文件的代码,代码如下:
% detectFaceParts: detect faces with parts
%
% [bbox,bbX,faces,bbfaces] = detectFaceParts(detector,X,thick)
%
%Output parameters:
% bbox: bbox(:, 1: 4) is bounding box for face
% bbox(:, 5: 8) is bounding box for left eye
% bbox(:, 9:12) is bounding box for right eye
% bbox(:,13:16) is bounding box for mouth
% bbox(:,17:20) is bounding box for nose
% please see the documentation of the computer vision toolbox for details of the bounding box.
% bbX: image with found faces which are shown as boxes
% faces: found faces stored as cell array
% bbfaces: found faces with boxes stored as cell array
%
%
%Input parameters:
% detector: the detection object built by buildDetector
% X: image data which should be uint8
% thick(optional): thickness of bounding box (default:1)
%
%
%Example:
% detector = buildDetector();
% img = imread('img.jpg');
% [bbbox bbimg] = detectFaceParts(detector,img);
%
%
%Version: 20140113
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Face Parts Detection: %
% %
% Copyright (C) 2012 - 2014 %
% Masayuki Tanaka. All rights reserved. %
% mtanaka@ctrl.titech.ac.jp %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [bbox,bbX,faces,bbfaces] = detectFaceParts(detector,X,thick)
if( nargin < 3 )
thick = 1;
end
%%%%%%%%%%%%%%%%%%%%%%% detect face %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Detect faces
bbox = step(detector.detector{5}, X);
bbsize = size(bbox);
partsNum = zeros(size(bbox,1),1);
%%%%%%%%%%%%%%%%%%%%%%% detect parts %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nameDetector = {'LeftEye'; 'RightEye'; 'Mouth'; 'Nose'; };
mins = [[12 18]; [12 18]; [15 25]; [15 18]; ];
stdsize = detector.stdsize;
for k=1:4
if( k == 1 )
region = [1,int32(stdsize*2/3); 1, int32(stdsize*2/3)];
elseif( k == 2 )
region = [int32(stdsize/3),stdsize; 1, int32(stdsize*2/3)];
% elseif( k == 3 )
% region = [1,stdsize; int32(stdsize/3), stdsize];
elseif( k == 4 )
region = [int32(stdsize/5),int32(stdsize*4/5); int32(stdsize/3),stdsize];
else
region = [1,stdsize;1,stdsize];
end
bb = zeros(bbsize);
for i=1:size(bbox,1)
XX = X(bbox(i,2):bbox(i,2)+bbox(i,4)-1,bbox(i,1):bbox(i,1)+bbox(i,3)-1,:);
XX = imresize(XX,[stdsize, stdsize]);
XX = XX(region(2,1):region(2,2),region(1,1):region(1,2),:);
b = step(detector.detector{k},XX);
if( size(b,1) > 0 )
partsNum(i) = partsNum(i) + 1;
if( k == 1 )
b = sortrows(b,1);
elseif( k == 2 )
b = flipud(sortrows(b,1));
elseif( k == 3 )
b = flipud(sortrows(b,2));
elseif( k == 4 )
b = flipud(sortrows(b,3));
end
ratio = double(bbox(i,3)) / double(stdsize);
b(1,1) = int32( ( b(1,1)-1 + region(1,1)-1 ) * ratio + 0.5 ) + bbox(i,1);
b(1,2) = int32( ( b(1,2)-1 + region(2,1)-1 ) * ratio + 0.5 ) + bbox(i,2);
b(1,3) = int32( b(1,3) * ratio + 0.5 );
b(1,4) = int32( b(1,4) * ratio + 0.5 );
bb(i,:) = b(1,:);
end
end
bbox = [bbox,bb];
p = ( sum(bb') == 0 );
bb(p,:) = [];
end
%%%%%%%%%%%%%%%%%%%%%%% draw faces %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
bbox = [bbox,partsNum];
bbox(partsNum<=2,:)=[];
if( thick >= 0 )
t = (thick-1)/2;
t0 = -int32(ceil(t));
t1 = int32(floor(t));
else
t0 = 0;
t1 = 0;
end
bbX = X;
boxColor = [[255,0,0]; [255,0,255]; [255,0,255]; [0,255,255]; [255,255,0]; ];
for k=5:-1:1
if k == 1
shapeInserter = vision.ShapeInserter('BorderColor','Custom','CustomBorderColor',boxColor(k,:));
for i=t0:t1
bb = int32(bbox(:,(k-1)*4+1:k*4));
bb(:,1:2) = bb(:,1:2)-i;
bb(:,3:4) = bb(:,3:4)+i*2;
bbX = step(shapeInserter, bbX, bb);
end
end
end
%%%%%%%%%%%%%%%%%%%%%%% faces %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if( nargout > 2 )
faces = cell(size(bbox,1),1);
bbfaces = cell(size(bbox,1),1);
for i=1:size(bbox,1)
faces{i,1} = X(bbox(i,2):bbox(i,2)+bbox(i,4)-1,bbox(i,1):bbox(i,1)+bbox(i,3)-1,:);
bbfaces{i,1} = bbX(bbox(i,2):bbox(i,2)+bbox(i,4)-1,bbox(i,1):bbox(i,1)+bbox(i,3)-1,:);
end
end
2.运行该项目时,需要注意:
11 备注
本人的开题报告参考链接:开题报告参考连接
本人的源代码参考链接:源代码参考连接
本人在github上面会上传源代码,链接地址:
标签:end,GUI,hObject,handles,人脸,MATLAB,eventdata,源代码,bbox 来源: https://blog.csdn.net/weixin_43391211/article/details/118521727