开发需求分析
功能:合理推荐学生找到合适的自习室,节省时间。
开发策略:通过后端处理数据,将之展现在前段搭建的平台上。
框架:
前端:html5
后端:OpenCV和C++
基本架构
前段用于处理用户的输入以及需求信息,后端用于处理运算用户所需的结果
前端架构设计
一、功能
读入学生对于某教学楼的查询需求,并显示对应结果
二、页面构成
1.顶端是中国人民大学的logo,以及“教室资源管理系统”的字样。
2.中间是搜索框和搜索按钮
3.下方左侧是选择指定教学楼的单选表单;
4.下方右侧是显示搜索结果的表格, 一列为教室编号, 另一列为拥挤程度。
三、页面设计:
初步设计的页面如下图所示, 之后会继续修改:
后端架构设计:
后端人脸检测部分使用OpenCV和C++语言完成。它分为下面两个部分:
(一)分类器的训练
建立一个含有大量图片的样本库,样本库中的图片分为包含人脸特征和不包含人脸特征两种。从样本库中将人脸和非人脸的haar-like特征提取出来,作为分类器训练过程的输入,然后使用Adaboost算法训练出一个级联的强分类器。该分类器就是一个对人脸和非人脸的判断器。
(二)人脸检测
若待检测的是视频或摄像头的录像,则从其中提取一帧进行图片预处理;若待检测的是图片,则直接进行图片预处理阶段。加载在上一步工作中训练得到的分类器,对截取的待识别图像进行检测,若通过了分类器则表示检测出了人脸,存储该人脸的相关信息并使用一个红色圆圈将人脸标识出来,若未通过则表示没有检测到人脸。之后移动剪裁窗口并重复检测的工作,直到该测试目标的所有像素点都被扫描过,则此次人脸检测的过程结束。将最终的图片输出,在这上面所有被检测出来的人脸,都使用了红色圆圈标识了出来。
构造训练样本库
样本库的数量与质量,直接关系到了检测的效果。样本库中的图片数量越多,差异化越大,训练出来的分类器效果也就越好。由于已经选择好了准备提取人脸特征,于是我们需要准备这两组样本:一组为正样本,其中所有的图片都包含了人脸的特征;一组为负样本,其中所有的图片都不包含人脸的特征。
正样本库
来自于AT&T、Yale等标准人脸库。从中挑选了2706张肤色、表情、光照有较大差别的图片,作为本次训练的正样本库。并且将所有图片的人眼设置在同一个水平位置,去除样本中人的头发,将更有利于训练的进行。所有正样本库的图片都有着以下要求:
l 每张图片都要包含完整的人脸特征,我采取的是竖直方向从额头到下巴,水平方向包含左右脸颊。
l 所有的图片都必须统一格式和大小,我采取的文件格式是bmp图像格式,大小为20×20像素的灰度图。
负样本库
图片的背景对识别率有着很大的影响,环境越是简单,人脸的识别率越高,而环境越是复杂,人脸检测的难度也就越大。负样本库中的文件就是描述背景图片的。所有负样本库的图片都有着以下要求:
l 不能够包含人脸的特征。
l 数量要足够多,一般来说要多于正样本库的数量。
l 每张图片之间的差异性要足够大。
l 对于图片的格式及大小,没有具体要求。这里采用了4830张20×20像素的灰度图,有利于加快训练速度。
通过haar-like特征,和积分图方法对特征进行提取,我们可以从样本库图像中提取出人脸的特征作为输入,开始我们的分类器训练(采用Adaboost算法)。
人脸检测部分的实现
进行图片的预处理,并使用等比例放大检测窗口的方式来进行人脸的检测工作.
图片预处理
用来测试的图片、视频及摄像头获取的实时图像,都是彩色图像,必须要对图像进行一定的处理,才能够使用分类器开始检测。
对于视频或者读入的摄像头实时画面,需要从中提取一帧图片。对于图片,可以直接开始处理。首先使用cvCvtColor( , ,CV_BGR2GRAY)函数将待检测图片转换为灰度图像,再使用cvResize( , ,CV_INTER_LINEAR)对图片进行双线性插值的缩放,最后使用cvEqualizeHist( , )进行直方图均衡化,就可以开始检测了
检测方法
基于检测窗口等比例放大
将检测窗口等比例放大:将待检测图片的大小固定不变,不断地放大检测窗口的大小,每一次放大都采用相同的比例,且放大后的窗口大小不能够大于图片本身的大小。将每一个被放大的检测窗口,都对图片进行遍历,获得检测结果。这种方法虽然会影响一定的检测准确率,但是它不需要改变图片的大小,减少了后台计算量。
来源:https://www.cnblogs.com/ruc2016/p/6198065.html