分类

课内:
不限
类型:
不限 毕业设计 课程设计 小学期 大作业
汇编语言 C语言 C++ JAVA C# JSP PYTHON PHP
数据结构与算法 操作系统 编译原理 数据库 计算机网络 软件工程 VC++程序设计
游戏 PC程序 APP 网站 其他
评分:
不限 10 9 8 7 6 5 4 3 2 1
年份:
不限 2018 2019 2020

资源列表

  • 基于python实现的迷宫游戏

    一、项目概述与编译环境本次大作业选题为题目2,即小兔子找胡萝卜的迷宫问题,最终完成开发的游戏名为Caveman and Treasure(穴居人寻宝),游戏整体界面如下:

    该项目在windows下编译通过,所需环境为python3,编写GUI所用的库为pygame,在运行作业前,需要配置依赖项,即在main.py的路径下打开cmd,并运行:
    pip install –r requirement.txt
    配置完依赖项后即可运行游戏:
    python main.py
    为了方便测试不同搜索算法的效率,编写了脚本test.py进行测试:
    python test.py --maze_size 10
    设置为需要的迷宫大小,建议为5-25,否则可能超过递归上界。
    二、问题的数学建模由于迷宫的实质为一个由0,1构成的矩阵,其中1代表可行走的区域,0代表障碍物。由于穴居人生活区域中存在冰面,因此设置了随机道路中存在冰块,在冰块上穴居人会打滑,导致行走的代价*2。
    在本问题中,设置穴居人初始位置处的值为10,宝藏处的值为1,则迷宫求解转化为该矩阵中10处到1处的带权连通路径。
    三、算法实现3.1 迷宫的创建事实上,本次大作业中的一大难点在于迷宫如何创建,在实现过程中进行了如下尝试:

    对每一小格随机添加障碍物
    限定障碍物的形状,并在地图中随机放置障碍物,如(L型,H型)

    但实际的创建结果均不理想(迷宫的样子不像迷宫:出现大量空白/障碍堆积现象)
    最后经过查阅资料,采取递归回溯的算法生成迷宫,算法如下:

    每次把新找到的未访问迷宫单元作为优先
    寻找其相邻的未访问过的迷宫单元,直到所有的单元都被访问到

    通俗的说,就是从起点开始随机走,走不通了就返回上一步,从下一个能走的地方再开始随机走。
    在创建完迷宫后,再在迷宫中随机指定人物的初始位置与宝藏,以及随机冰面的位置。该迷宫创建算法可以创建不同长、宽、障碍物、初始\终点位置,具体代码详见:maze.py
    3.2 搜索算法描述本次实验中采取了四种搜索算法进行求解,实现方式均为迭代:
    3.2.1 深度优先搜索利用stack实现,先让起点入栈,之后进行如下迭代:

    栈弹出顶点I,并标记I为已访问的
    检查I是否为宝藏,若为宝藏,迭代结束
    依次检查I的领域,将其中未访问过的顶点入栈

    3.2.2 宽度优先搜索利用queue实现,先让起点入列,之后进行如下迭代:

    队列出列顶点I,并标记I为已访问的
    检查I是否为宝藏,若为宝藏,迭代结束
    依次检查I的领域,将其中未访问过的顶点入队列

    3.2.3 一致代价搜索利用PriorityQueue实现,实现Maze_unit类对顶点进行包装,并重新定义优先级队列的排序方法,在本次实现的一致代价搜索中,h(n)为路径代价之和,g(n)为0。先让起点入列,之后进行如下迭代:

    优先级队列出列顶点I,并标记I为已访问的
    检查I是否为宝藏,若为宝藏,迭代结束
    依次检查I的领域,将其中未访问过的顶点入优先级队列

    由于代价为路径长度,因此在本项目中,一致代价搜索的结果与宽度优先搜索基本一致。
    3.2.4 A*搜索利用PriorityQueue实现,实现Maze_unit类对顶点进行包装,并重新定义优先级队列的排序方法,在本次实现的一致代价搜索中,h(n)为路径代价之和,g(n)为顶点距离宝藏的曼哈顿距离乘以相关系数。先让起点入列,之后进行如下迭代:

    优先级队列出列顶点I,并标记I为已访问的
    检查I是否为宝藏,若为宝藏,迭代结束
    依次检查I的领域,将其中未访问过的顶点入优先级队列

    搜索算法的代码详见:solution.py。
    四、项目架构与GUI设计4.1 项目架构本次项目将核心部分与GUI部分分离,各py文件内容如下:

    maze:迷宫创建
    solution:问题求解
    people:GUI中的类:人物
    wall:GUI中的类:墙壁
    main:主函数,基于pygame的GUI编写
    test:测试脚本,直接统计各算法1000次所需的时间与扩展节点数

    4.2 GUI设计为了方便运行与直观观看搜素过程。

    在迷宫游戏的右侧有五个按键,利用鼠标点击,可以分别观看不同搜索算法的搜索过程,点击View path可以观看利用A*搜索得到的通向终点的最短路径,此外玩家可以直接使用wsad按键控制上下左右进行游戏。若不想手动控制抵达终点,也可以直接选中skip按钮跳过该关卡。
    同时在进行游戏的过程中,该迷宫求解的结果会显示在画面的右侧,包括open表大小,closed表大小与搜索得到的路径的代价之和(正常路为2,冰面为4,终点为1)。


    GUI的素材均位于子文件夹images中,其中人物行走过程的上下左右利用数字图像处理的方法进行了不同对待:


















    同时您也可以在游戏时打开系统的声音,感受bgm带来的不同体验。Bgm:music.ogg。
    五、搜索算法效率对比利用test.py对不同的搜索算法效率进行了对比结果如下:
    迷宫大小:7*7



    搜索算法
    DFS
    BFS
    UCS
    A*




    总时间(s)
    0.11
    0.18
    0.21
    0.23


    平均节点数
    10.17
    10.39
    9.51
    6.85



    迷宫大小:21*21



    搜索算法
    DFS
    BFS
    UCS
    A*




    总时间(s)
    1.24
    8.09
    5.45
    3.14


    平均节点数
    114.60
    118.23
    112.92
    49.72



    迷宫大小:35*35



    搜索算法
    DFS
    BFS
    UCS
    A*




    总时间(s)
    5.64
    82.20
    44.69
    9.78


    平均节点数
    349.26
    344.87
    335.22
    125.99



    从时间角度来说,由于python的stack与queue运行效率差距较大,因此实际结果中深度优先搜索的速度高于其余三种。
    从扩展节点数的角度来说,对于大型迷宫来说,A*算法扩展节点数相对于其他三种算法来说要小很多,也从某一方面验证了,当代价函数一致时,A*算法是最优的。而对于BFS与DFS,在迷宫大小变大的情况下,节点扩展数较大,并不具有很高的空间效率。
    从路径平均代价来看,DFS几乎不能找到路径最优解,而A*搜索与一致代价搜索在合理设置cost的情况下,可以得到最短路径。
    六、实验心得与体会本次大作业工程量较大,不仅复习了不同搜索算法的实现思路,完成了对迷宫问题的建模,还锻炼了代码能力。
    由于这是第一次尝试利用pygame库进行游戏的编写,而不是用传统的pyqt,花费的学习时间较长,也感受了真实的游戏制作过程的复杂与艰难,游戏素材图片(字体,音乐)寻找的困难。
    此外,在自己观看不同算法的搜索过程中,也对之前略有混淆的概念进行了理解,例如,在第一次小作业中回答错误的下列命题,如:宽度优先搜索是一种特殊的一致代价搜索。从手动实现的角度对概念解进行了复习,收获颇丰。
    七、参考文献
    pygame official doc
    https://blog.csdn.net/dydlcsdn/article/details/46399111
    https://blog.csdn.net/juzihongle1/article/details/73135920
    3 评论 7 下载 2020-09-24 11:14:13 下载需要11点积分
  • 基于Python的PyGame库实现的2048小游戏

    一、简介2048的游戏规则很简单,每次可以选择上下左右其中一个方向去滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢外,系统也会在空白的地方乱数出现一个数字方块,相同数字的方块在靠拢、相撞时会相加。系统给予的数字方块不是2就是4,玩家要想办法在这小小的16格范围中凑出“2048”这个数字方块。
    游戏的画面很简单,一开始整体16个方格大部分都是灰色的,当玩家拼图出现数字之后就会改变颜色,整体格调很是简单。在玩法规则也非常的简单,一开始方格内会出现2或者4等这两个小数字,玩家只需要上下左右其中一个方向来移动出现的数字,所有的数字就会向滑动的方向靠拢,而滑出的空白方块就会随机出现一个数字,相同的数字相撞时会叠加靠拢,然后一直这样,不断的叠加最终拼凑出2048这个数字就算成功。

    二、主要设计2048游戏的主要算法就是实现数字的移动和相加,我一开始是想的一个数字有四个相邻的位置,上下左右用列表存储,然后遍历判断,但是真正写的时候发现有很多重复的情况存在,而且位置的存储没有办法确定。
    所以最后写了一个只实现相加的函数,然后再分别从四个方向去调用它。具体的就是用一个列表,判断它的长度也就是存储连续的相邻的数字个数,然后判断是否有相邻的元素相等,如果有的话相加,单一的单一存储,累计分数也是在这个函数里实现的。具体算法如下:
    def combinate(L): #实现相加操作 global score ans = [0, 0, 0, 0] num = [] for i in L: if i != 0: num.append(i) length = len(num) if length == 4: #当有四个数的多种情况 if num[0] == num[1]: ans[0] = num[0] + num[1] score += ans[0] if num[2] == num[3]: ans[1] = num[2] + num[3] score += ans[1] else: ans[1] = num[2] ans[2] = num[3] elif num[1] == num[2]: ans[0] = num[0] ans[1] = num[1] + num[2] ans[2] = num[3] score += ans[1] elif num[2] == num[3]: ans[0] = num[0] ans[1] = num[1] ans[2] = num[2] + num[3] score += ans[2] else: for i in range(length): ans[i] = num[i] elif length == 3: #有三个数 if num[0] == num[1]: ans[0] = num[0] + num[1] ans[1] = num[2] score += ans[0] elif num[1] == num[2]: ans[0] = num[0] ans[1] = num[1] + num[2] score += ans[1] else: for i in range(length): ans[i] = num[i] elif length == 2: #有两个数 if num[0] == num[1]: ans[0] = num[0] + num[1] score += ans[0] else: for i in range(length): ans[i] = num[i] elif length == 1: #有一个数 ans[0] = num[0] else: pass return ans
    三、详细过程
    生成数字为0、2、4、8……如果是0则不显示数字,如果是其他数字则根据数字判断底色实现上下左右滑动事件,基本原理是这样,先去判断每行(列),以为移动后的序列,将这4个值存入一个列表,根据游戏规则计算,再返回到这行(列),说的比较抽象,我们可以这样看:2 2 0 4 假如这是某行,我们现在左移,首先将2 2 0 4 存入一个列表(去掉0),即列表为 2 2 4 然后根据规则2和2合并,则列表为 4 4,最后返回到这一行(列)判断游戏结束,若空格有0,游戏一定没有结束,若为0,则判断每行一一相邻是否存在相同数字,每列一一相邻是否存在相同数字画方格是用了一个类来存储方格的各种属性,也是整个游戏里唯一的一个类
    四、总结Python的小游戏也算是弥补了C语言没有做的了的遗憾了。整个代码敲下来也不容易,一开始各种不熟悉python的语法,和C语言各种混淆,不由自主的敲分号,但是真正熟悉起来以后python还是比C语言简单多了。
    在写这个游戏以前我也在网上找了不少的代码来看,给了我不少启示,然后才着手写它,很多不理解的函数都是一个一个百度来的用法,看了人家的写法做参考一点一点实现。而且我发现了自己的一个大问题就是我的逻辑真的有问题,虽然不容易,但是最终也是完成了。对于python我学到的可能连皮毛都算不上,还是要找机会好好学习一下,弥补自己的缺漏。
    4 评论 100 下载 2018-10-06 21:50:58 下载需要15点积分
  • 基于拉普拉斯平滑算法的视频去雾系统的实现

    摘 要视频去雾一直是图像处理领域一个备受关注的题目,其主要目的是将被大雾天气所影响的视频尽可能地还原成没有被大雾情况下的真实图像。相比于雾天下的视频,去雾后的视频还原了一部分被雾天所模糊的图像细节。它减少了雾天视频对实际生活和工作中对人们带来的影响,如交通出行,户外监测系统等。举例说,早年间由于视频去雾技术受限,许多户外监测系统在大雾天气下无法正常工作,影响到了人们的正常出行和生产,所以人们希望利用有效的方法将这些雾天影响下的视频尽可能真实地还原。本文旨在探究一种不同于现有的最小化能量函数,基于拉普拉斯平滑项建立一个新的能量函数模型。对于待处理的视频帧序列,先生成每一帧的深度图,然后通过初试的深度图去分别计算对应的颜色一致性项,几何相关项,平滑项和拉普拉斯平滑项。其中,我们提出了新的颜色一致性项和几何相关项,它们考虑到大气散射效应的影响;同样,拉普拉斯平滑项可以更好地保存物体的细节,避免失真和模糊。最后,通过迭代化解能量函数最小方程,得到对应的立体重建后的去雾视频。本文最终展示的,是基于拉普拉斯平滑项的立体重建后的图像,与原待测试视频帧序列对比后所能达到的最好效果。
    【关键词】 视频去雾;立体重建;拉普拉斯平滑;场景深度
    ABSTRACTVideo defogging has always been a topic of concern in the image processing field. The main purpose of the video defogging is to restore as much as possible the video that is affected by fog weather to real images without being affected by heavy fog. Compared to the video in the foggy world, the post-fog video restores a part of the blurred image details of fog.It reduces the impact of foggy video on people in real life and work, such as traffic and outdoor monitoring systems. For example, due to the limited video defogging technology in the early years, many outdoor monitoring systems were unable to work properly under heavy fog, affecting people’ s normal travel and production. So people want to use effective methods to restore the video under the influence of these fogs as realistically as possible.
    This paper aims to explore a new energy function model based on the Laplacian smoothing term that is different from the existing minimum energy function. For the sequence of video frames to be processed, a depth map of each frame is generated, and then the corresponding depth map is used to separately calculate the corresponding color consistency item,geometric correlation item, smooth item, and Laplacian smoothing item. Among them, we propose new color consistency terms and geometric correlation terms that take into account the effects of atmospheric scattering effects.Similarly, Laplacian smoothing items can better preserve the details of objects and avoid distortion and blurring. Finally, by iteratively solving the minimum equation of the energy function, a corresponding stereoscopically reconstructed defogging video is obtained. The final display of this paper is based on the stereoscopic reconstruction of Laplacian smoothing terms, and the best results that can be achieved after comparing with the original video frame to be tested.
    [Keywords]: video defogging; stereoscopic reconstruction; Laplacian smoothing; scene depth
    第1章 引言视频去雾是数字图像处理中一个重要的课题,应用面极其广泛。在本章节中,我们首先将介绍视频去雾,和到目前为止的研究背景、应用的领域及其具体的实际意义,并且概括性地描述本文所做的工作。
    1.1 研究背景和意义随着城市化现象的加快,人口密度的急剧增长以及全球变暖等气候变化,城市的大雾现象变得越来越普遍。大雾天气给城市交通的监测和治安的监管等方面带来了极大的影响,严重时甚至导致城市安全系统完全失效。海港,河床,岸边也会因为水汽的蒸发,而出现难以消散的雾气,这样一种雾气弥漫的情况使得这些区域的监控难以顺利进行。森林和大面积的植被也会由于呼吸作用,在清晨和黄昏时分常常会形成大面积的雾气,这通常会使得使用长焦距摄像镜头的摄像机系统丧失原有的功能,这可能对森林火灾的安全防范造成极大的影响。尤其在当今由于人类破坏环境的加剧,导致了各种极端天气现象的发生频率升高,因此变化多端的天气对目前主要依赖于智能机器设备的现代生产生活的影响比以前更加大。大雾天气则是其中一种比较常见而且影响又比较大的一种天气现象,而且对此的有效措施也比较少,视频去雾的技术研究可以给实际生产生活中带来更多的效率提升和防范危害。
    视频户外系统在被大雾影响的环境下拍摄的实际图像,因为受到雾气的影响,容易出现图像分辨率降低、质量退化、失真等现象,这就使得户外的视频系统不能稳定正常地工作,因而对人们的生活造成了严重的影响,如图1-1所示为中国除雾无人机在城市上空拍摄到的图像。因此,为了增强户外视频系统的稳定性和适用性,使其在天气条件很糟糕的情况下也可以被正常地使用,就很有必要研究有雾环境下视频图像的去雾技术。针对有雾环境对户外视频系统造成的诸多不良影响,我们需要着力研究视频图像的去雾技术。

    这不仅能对其他图像清晰化技术的研究起到一定的推动作用,还可以尽可能地削弱外界天气条件对图像采集造成的不良影响。近年来,在图像处理技术和计算机视觉领域,图像去雾技术已逐渐成为研究的热点问题,而现有的去雾算法多关注于单一图像的去雾,有关视频去雾的理论却很少。视频去雾与单一图像去雾有所不同,因为视频的帧与帧之间存相关性,且视频处理过程更注重自动性和实时性,这就使得视频去雾更具有挑战性。
    目前,视频图像去雾技术还处在研发起步阶段,各方面可供参考的文献并不多。相较国内,国外的研究工作起步较早,进展相对快一些。由于有雾环境下图像的去雾技术本身的复杂性,虽然这方面已经取得了很大的进展,但所提出的研究算法仍存在一些有待完善的地方,需要我们以此为基础继续研究。
    1.2 视频去雾问题的描述视频去雾是将因为将由于大雾导致可见度下降的视频还原出真实的物理场景的图像处理技术。它不仅是数字图像处理方面一个具有挑战性、前景优秀且相当活跃的课题之一,同时也在社会价值上,有着不可估量的潜在经济利益。视频去雾可以有效地降低因大雾天气对户外视频系统的影响,提高户外视频系统的可用性和适应性。如图1-2为某车载视觉系统下的雾天透视效果。

    图像的去雾方法大体上可以分为两种,一种是基于图像增强的去雾方法,另一种则是基于图像复原的去雾方法。而基于图像增强,多是指通过一些图像增强算法,例如,自适应直方图均衡化,自适应色阶和对比度,和多尺度Retinex等算法,它们主要是通过场景反照率,场景深度等图像,视频因素来对图像进行还原,增强。该方法能在一定程度上提高图像的对比度,使图像的细节更加突出,使图像的视觉效果更好,但可能对突出的那部分信息造成一定损失。而基于图像复原的去雾方法则是指根据物理模型的去雾方法,在提出大气衰减的物理模型的基础上,提取物理信息,然后去除无关信息而得到去雾图像的方法。基于大气退化物理模型的单幅图像去雾是通过合理的数学推演和假设,还原清晰、高品质的图像,得到近似的最优退化还原图像。这种方法有较强的针对性,一般不会造成信息的损失,得到的除雾图像也比较自然,模型中参数的估计是该类方法的关键点。在应用中,需要结合所拍摄的有雾图像的具体特点,不同方法的适用条件以及实际需要来选择合适的去雾方法,以达到较理想的去雾效果。
    在图像去雾的基础上,再通过一系列的帧组成的图像,在光照,雾,色彩等因素了提供了一些列的共性,我们可以通过帧与帧之间的联系得到更为有用的信息。
    而本文涉及到的视频的去雾以及立体重建,在去雾过程中,有对于物理模型的因素考虑而进行的计算工作,而在此基础上也有基于视频的有序序列特征进行的图像增强。
    1.3 本文的工作在本文中,我们联合研究立体视觉和去雾问题,设计一种同时估计场景深度和立体重建的算法。 我们的方法是基于这样一个观察结果,即立体和雾的厚度的深度线索是相互补充的(即对于附近的物体立体信息更可靠,并且雾的厚度信息对于远处的物体更可靠)。首先介绍了了一个雾模型,以及一个传统的对于视频的立体重建的能量函数,然后在该能量函数使用了基于散射效应的颜色一致性项,新的平滑项,基于传输的排序约束条件的平滑项,并且上加入拉普拉斯平滑项,使用这个新的能量函数,最后通过迭代地最小化该能量函数,得到最优的每一帧的深度图,从而完成立体重建。
    1.4 本章小结在本章节中,主要阐述了图像去雾,视频去雾等的研究背景和意义,描述了视频去雾的价值和意义,做了相应的分类和一些概念的介绍。此外,还梳理了本文的工作,大致的思想流程和会涉及到的一些方法,对后续章节的编写做一个引导和铺垫。
    第2章 综述在初步了解了视频去雾的工作背景和研究意义之后,在本章中将进一步对立体视觉,图像增强,场景深度等一些相关领域的研究做更深入的介绍,并且在介绍的过程中,会提及到对于本文有借鉴参考意义的文章或步骤,从而让读者对后续文章的实现部分有一个先前认知。
    2.1 传统的视频去雾方法视频去雾是计算机视觉领域的一个经典问题。对于一幅在雾天干扰下的图片,通过图像处理的方法尽可能地去除雾,还原图片,得到清晰的图片。基于图像增强的去雾方法是指通过改变明亮程度和对比度来改善图像的视觉效果,该方法能在一定程度上提高雾天图像的质量。但该方法在去除随空间变化的雾时,其作用会受限。基于图像复原的去雾方法基本是根据物理模型的去雾方法,多是指提出在大气衰减的物理模型的基础上,提取物理信息,去除无关信息而还原真实图像的方法。基于大气退化物理模型的单幅图像去雾是通过合理的数学推演和假设,还原清晰、高品质的图像,得到近似的最优还原图像。
    下面是几种经典的基于图像增强的去雾方法
    1.直方图均衡化
    直方图均衡化的基本思想是通过灰度的映射来修正图像的直方图,使其分布更加均衡,该方法是一种简单而有效的图像增强方法。雾天退化图像往往会体现出比较低的对比度,其直方图的分布也常集中在某个区域,因此可以通过均衡化的方法来调整直方图的分布,从而增强图像的对比度,实现有雾图像的清晰化。全局直方图均衡化则是基于整幅图像的,即使得整幅有雾图像的直方图满足均匀分布,为了使雾天图像的对比度得到整体上的增强,可以增加像素的灰度值的动态范围。这种方法的计算量不大,且易于实现,但对于一些细节的增强还不够。而局部的直方图均衡化,则对于被处理图像的所有局部区域,都要采用直方图均衡化,并且为了使图像的局部信息得到自适应地增强,需要在局部范围内对运算进行叠加。

    2.小波变换
    近十几年来,小波变换的信号处理方法也逐渐发展起来。该方法可以理解为对一系列的小波函数进行缩放和平移,并用它们代替傅立叶变换中的余弦和正弦函数,再进行傅立叶变换得到的结果。小波和局部信号的相关程度可以通过小波系数反映出来,而它的计算要通过对母小波的缩放和平移操作来实现。信号的时间信息可以通过平移母小波来得到,而信号的频率特征则可以通过缩放母小波的宽度获取。小波变换具有提供局部分析和细化的能力,这是小波变换的主要优点,小波变换良好的局部特性体现在时域和频域上,在高频区域,要想聚焦到所要分析的对象所具有的任意细节,可以利用逐渐精细的时域,也可以利用空域的步长。该方法既能较好地保留图像的细节特征,又能有效地去除噪声。

    3.Retinex算法
    Retinex理论是由Edwin.H.Land提出的一种经典的图像增强算法,该理论是基于颜色恒常理论。颜色恒常可以体现人眼对环境光线的变化的反应,也就是说,即使环境光线发生了变化,人眼也可以对物体表面反射光线的强度的增强或减弱进行辨别,还可以保证所看到的物体的表面颜色不发生变化。而Retinex理论,即视网膜大脑皮层理论则认为:当人的眼睛感受到亮度变化的时候,人的视觉系统只会对可以体现物体本身属性的信息有印象,所以可以在一定程度上不被外界环境光线的变化所影响,而保证所看到的物体颜色恒定。因为Retinex既具有颜色不变的特性,又具有动态范围压缩的特点,并且它是一种用来描述颜色不变性的模型,所以采用该方法对那些由于光照不均而造成的低对比度的彩色图像进行增强处理时,也会取得很明显的效果。在图像去雾过程中,可以把雾天作为环境照度的变化,利用Retinex算法可以很好地保持物体原本具有的色彩,从而获得具有较好视觉效果的无雾图像。一般来说,应用Retinex处理彩色图像是分别对R,G,B通道进行Retinex处理将得到的结果作为R,G,B通道。这种方式对于三个通道比较均衡的图像来说效果比较好。但是有的图像就只有某一通道,如R通道分量特别小,然后经过Retinex强行将R通道调整到[0,255]区间,这样效果不会太好。
    而基于物理模型对有雾图像进行复原的方法有多种,大体可分为以下3类,分别是基于偏微分方程的、基于深度关系的、以及基于先验信息的。这些方法常常是基于两种大气散射模型,一类是McCartney提出的单色大气散射物理模型,一类是Narasimhan等人从RGB色彩空间出发,推导出的二色大气散射模型。而单纯地基于物理模型实现去雾,由于天气的复杂多变性导致物理模型拟合的困难,而且传统立体算法中的光密度测量不考虑光传播过程中的散射和吸收现象,从而产生系统的匹配误差。

    2.2 基于拉普拉斯平滑的视频去雾方法雾对立体重建算法提出了挑战,同时也带来了补偿优势。从计算的观点来看,众所周知,立体重建对远距离图无法很好地工作。进一步的深度平滑会导致表面细节损失,例如细长的结构和孔洞。雾信息包含的深度信息在性质上是不同的,因为较厚的雾与较大的距离相关联。
    在本文中,联合研究立体视觉和去雾问题,实现了一种同时估计场景深度和对输入图像除雾的算法。在立体视觉融合技术中,分为局部的和全局的立体视觉技术。局部的立体视觉技术围绕个别的像素周围的灰度值或者边缘模式进行匹配,但是其忽略了可能连接邻近点的约束。而立体视觉的全局方法,是将立体视觉问题建模为一个基于近邻像素的序列或者平滑约束的能量函数,并对其进行最小化。本文在基于传统的雾模型和能量函数上,使用了包含更加复杂的颜色一致性项,拉普拉斯平滑项,基于传输的排序约束的平滑项的新能量函数。在本文公式中,立体匹配和雾信息的深度线索相互加强,基于在计算机视觉广泛使用的散射模型,使用这个新的能量函数,可以同时实现立体重建和去雾。
    立体匹配有五个约束条件:极线约束,顺序性约束,连续性约束(也称作表面平滑约束),唯一性约束,相似性约束。提出的衡量函数在一定程度上衡量了立体匹配的连续性约束和相似性约束。该方法包括四个关键特征。首先,我们改进了立体重建中的颜色一致性项以结合散射效应。当从不同的角度评估两个像素的一致性时,我们明确地模拟了由于雾而造成的外观变化。其次,我们直接从场景深度计算每个像素处的雾的传输。这确保了我们的立体效果和除雾效果相互一致。第三步,我们将有效的雾传输的先验结合到立体重建除雾公式中。具体而言,由于雾的传输可以直接从深度计算,所以我们在场景深度处加入了拉普拉斯平滑约束,这个约束有助于捕捉深度图中的细节。最后,我们还利用基于传输的排序深度信息中的可靠信息,采用了成对的场景深度排序约束。
    共同优化新的能量函数中的分项有助于为立体深度恢复和除雾带来双赢,通过定义新的颜色一致性项和拉普拉斯项,有助于保存深度图中的细节,这也是由于它与光谱图像分割密切相关。
    2.3 本章小结在本章中,主要介绍了视频去雾和立体重建等问题的研究现状,总结了其优缺点,并从实际待解决的问题出发,分析了有借鉴意义的方法,提出了本文理论模型的大致框架,这也是接下来后续章节待实现和实验的概括纲要和方向。
    第3章 视频去雾和立体重建方法3.1 颜色一致性项的构建我们知道,在视频序列中,每个点和相邻帧的同一个点的物理信息应该是近似不变的,而像素点的颜色则是最基本的一个物理性质。
    3.1.1 评估深度图的颜色一致性在立体重建中,颜色一致性f(p, V)是一种标量函数,用于测量给定三维重建p与一组图像的视觉兼容性。在3D点p处的简单颜色一致性函数被定义如下:将p投影到V中的每个可见图像中,并且将它们投影附近的图像纹理的相似度计算为颜色一致性。不是比较每个图像中的单个像素颜色,而是比较每个局部图像区域中的一组像素颜色的差异大小。
    (比如说下图就是比较3*3的局部像素区域的差异)

    为了评估立体重建图像和实际视频邻近帧的视觉差异,我们使用颜色一致性项。
    假设我们的视频有n个连续的帧I={It|t=1,…,n},根据任意的标准structure from-motion (Sfm)算法,我们可以得到照相机参数C=(Kt,Rt,tt),其中Kt是内在矩阵,Rt是旋转矩阵,tt是传输向量。简而言之,Sfm算法是一种基于各种收集到的无序图片进行三维重建的离线算法,首先进行特征检测和特征匹配。当所有的两两匹配图像对被确定以后,就可以考虑把多个图像中都出现的共同特征匹配点连接起来,就能形成轨迹了。一旦符合的轨迹都找到后,就构造图像连接图,包含每个图像的节点,和有共同轨迹的图像边缘。最后通过不断地进行Bundle Adjustment,不断加入3D点,得到摄像机参数和场景几何信息。
    也可以根据zhang等人提出的根据视频进行立体重建的方法,近似得到每一帧的深度图 D={Dt|t=1,…,n}, 因此也可以通过求倒数得到其逆深度图Z={Zt|t=1,…,n}。
    为了定义颜色一致性项,按照多视图立体重建的原理,对于第i帧的每一个像素点x,其逆深度为Di(x),那么可以通过以下公式将其投影到第j帧,得到其在第j帧的相应位置

    因此,我们由初始近似得到的逆深度图和邻近帧中的深度信息,可以去估计当前的逆深度图中的立体重建的效果,使用颜色一致性项Ep(Dt) :

    其中N(t)是第t帧的邻近帧数,|N(t)|是邻近帧集合的大小。
    3.1.2 基于散射效应的颜色一致性项的计算由于传统的基于视频的立体重建方法并没有考虑到雾的因素,由于雾天环境下存在着散射效应,因此我们提出了基于雾天散射效应的新的颜色一致性项。
    在计算机视觉中,广泛使用的一个散射模型是:

    其中I:是在散射介质中观察到的图像,IJ是不受散射效应影响的真实图像,A是大气光,a是媒介传输参数,a决定了没有散射并且到达到摄像机的光的比例。当A是同质时,a可以简单的表示如下:

    其中B是散射系数,其决定了传输媒介的密度,而z是该点和摄像机中心的距离,为了简化该公式,我们假设该点的场景深度如那样的方法大致估算。
    为了得到A和B,为了简化该问题,我们使用的方法去估算A。根据得到的A以及一些第i帧和第j帧中匹配的像素点(这也是根据公式3.1),

    根据方程3.3,它们满足于

    由于Xk和Yk其实是对应于同一个场景点,可知:

    因此,我们有:

    其中Zi(xt)是根据zhang G等人提出的获取深度图信息的方法获得的深度信息。根据公式3.6,我们能获得每一对匹配点之间估算的B值,舍弃一些逆深度差别小于某个阈值(通常取0.001)的匹配像素点。为了简化问题,可以简单的取得到的B集合的平均值作为B值。
    我们定义

    其中,

    是Ri的行。

    是ti的行。现在我们使用投影

    来计算在具有媒介传输参数ai(x)的第i帧的像素点x在第y帧的媒介传输参数a:

    其中,

    是矩阵的最后一行。由公式3.4,我们可以从Zi(x)得到ai(x)。因此,我们可以使用基于雾的散射效应的颜色一致性项来评估立体重建的效果:

    其中,

    这可以根据公式3.3简单推导得到。注意到利用公式3.4我们可以利用D(x)来表示,a(x) 因此在公式3.8中,深度D(t)是唯一的自变量。
    3.2 几何相关项的构建几何相关项专门设计用于基于视频的立体重建,以确保恢复的深度图的时间一致性和处理遮挡。我们借鉴zhang等人在2009年提出的几何相关项的计算方法。与典型的多视角立体重建方法不同,该方法不仅强加颜色一致性约束,以统计方式将几何相关性与多个帧明确关联。它们有助于可靠地减少图像噪声和多帧数据遮挡的影响,从而使我们的优化不受过度平滑的影响。它会检查相邻帧中每一像素点与所对应的共轭像素的距离。所谓共轭像素,其实也就是我们之前所说的一个像素点在相邻帧中所对应的像素点。

    其中,

    是第t帧中具有逆深度Dt(x)像素点x的共轭像素在t帧中的位置,与公式3.8提到的相同。让计算机自动建立多幅图像之间的匹配关系其实是立体重建最困难的一个问题。可以看出,这项是为了评估立体重建后的深度图中,每个像素点和邻近帧所对应的像素点的距离关系,在此,我们可以简单的使用街区距离来衡量,当然也可以使用欧式距离。因为如果在相邻帧中出现了较大的像素位移,而照相机显然是在非常缓慢移动的过程中,这个位移较大的点往往是误差导致的。所以我们用几何相关项来评估这个误差的。
    3.3 平滑项的构建平滑的本义是指:重新分配概率,即使没出现的事件也会赋予一个概率。而体现在数学上的平滑法,就是对不断获得的实际数据和原预测数据给以加权平均,使预测结果更接近于实际情况的预测方法,又称光滑法或递推修正法。对于实际数据接近于平稳不变的情况,可以应用一次平滑法,以消除偶然因素的影响。
    3.3.1 朴素的平滑在同一帧的图像中,邻近的像素的深度变化往往变化非常微弱,因此在相邻的像素之间,大部分情况下深度应该是近似不变的。在实际情况中,基于像素点的匹配代价并不能完全正确地反映两幅图像中两个点匹配的正确性;比如噪声、大范围的相似区域等,其结果是错误匹配的代价常常会小于正确匹配代价,从而影响算法在该点的深度估计。因此,必须增加一些额外的平滑约束到能量的定义中,这种约束通常是采用对深度或者灰度的变化的惩罚,以抑制噪声对匹配结果的影响。为了衡量立体匹配的正确性,我们在我们的能量函数中引入了平滑项。
    通常,在立体重建中,平滑项被定义为如下:

    考虑鲁棒性,f(Dt(x),Dt(y))通常是截断的l1函数,即:

    其中t1是截断参数,w(x,y)是权重函数,表示像素点x和像素点y应该拥有相同逆深度的可能性。为了鼓励深度不连续性与颜色变化一致,w(x,y)通常基于相邻像素的色差来定义。在此处,我们简单地采用zhang等人提出的方法去定义平滑项权重系数w(x,y)。
    3.3.2 基于传输的排序约束的平滑之前介绍的朴素的平滑项,通常已经能够较好地在一般的立体重建中衡量立体匹配的效果。然而,我们的立体重建是对于受到大雾天气影响的视频进行的。与绝对深度值的传输相比,雾传输对点与点之间的深度顺序有更可靠的约束。我们可以进一步的利用雾这方面的信息。更具体地说,假设x和y是两个相邻像素,如果at(x)>at(y),我们期望Dt(x)>=Dt(y)。 理论上,公式3.4通过简单的推导可以得出该结论。
    因此,当这个条件被违反时,我们分配一个大的惩罚t2。 在数学上,我们将公式3.10中的f(Dt(x),Dt(y))修改为

    见图3-2,这是我们专门分别对某一帧的利用朴素的平滑项和基于传输的排序约束的平滑项实验的效果,可以看出,朴素的平滑项明显的有很多边缘模糊的现象,而使用基于传输的排序约束的平滑项可以比较好地保持物体的边缘细节。不过在某一些帧的效果上可能现象没有那么明显,这也可能跟某一帧的场景中的物体细节和边缘部分是否比较多有关。因此我们挑出对比效果较为明显的其中一帧的对比效果,原图中场景深度较小的物体拥有比较多的边缘和细节部分,而基于传输的排序约束的实验结果也较好地保存下了细节部分。

    3.4 拉普拉斯平滑项的构建在实际情况中,很有可能出现一种零概率问题,就是在计算某概率时,由于某个分子项为0,而导致整个项的结果也为0。这个问题也常出现在人工智能领域的文本分类上。这是不合理的,不能因为某个分子项为0而认为整个项的最后结果都是0。为了解决零概率问题,法国数学家拉普拉斯最早提出用加1的方法估计没有出现过的现象的概率,所以拉普拉斯平滑也叫做加法平滑。
    雾的出现也开启了丰富重建深度细节的可能性。为此,我们将拉普拉斯约束作为细节保留平滑项。雾透射图应该满足拉普拉斯平滑先验。考虑到该点,我们发现拉普拉斯先验不仅可以重新定义传输的图像,而且有助于保存深度图中的细节部分,可能是因为其和光谱图像分割有密切的联系。拉普拉斯项定义为如下:

    其中vec(at)将at转化成向量形式,It是拉普拉斯矩阵,与Levin提出的一致,它的第i行第j列的元素定义为如下:

    由图3-2可知,相比之下,使用拉普拉斯平滑项能够较好地保留深度图中的细节。

    3.5 立体重建深度图的构建之前提出了若干个评估立体重建中邻近帧之间差异的项,这些在一定程度上都体现了立体重建的实际效果。为了能够同时评估上述项,我们构建了新的能量方程,并且在各项前加入权重系数。此时的能量方程的唯一自变量就是逆深度图Dt,通过能量方程的最优化,可以使得我们选择到对应的最优逆深度图,从而得到立体重建后的深度图,由此,便最后可得到立体重建后的视频去雾图像。
    3.5.1 能量方程的构建在有雾的视频中测量颜色一致性通常很困难,因为场景辐射的衰减与不同的相机位置不同。为了克服这个困难,我们提出一个更复杂的颜色一致性项来考虑散射效应。同时,雾的出现也为丰富重建深度的细节提供了可能性。为此,我们利用传输提供的排序约束,在逆深度施加平滑度。最后,我们将拉普拉斯约束作为细节保留平滑项。
    在目前传统的已有的立体重建方法中,该能量方程已经较为准确地评估了颜色一致性,几何相干项,平滑项所表示的立体重建的效果。在本文中,我们参考HeK等人提出的方法,新加入了拉普拉斯平滑项,以满足拉普拉斯先验,并且提出了优化之后的颜色一致性项,基于传输约束的平滑项,因此综上,我们可以得到一个新的衡量立体重建效果的能量方程,如下:

    其中Eg(Dt)是不变的几何相干项,Eps(Dt),Eso(Dt)和Elop(Dt)分别对应于新的颜色一致性项,新的基于排序约束条件的平滑项和以及拉普拉斯平滑项n 和p,^是平衡这些项的参数。共同优化这些项有助于为立体重建深度恢复和除雾带来共同利益。特别是,远距离物体的模糊性被解除,并且深度和颜色细节都被更好地恢复。
    3.5.2 能量方程的最优化参考zhang等人的方法,我们也采用了两步优化策略。我们通过忽略第一步中的几何相关项来初始化深度图,然后在第二步中迭代地求解方程3.14的完整版本。由于拉普拉斯项的存在,方程3.14并不能轻易求解。因此,我们基于引入一个辅助变量来解耦术语和交替更新的想法。这种策略在许多计算机视觉算法中被广泛使用,并表现出良好的性能。
    我们将函数分成两部分:能量函数可以重新写成:

    我们迭代地最小化新的目标函数,直到收敛或迭代次数超过最大限制。在每次迭代中,我们在固定at时求解Dt,然后在固定Dt时求解at。因此,2个新的子问题是:

    由于方程(3.16)中的最后一项是一元的,并且具有排序约束的Eso(Dt)不会带来额外的困难,因此方程(3.16)可以通过图像分割来求解。第二个子问题方程(3.17)是一个无约束的凸问题并且具有封闭形式的解:

    通过最小化能量方程,我们最终得到了最优情况下的逆深度图,继而可以得到深度图,从而实现了立体重建。
    3.6 本章小结在本章中,主要分部分介绍了整个立体重建的过程,是模糊概念转到实现原理的过程。分别对颜色一致性项,几何相关项,平滑项,拉普拉斯平滑项进行了阐述,通过这些分项的和来共同评估立体重建的效果。每一小节都对具体的项所对应的算法或详或略进行了介绍,下一章中将对输出结果进行展示。
    第4章 实验和分析4.1 实验结果展示我们使用了ZhuwenLi等人用以测试视频去雾效果的视频序列来对我们的算法进行测试和展示,并且将中间过程产生的拉普拉斯平滑图像也展示出来,以对实验的过程和效果有一个感知。下列为其中的部分结果,每组结果上方彩色图为原图,左下方为中间过程的拉普拉斯平滑图像,右下方的是对应的去雾后的图像。

    4.2 实验结果与问题分析从得到的结果可以看出,整个程序能较好地通过拉普拉斯平滑得到细节保存较为完整的深度图,从而从深度图中恢复出对应的立体重建和去雾之后的实际图片。
    但是,也有一些明显的问题和缺点:

    算法运行的使用时间较长,这是因为我们在迭代求优化的最小值的时候,尽可能地迭代多次以达到最优效果,因此处理完整个帧序列的运行时间会稍微比较长。部分图像的细节存在比较严重的失真现象,这可能是由于我们认为的大气光是一种同质的介质,简化了计算媒介传输参数与像素点的场景深度的方法。但是在实际中,大气光往往不是同质的,而且构成也比较复杂,尤其是在一些空气环境不够单一的情况下会更为复杂。部分图像的可见边变得模糊,对比度减小,且有一定的色彩失真,可能是由于我们在计算时,没有按照等人的比较准确但是计算量较大的方法,而是为了降低算法复杂度,简单地取一个平均值,所以随之效果也会有一部分的衰减,导致了边缘的部分模糊。视频图像的帧与帧之间具有一定的相关性,即使单帧图像的处理效果很好,但如果不能保证相邻两帧亮度的相似性,就会使处理后的视频序列中出现频闪,忽明忽暗,亮度不均等不稳定的现象,会对视觉效果有一定影响。这个可能跟我们对于颜色一致性项的权重系数和局部窗口的大小有关,当颜色一致性项的权重系数较小或者局部窗口较小时,相邻帧之间的相关性会被一定程度的弱化,就会导致上述的一些现象。
    4.3 本章小结本章中展示了部分基于拉普拉斯平滑的立体重建和视频去雾的效果图,总结了实际立体重建和视频去雾中出现的一些很明显的问题和缺陷,并对每一个问题和缺陷可能出现在什么地方、哪一个步骤中进行了原因分析和解释,为后续工作总结、展望改进指明了方向。
    第5章 总结与展望至此,我们实现了一种基于拉普拉斯平滑的视频去雾和立体重建的方法,该方法相较于其他的着色方法有优势也有不足,并且自身也存在一定的缺陷,今后的工作将围绕着改善立体重建和视频去雾结果、优化运算方法、 减少程序运行时间花费的方向进行。
    5.1 研究成果总结本文提出的视频去雾方法,理论上只需要指定对应路径的视频帧序列,就可以通过对应分别计算对应的项,最小化能量函数而得到对应的立体重建后的图像,从而实现视频去雾的效果。
    区别于传统的视频去雾方法,本文主要是提出新的颜色一致性项,基于排序约束的平滑项和拉普拉斯平滑项,从而得出一个有别于传统的能量函数的新的表达式,继续可以通过最小化该能量函数获得立体重建的最佳效果。同时相较于现有的视频去雾方法,虽然本文的方法在实验结果上仍有不足,但是对于对应的视频帧序列,大部分的物体细节都能够较好地保留下来,而没有因为立体重建的影响导致失真或者模糊的现象。然而本文的方法是建立在能量函数的迭代最小化基础上,迭代的次数在理论上也会影响最终实验的结果,那么不可避免的一个带来的问题就是程序运行时间可能会比较长。那么为了在一定程度的减短程序运行时间,可能会使得处理的效果还没有达到最优。
    但是如上一章中提到的,本文的方法在实际实现的过程中,还存在着许多的问题和缺陷,这些问题由不同步骤中使用的算法产生。例如, 由于我们认为的大气光是一种同质的介质,简化了计算媒介传输参数与像素点的场景深度的方法。但是在实际中,大气光往往不是同质的,而且构成也比较复杂,尤其是在一些空气环境不够单一的情况下会更为复杂;在计算时,没有按照等人的比较准确但是计算量较大的方法,而是为了降低算法复杂度,简单地取一个平均值。所以随之效果也会有一部分的衰减,导致了边缘的部分模糊;能量函数的各个子项的权重系数的权衡等等。
    5.2 本章小结本章中将本文算法与一些传统视频去雾算法进行比较,并大致总结了本文算法的优劣所在,同时对算法的薄弱的地方提出了可能有效的方法和设想,今后将着重围绕这些部分进行修改和完善。
    参考文献[1] Zhang G, Jia J, Wong T T, et al. Consistent Depth Maps Recovery from a Video Sequence[J]. IEEE Transactions on Pattern Analysis & Machine Intelligence, 2009, 31(6):974-988.
    [2] 涂雅瑗. 雾天降质图像的对比度增强方法研究[D];大连海事大学;2009
    [3] Bobick A F, Intille S S. Large Occlusion Stereo[J]. International Journal of ComputerVision, 1999, 33(3):181-200.
    [4] Boykov Y, Veksler O, Zabih R. Fast approximate energy minimization via graph cuts[C]// The Proceedings of the Seventh IEEE International Conference on Computer Vision. IEEE, 2002:377-384 vol.1.
    [5] 纪松.多视匹配策略与优化方法研究[D].郑州:信息工程大学测绘学院,2012.
    [6] 李学明 . 基于Retinex 理论的图像增强算法[J]. 计算机应用研究, 2005(02):235-237.
    [7] Caraffa L, Tarel J P. Stereo reconstruction and contrast restoration in daytime fog[C]// Asian Conference on Computer Vision. Springer-Verlag, 2012:13-25.
    [8] Carr P, Hartley R. Improved Single Image Dehazing Using Geometry[C]// Digital Image Computing: Techniques and Applications. IEEE, 2010:103-110.
    [9] Cozman F, Krotkov E. Depth from Scattering[C]// Computer Vision and Pattern Recognition, 1997. Proceedings. 1997 IEEE Computer Society Conference on. IEEE, 1997:801-806.
    [10] Fattal R. Single image dehazing[C]// ACM SIGGRAPH. ACM, 2008:72.
    [11] Felzenszwalb PF, Huttenlocher D P. Efficient Belief Propagation for Early Vision[J].International Journal of Computer Vision, 2006, 70(1):41-54.
    [12] 赵莹.基于单幅图像的去雾算法研究 [D].天津大学,2009.
    [13] 董长虹, 高志, 余啸海.Matlab小波分析工具箱原理与应用.北京:国防工业出版社, 2004
    [14] Geman D, Reynolds G. ConstrainedRestoration and the Recovery of Discontinuities[M]. IEEE Computer Society,1992.
    [15] 潘泉, 张磊, 梦晋丽, 等.小波滤波方法及应用[M]. 北京: 清华出版社, 2004: 40−78.
    [16] 董卫军, 周明全, 黎晓, 耿国华. 基于小波分析的边缘检测技术研究[J]. 计算机工程与应用 2004(25)
    [17] He K, Sun J, Tang X. Single ImageHaze Removal Using Dark Channel Prior[J]. IEEE Transactions on Pattern Analysis& Machine Intelligence, 2011, 33(12):2341-2353.
    [18] Jiang N, Cui Z, Tan P. A Global Linear Method for Camera PoseRegistration[C]// IEEE International Conference on Computer Vision. IEEE,2014:481-488.
    [19] Kopf J, Neubert B, Chen B, et al. Deep photo: model-basedphotograph enhancement and viewing[J]. Acm Transactions on Graphics, 2008,27(5):1-10.
    [20] Krishnan D, Fergus R. Fast image deconvolution usinghyper-Laplacian priors[C]// International Conference on Neural InformationProcessing Systems. Curran Associates Inc. 2009:1033-1041.
    [21] Levin A, Lischinski D, Weiss Y. A closed-form solution to naturalimage matting.[C]// IEEE Computer Society Conference on Computer Vision andPattern Recognition. IEEE Computer Society, 2006:61-68.
    [22] 纪松, 范大昭, 戴晨光, 等. 线阵影像GC3多视匹配及其扩展模型研究[J]. 测绘科学技术学报,2009,26(6): 44-47.
    [23] Zhuwen Li, Tan, Ping, Tan,Robby T, et al. Simultaneous video defogging and stereo reconstruction[J].2015:4988-4997.
    [24] 陈永亮, 灰度图像的直方图均衡化处理研究[D];安徽大学;2014[25] Narasimhan S G, Nayar S K. Contrast restoration of weather degradedimages[J]. IEEE Transactions on Pattern Analysis & Machine Intelligence,2003, 25(6):713-724.
    [26] 肖燕峰, 基于Retinex理论的图像增强恢复算法研究[D];上海交通大学;2007
    [27] 张璇, Retinex理论及其在压缩域图像增强中的应用研究[D];合肥工业大学;2010
    2 评论 17 下载 2018-10-01 22:48:38 下载需要13点积分
  • 基于Python实现的搜索和推荐系统

    一、引言伴随着科技的不断进步,互联网,万维网的不断发展。我们越来越热爱万维网,也欣赏他的发展方式。20世纪90年代初,万维网还只是一个将文档联系起来的简单网络。如今,他已经成为了全球信息的框架。显然,如何表达万维网上的数据是下一步需要解决的问题。但这个问题并不简单。
    关联数据是万维网上表示和连接结构化数据的一系列技术。通过关联数据将万维网转换为一个全球性的数据空,我们称之为数据网(Web of Data)。通过关联数据SPARQL查询语言同时查询多个信息源的关联数据,并动态合并并查询结果,这样的方法是传统数据管理技术很难实现的或根本无法做到的。
    籍由关联数据技术,我们更容易和他人共享数据。理论上说,可以采用关联数据描述任何内容。万维网上的关联数据可以被发现,共享并与其他用户的数据进行合并。与传统的数据管理系统不同,关联数据将信息从专有容器中(proprietary container)中释放出来,任何人都可以使用这些信息。与其他数据一样,关联数据的质量和效用由数据使用者来负责评估。人们只信任可靠的数据。
    我们正是基于这样一个数据可靠、安全、数据之间可关联的关联数据技术,来实现我们对于搜索服务和基于语义的推荐服务。
    二、准备2.1 软件工程语言选择世界上有非常多的软件编译语言,主流的有C、C++、JAVA、PYTHON、C#等等。每一种编译语言都有他们自己的特点,每一种编译语言都有他们自己的库和相关的编译工具。用什么样的语言来实现我们搜索和推荐服务是首先要考虑的。
    搜索和推荐服务是一个对互联网信息资源进行搜索整理、分类,并储存在网络数据库中供用户查询的系统,包括信息收集,信息分类,和目标查询三个部分组成。
    从使用者的角度看,搜索和推荐服务提供一个包含搜索输入框的页面,在搜索框中输入词汇,通过浏览器提交给搜索后台服务引擎后,搜索后台服务引擎就会返回跟用户输入的内容相关的信息列表。其实这样的搜索后台服务引擎涉及到很多领域的理论和技术:数字图书馆,数据库,信息检索,信息提取,人工智能,机器学习,自然语言处理,计算机语言学,统计数据分析,数据挖掘,计算机网络,分布式处理等等,具有综合性和挑战性。
    在世界范围内,百度,GOOGLE,搜狗就是非常好的搜索引擎。通过学习这些搜索服务,我们发现他们都是通过Web来进行搜索服务的。
    因此我们确定我们的搜索和推荐服务也应当是通过TCP方式,HTTP协议,以Web的方式进行搜索和推荐服务,通过Web来实现搜索和推荐的交互功能。
    在实现Web这样的B/S架构时,我们发现两种语言适用于开发这样的服务程序。一个是Java语言,一个是Python语言。
    在Java语言中有Tomcat服务来实现网页与后台的相互传参,运算;在Python语言中有Callimachus和Django来实现网页与后台逻辑的通讯。
    通过对比Java和Python开发我们发现:

    Java开发所需要的JDK版本一旦安装完成,在同一台PC机上是需要通过卸载重新安装来实现;在Python中对于Python2.7和Python3,我们通过virtualenv和anaconda等虚拟容易来盛放不同的python版本只需要通过cmd(windows下)命令就可以实现
    Java中的库主要都是对于类型转换,和网页servlet方式的库;在python中不仅包含于网页的相关库,他更强大的是有很多算法库,由于python属于脚本语言,所有他所支持和库所涉及的功能范围比java库要更加多
    在Java中进行相关的SPARQL查询,需要安装jena,并将安装好的jena文件进行相应的环境变量配置;但是在python中对于sparqlwrapper,只需要通过cmd命令(pip install xxx)就可以静待电脑自动安装相应文件,而不需要配置相应的环境变量

    因此基于以上分析,我们最终选用python来作为我们的软件开发语言。
    2.2 服务器的选取一个好的关联数据开发平台有助于提高开发效率。Callimachus和Django都是这样的一种平台。
    2.2.1 Callimachus尽管Callimachus的开发者们将其定义为关联数据管理系统,但是将其视为关联数据的应用服务器更加合适。Callichus主要具备以下特征:

    模板系统能自动为OWL类(OWL class)的所有成员生成网页。严格来说,OWL类与RDF schema类本身或其子类并无二致(取决于所用的OWL配置文件)。简单起见,我们认为OWL类与RDF Schema类是等价的
    在运行时检索数据,并将其转换为RDF格式
    将SPARQL查询与URL关联起来,对查询进行参数化,并使用带有图标库(charting library)的查询结果
    PURL(持久化URL)实现

    基于DocBook的结构化书写系统(structured writing system)包括可视化编辑环境。
    简而言之,Callimachus支持使用关联数据进行导航,可视化,构建应用程序等操作。数据既可以保存在本地,也可以从万维网上采集,甚至可以在载入Callimachus时被转换为RDF。
    2.2.2 Django而Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,模板T和视图V。
    Django 项目是一个Python定制框架,它源自一个在线新闻 Web 站点,于 2005 年以开源的形式被释放出来。Django 框架的核心优势有:

    用于创建模型的对象关系映射
    为最终用户设计的完美管理界面
    一流的 URL 设计
    设计者友好的模板语言
    缓存系统

    Django是一个基于MVC构造的框架。但是在Django中,控制器接受用户输入的部分由框架自行处理,所以 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),称为 MTV模式。它们各自的职责如下:

    模型(Model),即数据存取层:处理与数据相关的所有事务:如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等
    模板(Template),即业务逻辑层:处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。一般将网页html和js文件存放在此层中
    视图(View),即表现层:存取模型及调取恰当模板的相关逻辑。模型与模板的桥梁。在view里面进行python后台处理,他将网页的响应数据拿到,同时也为网页发送请求

    从以上表述可以看出Django 视图不处理用户输入,而仅仅决定要展现哪些数据给用户,而Django 模板 仅仅决定如何展现Django视图指定的数据。或者说, Django将MVC中的视图进一步分解为 Django视图 和 Django模板两个部分,分别决定 “展现哪些数据” 和 “如何展现”,使得Django的模板可以根据需要随时替换,而不仅仅限制于内置的模板。
    2.2.3 对比通过使用Callimachus和Django两种服务器我们发现:

    Django在后台可以植入各种py文件来作为算法和逻辑基础;在Callimachus所有的sparql操作统一下xhtml上div块中进行书写,也就是Callimachus将业务逻辑基本集成在网页上面编写
    系统稳定性:Django早在2005年的时候就已经开始使用,网上对于Djano开发时所遇到的问题都有全面的回答,维护起来非常方便;Callimachus是在近几年才推出来的关联数据管理器,他虽然针对关联数据有很好的执行能力,但是在网上不止是关于他运行时的一些解决问题,就连关于他的介绍都微乎其微,在Callimachus运行的时候所遇到的维护问题只能靠自己解决,稳定性不确定,属于试验阶段
    开发周期:Django因为有越来越多的人在使用,而且出来较早,对于Django的查询和学习资料较为广泛,开发时间短;Callimachus因为网上资料确实太少,仅有的介绍只是Callimachus的官网说明,因此开发难度较大,学习周期长

    基于以上分析,我们最终选用Django服务器来实现我们的搜索和推荐服务。
    三、搜索服务3.1 搜索服务软件目录结构
    该路径为项目目录的根文件夹。
    其中Paper_search文件作为Django生成的APP文件,在该文件内来实现网页的请求和响应,以及sparql查询功能。
    Statica文件用于存放javascript文件和css文件,用于增强网页效果。
    Templates文件用于存放html文件,来作为网页html的存放文件夹.
    Zhishi文件用于存放该项目文件中的一些配置文件,主要是其中的settings.py文件用于项目承认Paper_search这个APP,用于指定static文件为静态文件路径;另外该文件夹下的urls.py文件用于绑定方法与html路径。
    最后是manage.py文件,该文件作为Django运行的起始文件,整个项目的运行开端为manage.py文件。

    在app文件里面,我们主要的逻辑程序都在views.py文件中,其中的方法主要是sparql的查询,正则化处理,网页的请求和相应。
    3.2 搜索服务功能本搜索服务主要是通过在网页上输入一本书的名字,通过书名正则匹配的方式,检索出完整的书名、作者名字、书籍资源的url。
    首先(windows下)通过打开cmd,在命令行cd 到该项目路径:

    在项目路径下执行该命令:

    上一行workon bayou是virtualenv技术,workon来执行我项目所配置到的env环境中,通过让baoyu的env环境工作,使得当前环境为我需要的Python2.7环境。
    进入到环境后通过下一行执行manager.py文件,并指定端口号为9000。开启服务器后,网页输入以下网页来实现搜索的效果。

    通过在网页端输入你想输入的书籍名字,可以是大概名字,点击下面的“提交”按钮。然后经过后台检索,跳转到另一个HTML页面显示该搜索结果。

    跳转到的界面,输出该书的出版时间,作者,和书籍的资源路径
    3.3 SPARQL语句分析在搜索服务软件中,我们通过导入SPARQLWrapper,来实现通过SPARQL来基于DBpedia数据来进行的搜索:
    sparql.setQuery(""" PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX dbo: <http://dbpedia.org/ontology/> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX onto: <http://dbpedia.org/ontology/> select ?BookName,?Author,?Country,?Subject,?Label,?ReleaseDate,?Publisher WHERE{ ?book a dbo:Book. ?book foaf:name ?BookName. ?book dbo:author ?Author. ?book dbo:country ?Country. ?book dct:subject ?Subject. ?book rdfs:label ?Label. ?book dbp:releaseDate ?ReleaseDate. ?book dc:publisher ?Publisher. FILTER regex(?BookName,"%s","i") } """ % name)以上为我们所采用的SPARQL语句,通过定义?book是一个BOOK书来实现的相关查找,对于查找我们在最后加入FILTER 来进行正则化过滤,确保我们查询的书籍跟网页上的书籍对应。由于在SPARQL中我们要传递的是一个变量,所以在这里我们采用%s的格式化标识来传参。
    3.4 经验与收获在通过该搜索功能的实现中,首先我们训练了基于Django实现的网页交互功能。主要熟悉了Django软件的请求与响应流程:网页的参数通过urls.py文件绑定到响应的APP下的viwe.PY文件中的响应方法,通过该方法拿到参数后,传递给相应的查询语句并返回结果,后通过urls.py文件传结果参数给相应的html文件进行前端显示。
    练习了SPARQL怎么作为查询语句在现目中实现,通过SPARQLWrapper库提供的功能,将查询语句写入,通过调用其相应的方法执行查询、格式化输出等操作。
    另外为了实现网页的参数在SPARQL查询语句里也依然是个参数,我们通过多方的探究,独立想出了使用格式化符的方法。在原来的实验中,我们尝试”””+变量+”””这样的拼接方式进行传入变量但是不成功,但是通过这样独立的思考,对于实现SPARQL接收其他类或方法下的变量,有了很好的印象。
    3.5 不足在搜索功能的中,我们对目标的检索只停留在对单一的,比如说单书本名字,单电影名字或者单游戏名字。我们应当将书籍,电影,游戏的名字与其他相关基本信息联系起来。比如通过电影名字仅仅提供单个字符,然后基于电影的导演名字配合来查找到相关目标。
    3.6 所需配置的环境与包
    Python2.7环境
    Django库(通过pip install django)或者在pycharm里面setting中添加也行
    SPARQLWapper

    四、推荐功能服务4.1 功能介绍基于B/S架构的推荐功能服务。通过在网页上输入相应的书籍名称,和你知道的书籍描述。通过书籍名字和描述来确定与书籍相同主题上的一部电影,并通过推荐算法来推荐与这部电影最相近的10部电影。
    首先进入到本地9000端口下的index界面:

    在书籍名字和书籍描述上一定要填上。这里以一千零一夜为例:通过填入一千零一页这本书,和该书的主题(在dbpedia中为该单词)one_thousand主题。通过提交按钮,在后台查询到与之主题最匹配的一个电影(Aladding(1992)film)将Aladding(1992)film这个结果返回给我们机器学习算法使用交叉回归的方式来实现与这部电影最相近的10部电影(推荐的方式都是基于用户对电影的评价和评分,通过评价和评分综合推荐相似的电影)。返回出结果

    通过填入一千零一页这本书,和该书的主题(在dbpedia中为该单词)one_thousand主题。通过提交按钮,在后台查询到与之主题最匹配的一个电影(Aladding(1992)film)。
    将Aladding(1992)film这个结果返回给我们机器学习算法使用交叉回归的方式来实现与这部电影最相近的10部电影(推荐的方式都是基于用户对电影的评价和评分,通过评价和评分综合推荐相似的电影)。返回出结果。

    通过点击提交按钮,跳转到可视化界面,在这里可视化界面需要在打开的chrome右键属性进行相应的目标文件配置。
    在目标那栏:"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"末尾空一行添加:--allow-file-access-from-files效果即为:"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --allow-file-access-from-files
    4.2 推荐服务的目录结构
    该路径为项目目录的根文件夹。
    其中Paper_search文件作为Django生成的APP文件,在该文件内来实现网页的请求和响应,以及sparql查询功能。
    Statica文件用于存放javascript文件和css文件,用于增强网页效果。
    Templates文件用于存放html文件,来作为网页html的存放文件夹。
    Zhishi文件用于存放该项目文件中的一些配置文件,主要是其中的settings.py文件用于项目承认Paper_search这个APP,用于指定static文件为静态文件路径;另外该文件夹下的urls.py文件用于绑定方法与html路径。
    最后是manage.py文件,该文件作为Django运行的起始文件,整个项目的运行开端为manage.py文件。
    4.3 推荐服务的逻辑流程4.3.1 方法目录所有的处理逻辑都集中在Paper_rearch文件夹下的view.py文件中:

    Def query_fun作为sparql查询方法,返回一个电影名称
    def read_item_names():电影名与电影id,电影id与电影名绑定映射
    def clearContentWithSpecialCharacter(content):正则化方法,用于对电影名字进行文字格式处理
    def receive_data(request):处理页面响应,并向页面发送请求

    4.3.2 执行逻辑首先通过网页上输入的书籍名字和书籍主题,通过receive_data(request):来接收书籍名字和书籍主题,将这两个参数传入给:query_fun(书籍名字,书籍主题)。
    query_fun找到电影名字,在query_fun配有相应的正则化方法来输出我们所需要的格式下的电影名字film_name。
    执行read_item_names()方法来输出“电影名与电影id”,“电影id与电影名”映射模型film_name与电影id相绑定,输入到surprise提供的交叉熵算法来求得,人们对该电影评价与评分最相近的10部电影,然后传递给网页显示。
    4.4 SPARQL分析sparql.setQuery(""" PREFIX onto: <http://dbpedia.org/ontology/> select ?b WHERE{ ?a dct:subject ?subject_a. FILTER regex(?subject_a,"characters"). FILTER regex(?subject_a,?subject). ?b dct:subject ?subject_a. ?b a dbo:film. { select ?a,?subject WHERE{ ?a dct:subject ?subject. FILTER regex(?a,"characters"). { select ?subject,?BookName,?book WHERE{ ?book dct:subject ?subject. ?book a dbo:Book. ?book foaf:name ?BookName. ?book rdfs:comment ?a. ?book dbp:author ?b. FILTER regex(?BookName,"%s"). FILTER regex(?subject,"%s").} } } }} """ % (name,subject))本查询语句使用了3层的子查询结构。在第一层查询中:
    select ?subject,?BookName,?book WHERE{ ?book dct:subject ?subject. ?book a dbo:Book. ?book foaf:name ?BookName. ?book rdfs:comment ?a. ?book dbp:author ?b. FILTER regex(?BookName,"%s"). FILTER regex(?subject,"%s").}我们来找到网页上输入的书籍名字和主题最契合的书和主题。主要将输出的主题提供给父查询来使用。在第二层查询中:
    select ?a,?subject WHERE{ ?a dct:subject ?subject. FILTER regex(?a,"characters"). { select ?subject,?BookName,?book WHERE{ ?book dct:subject ?subject. ?book a dbo:Book. ?book foaf:name ?BookName. ?book rdfs:comment ?a. ?book dbp:author ?b. FILTER regex(?BookName,"%s"). FILTER regex(?subject,"%s").} } }我们根据第一层查询到的主题,来找到一个大类,这个类与这个主题是一样的。同时输出这个类和主题供父查询来使用。
    在最外圈的查询,我们查找与?a类和?a的主题一样的电影,查询出来输出。把这个查询结构进行正则化处理后,交给推荐算法来进行电影推荐。
    4.5 经验与收获为了实现通过书籍来查询电影功能,我们通过w3c官网来查找相关文档学习SPARQL的相关查询方法,并总计了相关查询语句,写成了相应的博客文档:

    https://blog.csdn.net/qq_28666313/article/details/80782827
    https://blog.csdn.net/qq_28666313/article/details/80777155

    为了实现推荐功能,我们通过相关资料的查找,确定了Item-base算法,这种算法通过纵向(观众的评分)和横向(观众的评价)来交叉考虑得到与之最近的分类从而实现基于一个电影推荐其相关电影的功能。
    由于Item-base算法中对电影名字有严格的命名匹配,所以我们在处理python中的正则化方法的时候,进行了思考,对正则处理有了一定的经验
    4.6 不足在基于SPARQL中,电影与图书在相同谓语,相同宾语上的联系,不是那么方便。我们通常通过图书找到与子匹配的大主语,再通过大主语下是否有相应的小主语(电影类别)来进行的语义的查找。但是这样的匹配成功率不高,有很多图书并没相关电影;也有很多图书相关的电影太多了(但是匹配的主题很宽泛比如都是属于英国出版,都是表述爱情)。而且再DBpedia上这样的语义描述还是太少了,只是一些关键上的描述。对于这样的语义关联查询,在描述上越多越好查询。
    本次查询就是经过不断的尝试,发现了Thousand Nights and a Night(一千零一夜书籍)与Aladding(大类)有共同的subject(One_Thousand_and_One_Nights_characters),这个共同的主题就是他们的联系。通过Aladding(大类)再来找到Aladding_film(1992)年的电影,但这样的实例不太容易发掘,其主要原因还是SPARQL语句的不理解,和对基于语义的相关查询操作不深。
    4.7 环境组件
    Python2.7
    Django
    SPARQLWrapper
    Cpython
    Surprise

    如果是windows环境在安装surprise包会出现缺乏microsoft C++9.0组件,这需要去微软官网下载(MAC和linux 不存在这样的问题)。
    五、基于机器学习的推荐算法分析5.1 基于机器学习的推荐算法分析推荐系统应用数据分析技术,找出用户最可能喜欢的东西推荐给用户,现在很多电子商务网站都有这个应用。目前用的比较多、比较成熟的推荐算法是协同过滤(Collaborative Filtering,简称CF)推荐算法,CF的基本思想是根据用户之前的喜好以及其他兴趣相近的用户的选择来给用户推荐物品。

    如图1所示,在CF中,用m×n的矩阵表示用户对物品的喜好情况,一般用打分表示用户对物品的喜好程度,分数越高表示越喜欢这个物品,0表示没有买过该物品。图中行表示一个用户,列表示一个物品,Uij表示用户i对物品j的打分情况。CF分为两个过程,一个为预测过程,另一个为推荐过程。预测过程是预测用户对没有购买过的物品的可能打分值,推荐是根据预测阶段的结果推荐用户最可能喜欢的一个或Top-N个物品。
    5.2 User-based算法与Iter-based算法对比CF算法分为两大类,一类为基于memory的(Memory-based),另一类为基于Model的(Model-based),User-based和Item-based算法均属于Memory-based类型,具体细分类可以参考wikipedia的说明。
    User-based的基本思想是如果用户A喜欢物品a,用户B喜欢物品a、b、c,用户C喜欢a和c,那么认为用户A与用户B和C相似,因为他们都喜欢a,而喜欢a的用户同时也喜欢c,所以把c推荐给用户A。该算法用最近邻居(nearest-neighbor)算法找出一个用户的邻居集合,该集合的用户和该用户有相似的喜好,算法根据邻居的偏好对该用户进行预测。
    User-based算法存在两个重大问题:

    数据稀疏性:一个大型的电子商务推荐系统一般有非常多的物品,用户可能买的其中不到1%的物品,不同用户之间买的物品重叠性较低,导致算法无法找到一个用户的邻居,即偏好相似的用户
    算法扩展性:最近邻居算法的计算量随着用户和物品数量的增加而增加,不适合数据量大的情况使用

    Iterm-based的基本思想是预先根据所有用户的历史偏好数据计算物品之间的相似性,然后把与用户喜欢的物品相类似的物品推荐给用户。还是以之前的例子为例,可以知道物品a和c非常相似,因为喜欢a的用户同时也喜欢c,而用户A喜欢a,所以把c推荐给用户A。
    因为物品直接的相似性相对比较固定,所以可以预先在线下计算好不同物品之间的相似度,把结果存在表中,当推荐时进行查表,计算用户可能的打分值,可以同时解决上面两个问题。
    5.3 Item-based算法详细过程5.3.1 相似度计算Item-based算法首选计算物品之间的相似度,计算相似度的方法有以下几种:
    基于余弦(Cosine-based)的相似度计算,通过计算两个向量之间的夹角余弦值来计算物品之间的相似性,公式如下:

    其中分子为两个向量的内积,即两个向量相同位置的数字相乘。
    基于关联(Correlation-based)的相似度计算,计算两个向量之间的Pearson-r关联度,公式如下:

    其中Ru,i表示用户u对物品i的打分,Ri表示第i个物品打分的平均值。
    调整的余弦(Adjusted Cosine)相似度计算,由于基于余弦的相似度计算没有考虑不同用户的打分情况,可能有的用户偏向于给高分,而有的用户偏向于给低分,该方法通过减去用户打分的平均值消除不同用户打分习惯的影响,公式如下:

    其中Ru表示用户u打分的平均值。
    5.3.2 预测值计算根据之前算好的物品之间的相似度,接下来对用户未打分的物品进行预测,有两种预测方法:
    加权求和
    用过对用户u已打分的物品的分数进行加权求和,权值为各个物品与物品i的相似度,然后对所有物品相似度的和求平均,计算得到用户u对物品i打分,公式如下:

    其中Si,N为物品i与物品N的相似度,Ru,N为用户u对物品N的打分。
    回归
    和上面加权求和的方法类似,但回归的方法不直接使用相似物品N的打分值Ru,N,因为用余弦法或Pearson关联法计算相似度时存在一个误区,即两个打分向量可能相距比较远(欧氏距离),但有可能有很高的相似度。因为不同用户的打分习惯不同,有的偏向打高分,有的偏向打低分。如果两个用户都喜欢一样的物品,因为打分习惯不同,他们的欧式距离可能比较远,但他们应该有较高的相似度。在这种情况下用户原始的相似物品的打分值进行计算会造成糟糕的预测结果。通过用线性回归的方式重新估算一个新的Ru,N值,运用上面同样的方法进行预测。重新计算Ru,N的方法如下:

    其中物品N是物品i的相似物品,alpha和beta通过对物品N和i的打分向量进行线性回归计算得到,E为回归模型的误差。
    5.4 Surprise库的介绍在推荐系统的建模过程中,我们用到python库是 Surprise(Simple Python RecommendatIon System Engine),是scikit系列中的一个(很多同学用过scikit-learn和scikit-image等库)。所使用的数据库是MovieLens 100k,该数据集包括6040个用户对大概3900部电影的1000209条评分数据。(该数据集的链接是:https://grouplens.org/datasets/movielens/100k/ )。surprise库同时支持多种推荐算法:

    基础算法/baseline algorithms
    基于近邻方法(协同过滤)/neighborhood methods
    矩阵分解方法/matrix factorization-based (SVD, PMF, SVD++, NMF)


    其中基于近邻的方法(协同过滤)可以设定不同的度量准则:

    支持不同的评定标准:
    2 评论 20 下载 2019-06-18 09:25:14 下载需要15点积分
  • 基于JSP实现的试题库管理系统

    1 引言1.1 编写目的该需求分析报告用于软件开发小组对基于WEB的软件工程课程试题库管理系统这一课题的开发过程。明确了课题开发的目的与要求,介绍了该系统的所有功能以及适用范围。
    1.2 项目背景
    运行环境

    JDK1.7Tomcat7MySQL 5.6.11
    开发平台

    Windows 8.1 Pro(x64)MyEclipse10

    1.3 定义数据流图:数据流图描绘系统的逻辑模型,图中没有任何具体的物理元素,只是描绘信息在系统中流动和处理的情况。
    系统的流程图:系统流程图是描绘物理系统的传统工具。它的基本思想是用图形符号以黑盒子的形式描绘系统里的每个部件(程序,文件,数据库,表格,人工过程等)。
    学生表:学号,姓名,密码md5串,学院,班级id,手机号,邮箱,注册时间
    教师表:职工号,教师姓名,密码md5串,学院,手机,邮箱,注册时间
    班级表:班级id,学院,班级名称,创建教师id
    题库表:试题id,试题名称,试题内容,试题答案,试题类型,试题所有者id,添加时间,4个额外备注信息
    试卷表:试卷id,试卷名称,试卷创建者id,创建试卷时间,试卷目的班级id
    答卷表:学生id,试卷id,学生在该份试卷的得分
    组题表:试卷id,试题id,该道试题在该试卷的分值
    1.4 参考资料
    《软件工程》 钱秋乐,清华大学出版社,2007
    《数据库系统开发》 文东,北京科海电子出版社,2009
    《JavaWeb整合开发王者归来》
    《Java程序设计》
    《JSP从入门到精通》
    《Think in Java》

    2 概要设计由于软件实际实现的功能有限,只实现了学生/教师注册登录模块,学生考试功能以及教师增加、删除、修改试题的功能。
    2.1 三层架构总业务流程图
    2.2 总体概要本系统采用三层架构进行设计,层与层之间采用Java接口进行衔接,降低了模块耦合度,并使用工厂模式实现对不同需求对应接口的不同实现,并在每一层功能完成后进行相应层的单元测试,对开发过程中避免了很多不必要的麻烦,节约了开发时间。
    本系统在开发过程中实现了国际化框架,可以识别不同的浏览器语言相应的显示对应语言的内容,由于开发时间限制,语言包只提供了缺省的中文语言包。
    表示层:该系统对每个表单设置表单号和验证码,可以有效防止用户的表单重复提交。本系统参考了Struct框架的表单Bean检验方式,对用户输入的表单信息进行了相应的约束,并使用正则表达式进行校验,对于不符合约束的信息,及时在网页上回显给用户,只对符合要求的表单信息提交给下层Service业务处理层,保证了业务处理层接收到的表单信息的纯净性。业务处理层:对本系统需要提供的功能进行封装和分类,分成StudentService,TeacherService和QuestionService三个子系统。
    持久层:持久层对应业务处理层,也分成了StudentDao,TeacherDao,QuestionDao三个子系统。持久层对MySQL的数据库操作进行了实现,数据库连接信息以配置文件的形式存放在网站目录中,增强了系统的灵活性,对于更改数据库只需更改相应的配置文件即可,并对Dao接口对应相应数据库进行实现即可。
    2.3 类包层次结构图
    主包名

    com.silence.questionlib
    子包

    dao:持久层接口,其中有三个接口,分别是学生子系统,教师子系统,题库子系统的对应持久层接口
    daoimpl:持久层接口实现类,分别实现持久层接口中的三个接口
    domain:整个系统的所有实体JavaBean
    exception:自定义异常
    factory:工厂模式工厂包,工厂遵循单例模式,实现根据不同的需要加载对接口的不同实现类,通过Java类加载器实现,从配置文件factory.properties读取相应的类加载信息
    formbean:用户提交表单JavaBean,实现对表单校验和相应的用户反馈信息生成,反馈信息实现国际化
    i18n:国家化包,实现国际化的工具类和相应的国际化语言包
    service:业务处理层接口,分为学生子系统,教师子系统,题库子系统三个业务处理接口
    serviceimpl:业务处理层接口对应的实现类,分别实现业务处理层的三个接口
    utils:整个项目的所有工具类,包括每个层的对应工具类
    web.controller:表示层控制型Servlet,实现对用户业务处理请求的初步处理和对业务处理层的请求
    web.ui:表示层显示型Servlet,实现对用户的请求预处理和过滤,并转发到JSP页面
    junit.test:测试包
    db.properties:JDBC连接数据库的相关配置信息
    factory.properties:工厂模式加载相应实现类的映射文件

    2.4 网站根目录层次结构图

    images:网站图片文件夹
    temp:网站缓存文件夹
    jsp:网站JSP文件夹
    lib:网站引用jar包文件夹
    tag.tld:自定义标签库描述文件
    web.xml:网站配置文件
    index.jsp:网站首页
    message.jsp:网站全局信息显示页面

    2.5 用户请求表单处理流程
    3 详细设计3.1 各个包中类详细说明
    Com.silence.questionlib.dao

    QuestionDao:试题操作持久层接口,对试题的增删改查,组卷等功能StudentDao:学生操作持久层接口,学生登录注册等基本功能TeacherDao:教师操作持久层接口,教师注册登录,创建班级,查看班级学生等功能
    Com.silence.questionlib.daoimp

    QuestionDaoimpl:试题操作持久层实现StudentDaoimpl:学生操作持久层实现TeacherDaoimpl:教师操作持久层实现JdbcUtil.java:JDBC操作工具类
    Com.silence.questionlib.domain

    Group:班级实体,对应班级表Paper:试卷实体,对应试卷表Question:试题试题,对应试题表Result:验证码生成结果实体Student:学生实体,对应学生表Teacher:教师实体,对应教师表
    Com.silence.questionlib.domain. exception

    DaoException:持久层未知异常GroupNotExist:班级不存在异常PaperNotExist:试卷不存在异常QuestionNotExist:试题不存在异常QuestionUsedException:试题正在被试卷使用异常ServiceException:业务处理层未知异常StudentNotExist:学生不存在异常TeacherNotExist:教师不存在异常
    Com.silence.questionlib.domain. factory

    DaoFactory:持久层连接工厂,根据配置文件实现对不同持久层实现的相应加载
    Com.silence.questionlib.domain. fombean

    QuestionForm::添加和修改试题表单Bean,进行表达校验和错误信息合成StudentLoginForm:学生登录表单Bean,进行表达校验和错误信息合成StudentRegisterForm:学生注册表单Bean,进行表达校验和错误信息合成TeacherLoginForm:教师登录表单Bean,进行表达校验和错误信息合成TeacherRegisterForm:教师注册表单Bean,进行表达校验和错误信息合成
    Com.silence.questionlib.domain. i18n

    I18nTag:自定义国际化标签I18nUtils:国际化工具类resource.properties:国际化资源文件的缺省文件
    Com.silence.questionlib.domain. service

    QuestionLibService:试题操作业务处理接口,对试题的增删改查,生成试卷等业务操作StudentService:学生业务处理接口,实现对学生登录注册,查看试卷等学生业务操作TeacherService:教师业务处理接口,实现对教师注册登录,创建班级,查看班级学生等业务操作
    Com.silence.questionlib.domain. serviceimpl

    QuestionLibServiceImpl:试题操作业务实现类StudentServiceImpl:学生业务处理实现类TeacherServiceImpl:教师业务处理实现类
    Com.silence.questionlib.domain. utils

    ServiceUtils:业务处理层工具类WebUtils:表示层工具类
    Com.silence.questionlib.domain. web. controller

    AddPaperServlet:处理教师添加试卷请求操作AddQuestionServlet:处理教师添加试题请求操作CheckServlet:处理学生提交试卷之后的批改操作DeleteQuestionServlet:处理教师删除试题的请求操作GroupServlet:处理教师查看班级学生的请求操作ListQuestionServlet:处理教师查看题库的请求操作LoginServlet:处理学生教师的登录请求操作PaperServlet:处理学生查看试卷的请求操作QuestionDetailServlet:处理教师查看题库中详细试题信息的请求操作RegisterServlet:处理学生教师注册请求操作UpdateQuestionServlet:处理教师修改试题信息的请求操作
    Com.silence.questionlib.domain. web. ui

    AddPaperUIServlet:向教师返回创建试卷的界面AddQuestionUIServlet:向教师返回添加试题的界面LoginUIServlet:返回学生教师的登陆请求界面RegisterUIServlet:返回学生教师的注册界面UpdateQuestionUIServlet:返回教师修改试题的界面

    3.2 登陆验证模块说明3.2.1 程序描述本系统的所有功能模按块都必须调用“登录验证”子模块进行身份验证,此模块是所有用户进入系统时都必须调用的模块,系统用户登录界面中的【登录】按钮触发。
    学生和教师的登录入口分开单独管理,以进入不同的界面,被赋予不同的特权。
    进行登录界面时,需要输入账号、密码、验证码等信息均正确的情况下方可进入。
    验证码是从0-09数字与a-z大小写字母组成,随机生成验证码图片,并保存到服务器会话对象中,因此验证码有时间期限。
    3.2.2 功能登录验证功能模块的IPO表如下表所示:

    3.2.3 界面

    3.2.4算法【登录】按钮触发的处理:验证用户的合法性。
    处理流程

    取得用户输入的用户名、密码和验证码
    加密用户名和密码传输到数据库并与帐户表进行一致性验证
    如果用户名、密码和验证码都正确,以该用户身份进入系统总控制界面并获得相应系统权限,否则根据某项错误提示对应的错误信息,如:不存在该账号、密码错误、验证码错误、账号不能为空

    3.2.5 流程逻辑
    3.2.6 接口本模块是系统的启动模块,它需要用户交互输入用户帐号、密码;它调用主控制模块。
    3.2.7 限制条件预先设置一个管理员和一个用户。
    3.2.8 测试计划
    初次安装系统后,测试初始用户帐号和密码能否正确登录到系统
    正确登录后,退出注册一个新的账号
    采用刚注册的用户账号和密码登录,应该能够正确登录
    将某一项不填看是否提示错误信息
    将某一项填错查看错误信息

    3.3 注册模块说明3.3.1 程序描述对于没有账号的学生或教师,需要注册后才可以使用本系统。学生和教师因为输入信息不同,所以分为两个入口,进入注册界面后,需要输入相应的信息,并且这些信息符合规范才可以注册成功。将注册成功后的信息加入到对应的数据库表中。
    点击注册,则注册完成。
    3.3.2 功能注册模块的IPO表如下表所示:

    3.3.3 界面
    3.3.4 算法点击注册按钮,检测输入的合法性。
    处理流程

    输入注册界面的所有内容
    点击注册,检测输入的合法性
    如果不合法提示错误信息,如果合法则显示注册成功

    注册时,账号和密码均采用MD5进行加密,将加密后的账号和密码保存到相应表的数据库中,以增加账户的安全性。
    3.3.5 流程逻辑
    3.3.6 接口当所有信息填写均符合规范,并点击注册时,所有相应信息会保存到相应数据表中。并提示注册成功。
    3.3.7 限制条件只有所有信息都符合限制规范才可以注册成功。
    3.3.8 测试计划
    进行多次注册尝试,经注册后的信息进行登录,看是否会提示错误
    输入不符合规范的信息,看是否会提示相应错误

    3.3.9 尚未解决的问题注册成功后没有跳到主页。
    3.4 教师管理试题库系统3.4.1 程序描述本系统的所有功能模按块都必须调用“登录验证”子模块进行身份验证,此模块是所有用户进入系统时都必须调用的模块,而在验证的过程中除了要输入教师的职工号和密码外,同时还要输入验证码,让后方可通过系统用户登录界面中的【登录】按钮触发。如果错误,则显示错误的原因,比如验证码错误,如果正确的话则进入页面。接下来我们在教师的的管理界面里面可以看到有各种试题库,教师可以根据需要在里面增加试题,修改试题,删除试题,也可以重新加入一套试卷,或者删除一套试卷,同时我们也可以对试题库里面的题目进行查看,例如时间,出题人,也可以看到做题人(及学生)的班级和信息。
    3.4.2 功能登录验证功能模块的IPO表如下表所示:

    3.4.3 界面





    3.4.4 算法
    【试题修改】按钮触发的处理:进入试题修改界面;如果进行修改试题信息并确定,便对试题表中的试题信息进行修改
    【试题添加】按钮触发的处理:进入试题修改界面;如果进行添加试题信息并确定,便对试题表中的试题信息进行添加
    【试题删除】按钮触发的处理:进入试题删除界面;如果进行删除试题信息并确定,便对试题表中的试题信息进行删除
    【试卷添加】按钮触发的处理:进入试卷添加界面;如果进行添加试卷信息并确定,便对试卷表中的试卷信息进行添加
    【试卷删除】按钮触发的处理:进入试卷删除界面;如果进行删除试卷信息并确定,便对试卷表中的试卷信息进行删除
    【试卷修改】按钮触发的处理:进入试卷修改界面;如果进行修改试卷信息并确定,便对试卷表中的试卷信息进行修改
    【班级信息】按钮触发的处理:进入班级信息界面;如果进入班级信息并确定,便进入班级信息
    【试题信息】按钮触发的处理:进入试题信息界面;如果进入试题信息并确定,便进入试题信息
    【返回】返回上一层界面

    3.4.5 流程逻辑
    3.4.6 接口本模块是系统的主要输入模块模块,他需要老师成功登陆后方可进行,老师对系统的操作,将改变相应的数据库内容。
    3.4.7 限制条件至少有一名教师,以及一套试卷,试卷里面有一道题。
    3.4.8 测试计划
    初次安装系统后,测试是否可以进入教师管理试题库里面
    进入之后,查看是否可以进行试题的添加删除修改的操作,以及对试卷的添加删除修改的操作,和对班级信息的查看,以及学生的信息的查看,还有试题的信息的查看

    3.4.9 尚未解决的问题未能从其他的数据库内导入试卷和试题。
    3.5 学生考试系统3.5.1程序描述本系统的所有功能模按块都必须调用“登录验证”子模块进行身份验证,此模块是所有用户进入系统时都必须调用的模块,而在验证的过程中除了要输入学生的职工号和密码外,同时还要输入验证码,让后方可通过系统用户登录界面中的【登录】按钮触发。如果错误,则显示错误的原因,比如验证码错误,如果正确的话则进入页面。接下来我们在学生考试的管理界面里面可以看到有各种试题,学生可以根据试题选择其中的一套进行填写,填写完后可以进行提交。
    3.5.2 功能学生考试功能模块的IPO表如下表所示:

    3.5.3 界面



    3.5.4 算法点击相应试题,进入做题界面。
    处理流程

    点击相应试题进入做题界面
    填写试卷内容
    填写完试卷内容后,点击提交 ,返回界面

    3.5.5 流程逻辑
    3.5.6 接口本模块是系统的学生考试模块,需要学生成功登陆后方可使用。通过提交试题更改相应的数据库。
    3.5.7 限制条件至少有一名学生,以及一套试卷,试卷里面有一道题。
    3.5.8 测试计划
    选择多份试卷进行填写并提交,看能否提交成功
    不同的账号登陆进行填写试卷提交

    3.5.9 尚未解决的问题试卷复查,试卷批改尚未完成。
    2 评论 259 下载 2018-11-06 10:17:49 下载需要13点积分
  • 基于Haar特征的AdaBoost人头检测算法和基于Hog特征的SVM人头检测算法实现视频监控系统

    摘要传统的门禁视频监控系统一般是无法对人员进出门禁时进行人头检测,只能通过简单的硬件设施将监控画面传到后端,由监控人员人工进行监视判断。这样会加大监控成本也增加了监控人员的压力,同时也对监控人员的身体健康产生较大影响。所以就有必要设计一款新型门禁监控视频系统来实现人头检测功能,本文设计出的一款基于WPF的门禁监控视频系统,将基于Haar特征的AdaBoost人头检测算法和基于Hog特征的SVM人头检测算法进行比较,在人员进出门禁系统时进行人头检测并将检测结果以图像方式进行保存。
    基于WPF的门禁视频监控系统,采用C#与EmguCV的技术,是实现对人员出入门禁系统时进行人头检测。论文主要分析了两种算法的特征值的提取方法以及利用这两种算法进行人头检测,设计出一个可以检测人头的门禁监控视频。
    关键词:视频监控; 人头检测; C#; EmguCV; AdaBoost; SVM
    AbstractTraditional access control videosurveillance systems are generally unable to detect the head of personnelentering and leaving access only through a simple hardware facilities willspread to the rear end of the monitor screen, the monitoring personnel tomonitor artificial judgment. This will increase monitoring costs are increasingpressure monitoring personnel, it will be have a greater impact on healthmonitoring personnel of the body. Therefore it is necessary to design a newaccess control system to achieve video head detection, designed out of aWPF-based access control and video systems, will head detection algorithm basedon AdaBoost and Haar features characteristic of SVM-based Hog head detectionalgorithm comparing head detection and test results performed at the personnelaccess to the access control system to save the image mode..
    WPF-based access control videosurveillance systems, using C # and EmguCV technology is to achieve when peoplehead out access system testing. Thesis analyzes the eigenvalues extraction andthe use of these two algorithms two algorithms detect head, designed to detecta surveillance video access control head.
    Key words: Video Monitor, Head Detection,C#, EmguCV, AdaBoost, SVM
    第1章 绪 论1.1 选题背景和意义随着视频监控技术的迅速发展与设备成本的不断下降,视频监控已经遍布于城市的各个角落成为了一种重要的视频信息来源。目前,视频监控系统在银行的安全防范、道路的交通管理、公安刑事侦查等特殊领域已经发挥了及其重要的重用。由于上述领域对于实用的监控视频采集、处理与分析技术和应用表现了十分迫切的需求,各类监控视频信息处理相关的基础理论研究与应用系统的设计开发也越来越受到政府、科研院以及公司的重视。
    目前使用的监控系统系统大多只具有录像功能,因此只能提供事后查询,并不能对当时情况作出及时判断并提出警告,例如门禁监控,传统的门禁系统往往将门禁前的视频图像发到视频墙上,由人工监视什么时间人员可以进出,进出是否刷卡,是否有异常情况发生。所以有很多不足产生:

    工作强度大,持续时间长,容易对负责浏览视频的工作人员的视觉会造成很大的影响,危害身体健康。监控成本上,人力成本的持续投入使得成本不断增加。长时间高强度、高压力的工作状态下,负责视频浏览的工作人员注意力难以集中,容易出现一些重要信息的遗漏和误判现象。门禁系统刷卡与视频无关联,在突发情况下,监控人员很难判断出发生的原因。
    为了解决现阶段门禁的不足。本文设计出基于门禁的视频监控软件系统,在本系统中实现了门禁硬件与视频监控的交互。减轻监控人员的负担,记录异常情况的发生和截图。
    1.2 视频监控研究现状目前美国以及欧洲地区等西方先进国家仍然掌握着大部分智能视频监控系统的核心算法技术,在国际市场上的智能视频监控系统中占据很大的优势。美国国防部高级研究项目署(Defense advanced research projects agency , DARPA)于1997年建立了视觉监控重大项目VSAM(Visualsurveillance and monitoring),该项目对用于民用场景和战场中视频监控的自动理解技术进行了重点研究。马里兰大学研发成功的实时视频监控系统W4主要任务是是被监控场景中的行人,将形状分析和目标跟踪技术相结合,对人的外表进行模型构建。高级研究计划VACE(Video Analysis and Content Extraction)于2003年由美国ARDA机构开始主持。在对车辆和行人的跟踪及其交互作用识别的相关研究方面上,英国雷丁大学(University of Reading)取得了一系列的研究成果。IBM 公司于 2006 年 11月 7 日宣布已开发并销售一款用于分析视频实时监控系统的安全软件—智能监控系统(S3:Smart Surveillance System),它能够将视频摄像头捕捉到的信息通过计算机网络传递到整个系统软件上,发现监控环境中的潜在安全隐患并自动报警以色列也在智能视频监控领域取得了很大的研究成果,他们的产品主要用在边界不含以及商业调查分析领域[7]-[8]。
    在对智能视觉监控领域的研究方面,国内起步比较晚,目前,中国科学院自动化研究所模式识别国家重点实验室在国内的研究机构中处于领先地位,取得了一系列研究成果。除此之外,国内还有一些高校也在这一领域投入了相当的研究精力,如上海交通大学、清华大学、华中科技大学、北京航空航天大学、北京理工大学等[3]。中国科学院自动化研究所模式识别国家重点实验室已经成立了智能视频监控研究小组,正在开展智能视频监控方面的研究,研究内容包括:快速准确的运动检测,实时性、鲁棒性的基于三维模型的车辆与行人的定位、识别和跟踪,基于移动摄像机的视觉监控技术,多摄像机的协作监控,事件的机器学习方法,异常现象的检测、报警与目标的行为预测,对目标运动情况给出语义上的解释的方法以及远距离的身份识别等等。目前视觉监控研究组针对目前交通管制中大量人力和物力资源的浪费,提出了一种基于三维模型的交通监控系统,采用了基于三维线框模型的车辆定位算法和基于改进的扩展卡尔曼滤波的车辆跟踪算法;研究组在自主研发的交通场景模拟平台上最终实现了交通监控原型系统等。
    1.3 本文研究内容和章节安排本文将监控视频作为研究对象,基于监控视频本身的特点,对监控视频摘要技术进行了研究。在门禁视频监控中,分析人进出门禁的情况,并进行统计某一时刻进出人员数量。
    基于以上工作,将本文安排为四章,具体如下:
    1.绪论
    简单介绍视频监控系统的研究背景,意义以及视频监控系统的现状和发展趋势,总结前人的基础上,结合项目实际应用阐述本论文的主要工作。
    2.视频监控中的关键技术
    本章主要介绍了视频监控系统中应用到的一些关键技术,例如EmguCV图像处理、人头检测技术中的AdaBoost和SVM技术、C#编程其中的WPF编程技术、目标跟踪[9]-[10]等。
    3.人头检测算法的实现
    本章主要介绍了人头检测中所用到的两个算法,即基于Haar特征的AdaBoost人头检测算法和基于Hog特征的SVM人头检测算法,以及如何生成特征数据和利用特征数据进行检测。
    4.视频监控系统软件设计与实现
    本章主要从系统的需求分析开始。分析系统的需求,提出需要的功能,然后进行概要设计,划分出功能模块,与各个功能模块之间的接口,从而进行系统各模块的详细设计,在进行类图的设计最终完成各个功能实现本系统的开发
    5.实验结果对比分析
    对系统中所使用的AdaBoost算法和SVM人头检测算法进行分析比较,得出各个算法的优势和劣势,从而为后期的系统优化做好准备。
    第2章 视频监控系统中的关键技术2.1 图像处理技术图像处理(Image Processing),用计算机对图像进行分析,已达到所需结果的技术。又称影像处理。图像处理一般指数字图像处理。数字图像是指用工业相机、摄像机、扫描仪等设备经过拍摄得到的一个大的二维数组,该数组的元素称为像素,其值称为灰度值。图像处理技术一般包括图像压缩,增强和复原,匹配、描述和识别3个部分。
    OpenCV[4]( Open Source Computer Vision Library)是一个基于(开源)发行的跨平台计算机视觉库,由一系列C函数和少年C++类构成,可以运行在Linux、Windows和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
    由于门禁视频监控系统在.NET平台下实现,不能直接运行C/C++类库,所以需要对OpenCV进行封装,所以在本论文中使用了EmguCV。
    EmguCV是.NET平台下对OpenCV图像处理库的封装。也就是OpenCV的.NET版。它运行在.NET兼容的编程语言下调用OpenCV的函数,如C#等。
    2.2 WPFWPF(Windows Presentation Foundation)是微软推出的基于Windows Vista的永华界面框架,属于.NETFramework3.0的一部分。它提供了统一的编程模型(MVVM模型)、语言和框架,真正做到了分离界面设计人员与开发人员的工作;同时它提供了全新的多媒体交互用户图形界面。
    WPF具有强大的数据绑定功能,存储和访问数据由Microsoft SQL Server和ADO.NET之类的技术提供,涉及两个步骤:

    将数据从托管对象复制到控件中,在控件上可以显示和编辑数据。
    确保将使用控件对数据进行的更改复制回托管对象。

    为了简化应用程序开发,WPF 提供了一个数据绑定引擎以自动执行这些步骤。数据绑定引擎的核心单元是Binding 类,它的任务是将控件(绑定目标)绑定到数据对象(绑定源),关系如图2-1所示:

    WPF 主要编程模型是通过托管代码公开的。在 WPF 的早期设计阶段,曾有过大量关于如何界定系统的托管组件和非托管组件的争论。CLR 提供一系列的功能,可以令开发效率更高并且更加可靠(包括内存管理、错误处理和常规类型系统等),但这是需要付出代价的。图2-2说明了WPF 的主要组件.关系图的红色部分(PresentationFramework、PresentationCore 和 milcore)是 WPF 的主要代码部分。 在这些组件中,只有一个是非托管组件–milcore。
    milcore是以非托管代码编写的,目的是实现与DirectX 的紧密集成。WPF 中的所有显示都是通过DirectX 引擎完成的,因此硬件和软件呈现都很高效,WPF 还要求对内存和执行进行精细控制,milcore 中的组合引擎受性能影响关系大,需要放弃 CLR 的许多优点来提高性能。

    2.3 人头检测技术人头检测,就是把视频监控图像中出现的人物的人头目标从视频中检测出来,目标提取,就是当人头检测算法检测到了视频里面有人头目标时,就把这个目标从视频中分割出来,为我们下一步进行目标统计提供数据支持。
    基于人体检测的统计方法可以实现人与人间距较大,并且没有遮挡情况下的统计目的,但是在实际中,由于人员的无序性,以上的情况基本上不会出现,很难做到对每个人员的计数,所以就要减少由这些问题引起的误差,我们就需要选取合适的目标作为计数对象,而不论人员的多少,人的头都是不会被遮挡住的,所以人头作为我们的统计目标,能够最大化的降低误差。
    人头检测时现在具有较高的理论研究课题,同样具有较高的实际应用价值,随着研究人员的不断研究,新的检测方法也在不断的出现。从总体来看主要还是分两大类,即基于知识的方法和基于统计学习的方法。
    基于知识的学习放大的人头检测时通过一定的先验知识(如肤色、颜色、形状等)描述人头区域,并且根据这些规则去判断一个区域是否包含有人头区域。模板匹配则是典型的基于知识理论的检测方法,该方法通过利用模板对是否是人头区域进行描述,以及包括颜色、形状以及其他的组合。Viecente等人则是用形状作为模板[14],首先是假定人头全部是由俯视得到的图喜爱那个并且大致为圆形,然后把人头轮廓通过Hough变换以后再与标准圆形模板进行匹配,最后时限了人头检测和定位。而Jin等人则是采用边缘检测和椭圆形状匹配相结合,就是把人头作为类似椭圆的目标,首先要对视频中移动目标进行运动检测,提取运动物体边缘轮廓,并在轮廓图像上根据一定的宽高比进行椭圆匹配[11],获得人头区域。
    当前,人头检测主要采用统计模式识别的方法,分别为基于统计的特征抽取和基于特征统计的分类。AdaBoost算法作为统计学习方法中的一种,由Freund等人与1996年提出,算法的最初是想是基于弱学习模型,该模型假设存在一种弱学习算法经过训练获得若干个弱分类器,通过对弱分类器进行组合可以获得任意高精度的分类器。AdaBoost训练需要事先确定待选特征库,训练过程就是从待选特征库中挑选最具备分类能力的特征。目前常用的特征提取方法主要有Haar特征,并结合积分图进行求取。支持向量机(Support Vector Machine,SVM)是建立在统计学习理论的VC维理论和结构风险最小原理基础上的,根据有限的样本在模型的复杂性(即对特定训练样本的学习精度,Accuracy)和学习能力(即无错误地识别任意样本的能力)之间寻求最佳折中,以获取最好的推广能力。
    具体实现过程请见下一章节。
    2.4 门禁视频监控系统工作流程门禁视频监控系统监控过程中,人头检测可以采用AdaBoost检测算法,也可采用SVM检测算法,虽然算法不同,但检测结果几乎接近。系统的工作包括以下几步:
    1.预处理
    主要包括视频图像的加载、解析。
    2.加载样本数据
    加载人头的样本数据,为检测做好准备
    3.进行人头模板检测
    与样本数据进行模板匹配,获取视频图像中的人头
    4.人头校验
    对检测到的人头进行校验,去除误检。
    5.进行跟踪
    对检测到的人头进行跟踪。
    图2.3给出了门禁监控视频的大致流程

    2.5 本章小结门禁视频监控的实现是建立在许多技术基础之上,本章主要介绍一些关键技术,例如使用Emgucv/OpenCV图像处理库,可以更方便的进行图像处理;如何生成样本数据以及使用模板匹配进行人头检测,可以快速检测出人头;使用WPF进行界面设计使代码与界面分离,减少耦合度;使用面向对象的编程技术,可以快速开发、减轻开发人员的压力。WPF其实不仅仅是图形引擎而已,它将给Windows应用程序的开发带来一次革命,因为新的架构提供了一种全新的开发模式。对于开发人员而言,界面显示和代码将更好的得到分离,这与从前的桌面应用程序开发有很多不同(界面设置和代码是融合在一起的),这是比较具有革命性的改变之一。
    第3章 人头检测算法实现3.1 分类器设计原理机器学习的目的是把数据转换成信息。在学习了一系列数据之后,我们需要机器能够回答和对这些数据进行分析,最终获取我们所需要的数据。及其学习会从很多样本数据中获取特征,并且作为数据库,根据分类规则对这些特征进行学习,而最后生成的模型就是我们所要获得分类器。
    3.2 基于Haar特征点的AdaBoost人头检测算法3.2.1 AdaBoostAdaBoost是一种基于级联分类模型的分类器。级联分类模型可以用下图表示:

    级联分类器:级联分类器就是将多个强分类器连接在一起进行操作。每一个强分类器都由若干个弱分类器加权组成。
    3.2.2 算法描述人头检测可视为一个两类分类问题,其中一类为人头(正样本),另一类为非人头(负样本),假设 AdaBoost 学习算法的输入为训练样本集

    其中,xi表示第i个训练样本,yi表示样本类别,且yi属于(+1, -1),+1表示正样本,−1表示负样本。因此,对于每个样本,在训练过程中都事先知道其样本类型,以便对算法做出的预测正确与否进行判断。
    在算法训练阶段,首先对每个样本赋予相同的初始权重W,之后进行K轮训练,并且在每轮训练结束后根据当前分类结果调整训练样本的权重,减小正确分类样本的权重,同时增加错误分类样本的权重,从而使每个弱分类器主要围绕难以正确分类的样本进行学习。经过K 轮训练得到一个由K 个弱分类器(每个弱分类器对应一个特征)组成的弱分类器序列

    其中,hi表示第i个弱分类器,ai为弱分类器的加权系数。最后对K个弱分类器进行组合,得到最终的强分类器H。虽然每个弱分类器hi的分类预测能力只比随机稍好,但通过对K个弱分类器进行组合,能够使强分类器H获得任意高的精度。
    AdaBoost 算法流程如图3-2所示。算法主要由离线训练和在线检测两部分组成,在训练阶段首先对正负样本进行训练,从特征库中选取最优特征并组合成强分类器,在检测阶段,用训练好的分类器对各个待检测窗口进行检测。

    3.3 基于Hog特征点的SVM人头检测算法3.3.1 SVM支持向量机SVM是从线性可分情况下的最优分类面提出的。所谓最优分类,就是要求分类线不但能够将两类无错误的分开,而且两类之间的分类间隔最大,前者是保证经验风险最小(为0),而通过后面的讨论我们看到,使分类间隔最大实际上就是使得推广性中的置信范围最小。推广到高维空间,最优分类线就成为最优分类面。
    支持向量机是利用分类间隔的思想进行训练的,它依赖于对数据的预处理,即,在更高维的空间表达原始模式。通过适当的到一个足够高维的非线性映射,分别属于两类的原始数据就能够被一个超平面来分隔。如下图3-3所示:

    空心点和实心点分别代表两个不同的类,H为将两类没有错误的区分开的分类面,同时,它也是一个最优的分类面。原因正如前面所述,当以H为分类面时,分类间隔最大,误差最小。而这里的H1·H2之间的距离margin就是两类之间的分类间隔。支持向量机将数据从原始空间映射到高维空间的目的就是找到一个最优的分类面从而使得分类间隔margin最大。而那些定义最优分类超平面的训练样本,也就是上图中过H1·H2的空心点和实心点,就是支持向量机理论中所说的支持向量。显然,所谓支持向量其实就是最难被分类的那些向量,然而,从另一个角度来看,它们同时也是对求解分类任务最有价值的模式。
    支持向量机的基本思想可以概括为:首先通过非线性变换将输入空间变换到一个高维空间,然后在这个新空间中求取最优线性分类面,而这种非线性变换是通过定义适当的内积函数来实现的。支持向量机求得的分类函数形式上类似于一个神经网络,其输出是若干中间层节点的线性组合,而每一个中间层节点对应于输入样本与一个支持向量的内积,因此也被叫做支持向量网络。如图3-4所示:

    由于最终的判别函数中实际只包含于支持向量的内积和求和,因此判别分类的计算复杂度取决于支持向量的个数。
    不难发现,支持向量机作为统计学习理论中的经典代表使用了与传统方法完全不同的思路,即不是像传统方法那样首先试图将原输入空间降维(即特征选择和特征变换),而是设法将输入空间升维,以求在高维空间中问题变得线性可分或接近线性可分。因为升维知识改变了内积运算,并没有使得算法的复杂性随着维数的增加而增加,而且在高维空间中的推广能力并不受到维数的影响。
    3.3.2 算法描述假设训练样本集为其中xi表示第i个样本,n为样本数,yi属于(-1, +1)为类别标志。对线性和非线性的情况如下:
    1.线性SVM
    如存在分类超平面方程:

    满足

    则认为训练样本集是可分的。其中,<W·Xi>为向量W与Xi的内积。
    SVM 算法就是在这种线性可分情况下寻找最优分类面。如果一个分类面不但能将两类样本无错误地分开,并且到两类中离该分类面最近样本点的距离最大,则这个分类面就是最优分类面,如图3-5 所示。

    从以上分析可知,线性判别函数的一般形式为g(X)=W·X+b,若W为权重向量,且假设最小函数间隔为1,即在正样本点X+和负样本点X-上使函数间隔为1,即对于离分类面最近且平行于最优分类面上的样本点满足:

    则分类间隔为:

    其中,为向量的几何范式。这样,在两类中所有样本都满足,则最优分类超平面满足:

    而求解最优分类超平面需要最大化分类间隔2/||W||2,则问题转化为:

    但是,当两类分类数据不能完全线性分开时,最大间隔将是负数。因此需要对式3-7的约束条件进行调整:

    其中,C为惩罚系数,C越大表示对错误分类的惩罚越大。根据拉格朗日乘子算法,有:

    其中,ai>=0、Bi>=0为拉格朗日乘子。
    对W,ξ ,b求偏导,并置0,有:

    将式3-10带入式3-9中,得到:

    式中,0<=ai<=C对应标准支持向量(Normal Support Vector,NSV),ai=C对应边界支持向量。由Kaeush-Kuhn-Tucker条件,在最优点,有:

    结合式(9)-(11)可计算出阀值参数b为

    假设共存在Nnsv个标准支持向量,则为了提高计算的准确性,对每个标准支持向量分别计算b,并取均值,从而得到最终阀值b为:

    2.非线性SVM
    非线性 SVM 与线性 SVM 的区别在于,非线性 SVM 是通过一个非线性函数将样本X映射到一个高维线性特征空间,并在这个空间中构造最优分类超平面,并得到分类器。因此在该情况下,分类超平面为

    判别函数为:

    最优分类超平面问题描述为

    得到的对偶最优化问题为:

    其中,K(Xi, Xj)为核函数,判别式为

    其中,阀值为

    3.4 视频图像及样本采集及训练流程1.样本采集
    进行人头训练与检测需要大量的视频序列和训练样本。本文视频序列部分源自实际监控录像,部分采用Kinect拍摄,人头样本由手工截取,选择不同背景下的不同行人,并截取2000余张,人头样本一千余张,负样本为不包含人头的背景图片随机产生。为了方便训练,所有样本均归一化到相同尺度,本文为20x24像素大小。人头正、负样本示例如图3-6和图3-7所示。

    2.训练流程
    本论文训练人头的流程如下:

    准备训练样本集合;包括正样本集和负样本集;根据机器学习的基础知识我们知道,要利用机器学习算法进行样本训练,从而得到一个性能优良的分类器,训练样本应该是无限多的,而且训练样本应该覆盖实际应用过程中可能发生的各种情况。实际应用过程中,训练样本不可能无限多,本次使用了一千个正样本,一千个负样本收集到足够的训练样本之后,需要手动裁剪样本。本人使用的方法为利用收集到门禁视频行人进出大门的的视频作为训练样本集合,写个了简单程序,只需要鼠标框选一下,就将框选区域保存下来。裁剪得到训练样本之后,将所有正样本放在一个文件夹中;将所有负样本放在另一个文件夹中;并将所有训练样本缩放到同样的尺寸大小。OpenCV自带的例子在训练时,就是将样本缩放为64*128进行训练的;提取所有正样本的Hog特征;(提取所有负样本的Hog特征;对所有正负样本赋予样本标签;例如,所有正样本标记为1,所有负样本标记为0;将正负样本的Hog特征,正负样本的标签,都输入到SVM中进行训练;采用线性SVM进行训练。SVM训练之后,将结果保存为文本文件。这样就可以利用训练样本训练出来的分类器进行人头检测了。
    其中在AdaBoost特征选取上,考虑到人头普遍位于样本的中心位置,因此特征在样本中的位置进行一定的限制,使特征的各个子窗口不落在样本的四个角上,如图3-8所示,在生成特征库时,限制矩阵梯度和自生长梯度特征各特征子窗口全部位于图中的椭圆内,采用该方法一面可以尽可能减少背景梯度对特征形成的干扰,另一方面可以减少特征库的规模,提高训练速度。

    由于SVM算法是针对有限样本进行训练,参与训练的样本数不亦过大,否则会使训练变慢甚至无法完成。因此,本文在AdaBoost人头样本中随机挑选了四分之一,作为SVM训练的正样本,负样本由背景图随机产生,进行聚类。
    第4章 视频监控系统设计与实现4.1 视频监控系统的需求分析门禁软件已经广泛使用在企事业单位、工厂、公司等办公场所,职员,工人佩带名牌进入办公地点,通过名牌对出入口通道进行管制的功能对单位的组织纪律,以及安防都非常有帮助。
    目前很多的门禁软件会加上对出入口通道视频监控来进一步进行监控,来对出入口通道进行更好的监控,传统的门禁系统一般是无法实现门禁和视频在软件层面联动的,只能通过简单的硬件连接看到现场的实时监控录像,而视频门禁系统则可以在人员进出门禁时,联动视频监控系统对现场的照片和录像进行抓拍进行人头检测并保存在门禁服务器中,同时还可以及时在软件界面上弹出对应的现场监控画面。这样不仅让照片、录像和对应的门点事件绑定在一起,可以随时通过查询将现场情况进行再现,还可以确保系统内的警情得到及时确认和处理。
    4.1.1 系统目标系统开发的主要目标是能够针对上述问题,利用图像处理,目标检测与跟踪,相机标定,透视投影变换等理论知识,设计出对视频图像进行处理的算法,来达到对视频中人员人头的检测并进行统计图片保存,同时兼顾先进性、可靠性、安全性、经济型、可扩充性、可维护性和规范性做到一切应从实际出发,使监控系统具有较高的实用效能。本系统操作简单便捷,监控人员不需要经过严格复杂的培训技能即可上手使用。
    4.1.2 功能需求为了使用者能够方便使用此系统,系统功能还将包括辅助系统和效果显示系统。系统用例图如图4-1所示。

    辅助系统主要包括选择视频源,启用/禁用视频检测,视频检测算法,显示视频图像。用例图如图4-2所示。

    在显示系统中,主要是显示未开启检测的视频图像和开启视频的视频图像,以及保存图像。图4-3显示了系统的基本用例。

    4.1.3 功能分配根据功能需求部分所描述出的系统用例图,画出该系统主要功能,如下表3-1所示。



    模块
    详细功能




    辅助系统模块
    辅助模块主要处理人头检测之前的操作。例如选择视频源,开启视频检测,添加/删除视频源等功能


    人头检测模块
    通过AdaBoost算法或者SVM算法,进行人头检测,将检测到的数据再次进行分析,筛选符合的人头


    显示模块
    将检测到符合的人头在图像上进行显示,提供保存图像等操作



    4.1.4 性能需求1.精度
    在显示检测图像中,人头检测错误率不超过2个。
    2.时间
    本门禁视频监控系统视频延迟时间在2秒内。
    3.系统灵活性
    本系统具有可扩充性,可维护性和规范性。
    4.2 系统开发环境介绍1.硬件环境
    本系统对计算机硬件要求不高,处理器基于X86或X64指令集均可,摄像头最低可为低解330线,拍摄画面清晰,没有用肉眼不可分辨的事物。
    2.软件平台
    此系统主要运行在Windows操作系统下,推荐Windows XP及其以上版本。因为Windows XP系统兼容性,对新技术。新产品都有良好支持,是设计开发人员常用的操作系统。另外,Windows XP系统集成了微软的防火墙技术,保障了用户计算机使用安全。
    3.开发环境
    Windows平台下选择Microsoft Visual Studio 2013开发工具,它是目前最流行windows平台应用程序开发环境[2]。Visual Studio 2013是一个基本完善的开发工具集它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等。所写的目标代码适用于微软支持的所有平台,包括Microsoft Windows、Windows Mobile、Windows CE、.NET Framework、.NET Compact Framework和Microsoft Silverlight及Windows Phone。
    Visual Studio是目前最流行的Windows平台应用程序的集成开发环境。Visual studio 2013具有功能全面,灵活性好,效率高,深入底层的优点。另外,VisualStudio 2013具有MFCAppWizard/Class Wizard等功能强大的编程向导工具,在很大程度上简化了应用程序的开发,也提高了编程效率。VisualStudio 2013自然是本项目开发的首选。
    4.3 系统概要设计4.3.1 总体设计系统大体分为3个模块,包括辅助模块、人头检测模块和显示视频图像模块,如图4-4所示

    4.3.2 辅助模块设计辅助系统模块其结果如图4-5所示:

    主要完成任务有:

    选择人头检测算法:在 WPF中下拉框中选取一种作为接下来的视频图像检测算法。可以选择的检测算法有:SVM 人头检测算法和AdaBoost检测算法。如果不选择,默认为AdaBoost检测算法选择视频播放源:在WPF中的TreeView控件中对视频进行选择,左键选中视频名称前的复选框,则会获取在后台数据库中存放的对应视频名的视频路径,从而打开该视频,并在视频信息显示框中显示视频名称以及视频路径。视频源的添加和删除:在WPF中TreeView控件中进行右键操作,会出现添加视频源和删除视频源的功能,在添加视频源功能中,使用者只需添加视频所位于的根节点以及视频名、视频路径即可。在删除视频源的功能中,使用者只需选择视频位于的根节点以及视频名即可。
    4.3.3 人头检测模块系统核心的匹配人头检测模板结构如图4-6所示

    此模块主要完成任务有:

    AdaBoost人头检测:加载人头信息的样本库,将图像进行均衡化,然后进行人头模板匹配。得到匹配后的人头位置。SVM人头检测:加载人头矩阵的信息样本,进行人头模板检测,得到匹配的人头位置。
    4.3.4 显示模块显示模板主要是(1)开启视频检测后显示人头检测后的视频图像,(2)未开启视频检测后视频图像。其主要结构如图4-7所示

    该模块只要实现图像的显示和保存操作。显示图像直接利用EmguCV中的ImageBox控件来实现,保存图像默认保存格式为png,用户只需要在C:data\pic下找到对应的图像文件即可,操作简单容易上手。
    4.3.5 接口设计1.外部接口设计
    系统外部接口主要实现系统输入射出设备,例如鼠标,键盘事件的响应。系统利用WPF(Windows Presentation Foundation),设计相应对待鼠标、键盘监听响应程序。
    2.内部接口设计
    内部接口设计主要实现各个子系统之间的数据流的处理
    系统首先由用户在辅助系统选择待播放视频和人头检测算法开始,根据显示的已选择视频文件的视频路径,进行播放视频,如果使用者开始视频检测算法,辅助模块会将选择的视频检测算法传递到检测模块,在这里,所有的视频了图像将获得该算法下最大程度的人头检测。待人头检测完成后,人头检测模块会将检测好的视频图像传递给显示模块显示图像和检测信息以及提示保存图片信息。其数据流向如图4-8所示。

    4.3.6 维护设计系统各模块相互独立,减轻了许多维护升级上的麻烦,只需要在制定模块中作出改动,而不会影响其他模块的正常使用。
    4.4 系统详细设计4.4.1 辅助功能模块详细设计辅助功能模块主要操作是选择待播放视频,添加视频,删除视频以及选择人头检测算法。
    添加播放视频功能中,视频格式为“AVI”或者“WMV”视频文件。主要方法及功能如表4-2所示:



    方法名
    功能




    void menuSelectAllChild_Click(object sender, RoutedEventArgs e)
    选中所有子项菜单事件


    void menuExpandAll_Click(object sender, RoutedEventArgs e)
    全部展开菜单事件


    void menuUnExpandAll_Click(object sender, RoutedEventArgs e)
    全部折叠菜单事件


    void menuSelectAll_Click(object sender, RoutedEventArgs e)
    全部选中事件


    void menuUnSelectAll_Click(object sender, RoutedEventArgs e)
    全部取消选中


    void TreeViewItem_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
    鼠标右键事件


    void TreeViewItem_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    鼠标左键事件


    int ChildrenSelectNum(MonitorCameraTreeModel model)
    获取子项选中的数量


    void menuAddItem_Click(object sender, RoutedEventArgs e)
    点击添加视频文件


    void menuRemoveItem_Click(object sender, RoutedEventArgs e)
    点击删除视频文件



    4.4.2 人头检测模块详细设计AdaBoost模板检测主要利用人头样本进行检测,SVM模板检测主要利用人头样本矩阵数据进行人头检测。其主要方法和功能如下表4-3所示:



    方法
    功能




    MDeteInfo GetAdaBoostHead(Image\<Bgr, Byte\> image)
    进行AdaBoost算法人头检测


    float[] GetData()
    获取样本数据


    MDeteInfo GetSVMHead(Image\<Bgr, Byte\> image)
    进行SVM算法人头检测


    bool StroageImage(Image\<Bgr,Byte\> image)
    保存图片



    4.4.3 各部分类图1.程序基于面向对象实现设计,其类图为:

    详细描述如下:



    方法名
    功能




    void PlayVideoInvoke (MonitorCameraTreeModel model)
    播放视频委托


    dTimer_Tick(object sender, EventArgs e)
    定时器委托


    void CloseVideoInvoke(MonitorCameraTreeModel model)
    关闭视频委托


    void PlayVideo(MonitorCameraTreeModel model)
    播放视频


    void DisplayPic(string picPath)
    显示图片


    void CloseVideo(Video _video)
    关闭视频


    Window_Loaded(object sender, RoutedEventArgs e)
    加载窗体时激发


    InitImageBox()
    初始化ImageBox


    void InitBackgroundworker()
    初始化backgroundworker


    void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    报告进度


    backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    操作完成、取消、异常时执行的操作


    backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    调用RunWorkerAsync时发生


    TvTestDataBind()
    数据绑定


    Window_Closed(object sender, EventArgs e)
    窗口关闭


    void OpenCheckedClick(object sender, RoutedEventArgs e)
    点击开启检测


    DisplayMessage(string message)
    显示操作消息


    void ShowDeteInfo(string info)
    检测信息显示



    2.显示结果类图

    3.进行人头检测类图

    4.5 系统实现4.5.1 辅助功能模块实现辅助功能模块包括视频源的加载,选择视频后播放视频、视频添加/删除的功能, 在视频播放功能上,首先需要从视频数据源中获取,本系统中,使用xml文件来存储视频源数据,使用XmlDocument类即可实现对Xml数据的访问以及添加数据删除数据等等功能。其部分代码如下:
    1.遍历xml节点
    // 将节点转换为元素,便于得到节点的属性值XmlElement xe = (XmlElement)xnl;// 得到Book节点的所有子节点XmlNodeList xnl0 = xe.ChildNodes;camerModel.Name = xnl0.Item(0).InnerText;camerModel.IsChecked = Convert.ToBoolean(xnl0.Item(2).InnerText);camerModel.IsExpanded = Convert.ToBoolean(xnl0.Item(3).InnerText);
    2.添加一个视频(节点)
    // 建立一个节点XmlElement newTreeModel = doc.CreateElement("children");XmlElement chilId = doc.CreateElement("childId");chilId.InnerText = model.ChildId;XmlElement name = doc.CreateElement("childName");name.InnerText = model.ChildName;XmlElement videoPath = doc.CreateElement("videopath");videoPath.InnerText = model.Videopath;newTreeModel.AppendChild(chilId);newTreeModel.AppendChild(name);newTreeModel.AppendChild(videoPath);xnFnodel.AppendChild(newTreeModel);
    3.删除视频(删除节点)
    foreach (var xmlNode in xmlNodeList){ XmlElement xe1 = (XmlElement)xmlNode; XmlNodeList xnl3 = xe1.ChildNodes; if (xnl3.Item(1).InnerText == model.ChildName) { xe1.ParentNode.RemoveChild(xe1); }}
    4.5.2 人头检测实现在人头功能检测中,我们需要加载人头数据,而人头数据则是利用上面提及的AdaBoost算法和SVM级联器生成的人头样本数据,在这里我们需要加载这些人头样本数据。首先需要加载人头数据:
    1.AdaBoost样本数据加载
    在C盘data文件夹下的cascades包含了人头样本数据,使用har分类器加载数据,其代码如下:
    HaarCascade cascade = newHaarCascade(@"C:\data\cascades.xml");
    2.SVM样本数据加载
    同样,在C盘data目录文件夹下有个HogDetector.txt,里面包含目标检测的图像特征-HOG特征,使用HOGDescriptor提取特征并进行训练,其代码如下:
    if (hog == null){ Size winSize = new Size(64,64); Size blockSize = new Size(16, 16); Size blockStride = new Size(8, 8); Size winStride = new Size(8, 8); Size cellSize = new Size(8, 8); int nbins = 9; hog = new HOGDescriptor(winSize, blockSize, blockStride, cellSize, nbins, 1, 1, 0.2, true); float[] data = GetData(); hog.SetSVMDetector(data);}
    而GetData()方法实现则为加载人头样本数据,因为SVM级联生成的为txt数据,所以需要进行文件读取,C#可以利用StreamReader类进行文本的访问,使用该类中的EndOfStream属性判断是否读取结束,这样就可以访问txt数据了。获取数据代码如下:
    var line = reader.ReadLine().Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);var arr = new float[line.Length];for (var i = 0; i < line.Length; i++){ arr[i] = (float)Convert.ToDouble(line[i]); //将数据转换为float类型 data.Add(arr[i]);}
    人头检测的实现由两种方式:
    (1) 使用AdaBoost算法进行人头检测
    在加载完AdaBoost所需的样本数据后,将图像进行灰度化和均衡化,并利用EmguCV中的DetectHaarCascade方法进行目标检测,其主要代码如下:
    double scale = 1.3;Image<Bgr, Byte> smallframe = image.Resize(1 / scale, Emgu.CV.CvEnum.INTER.CV_INTER_LINEAR); //重新设置图片大小Image<Gray, Byte> gray = smallframe.Convert<Gray, Byte>(); //获取灰度图像gray._EqualizeHist(); //均衡化// 开始进行检测MCvAvgComp[][] faceDetected = gray.DetectHaarCascade( cascade, 1.1, 2, Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new Size(30, 30));int count = 0;// 检测到的目标显示到图像上foreach (var item in faceDetected[0]){ count++; image.Draw(item.rect, new Bgr(Color.Red), 3);}model.Frame = image;model.HeadCount = count;
    (2) 使用SVM算法进行人头检测。
    利用前面获取的样本数据,利用EmguCV中HOGDescriptor对象进行目标检测。其主要过程为(1)提取Hog特征,(2)调用其DetectMultiScale方法获取检测目标,其主要代码如下:
    Rectangle roiRect = new Rectangle(144, 206, 406, 360);Rectangle[] rectangle = Hog.DetectMultiScale(image);if (rectangle.Length > 0){ Rectangle temp = new Rectangle(); bool pushFlag; foreach (var item in rectangle) { image.Draw(item, new Bgr(Color.Red), 3); }}
    4.6 系统效果演示系统主窗体如图4-15所示:

    系统未开启视频检测时运行界面如图4-16所示:

    系统开启AdaBoost检测算法如图4-17所示:

    系统开启SVM检测算法如图4-18所示:

    系统添加视频源如图4-19所示:

    系统删除视频源如图4-20所示:

    4.7 本章小结本章从系统整体需求出发,得出系统所需的功能,进而设计出各个模块,然后再是各个类来实现各个模块,以及各个类模块的主要实现代码最终实现了满足需求门禁视频监控系统。在进行人头检测中,分别采用了AdaBoost人头检测算法和SVM人头检测算法,并对两个算法进行了比较,在下章会详细介绍两个算法之间的区别。在本章第6小结,还进行了系统效果演示,对门禁视频监控系统了更加深刻的认识。
    第5章 实验结果对比分析5.1 AdaBoost和SVM算法效果对比采用AdaBoost检测算法,针对第一组测试视频时,其测试结果如图5-1所示,采用SVM检测算法,针对第一组图像,其检测结果如图5-2所示,两幅图片一对比,可以很明显的看出,在监控图像不是很清晰时,由于周边环境不是很明亮时,AdaBoost检测算法存在很大的错误检测。使用SVM检测能够准确检测出人头。但在光线明亮的环境中,如图5-3所示,在光线明亮下AdaBoost检测结果,图5-4在光线明亮下SVM检测结果,很显然AdaBoost也存在很大的错误检测,而SVM虽然检测出了人头,但是也出现了检测数量不对,存在少检测情况。



    AdaBoost检测结果
    SVM检测结果








    AdaBoost检测结果
    SVM检测结果







    通过上面几幅图片可以看出,AdaBoost算法的检测正确结果没有SVM算法检测正确结果高原因在于:

    虽然本次使用了2000余张样本图像,但还是样本图像过少,使得建立出的样本数据过少,在后面进行特征提取时,不能全面获取所有数据,导致检测结果不准确,从而影响检测质量本次选取的特征样本正样本和负样本数量几乎一样多,导致加大了被误判样本的权值,在训练过程中,每次迭代都会对那些分类错误的样本进行加权,但多个这样的样本多次分类错误过后,他们的权重过大,进行左右误差的计算和分类器的挑选,使分类器的精度下降,出现典型的“退化问题”[12]。
    5.2 结论分析本系统采用了AdaBoost人头检测算法和SVM人头检测算法,显然基于SVM算法的人头检测比简单的AdaBoost人头检测算法精度要高,SVM算法略占优势。虽然在AdaBoost检测算法上出现很多不足,但为后期的算法优化作出铺垫。
    总 结论文是在分析了人头检测算法的基础上完成的,主要任务是利用监控摄像头获取监控视频,然后利用图像处理的相关算法,特别事人头检测算法的是实现,以及利用检测算法完成人头目标检测。通过阅读大量文献,研究与实验,选择了基于Haar特征点的AdaBoost算法和基于Hog特征点的SVM算法来实现人头的检测,同时对AdaBoost算法和SVM算法作了对比,具体有:

    论文详细论述了基于统计学的图像处理技术,尤其是基于Haar特征点的AdaBoost和基于Hog特征点的SVM算法的原理和实现。从理论上说明了AdaBoost和SVM人头检测算法的可行性和正确性,并在系统实现了部分,利用C#和EmguCV对着两种算法进行了实现。但根据随后的结果分析,可以看出SVM算法的精度是基本令人满意的,SVM人头检测算法比AdaBoost人头检测算法更加出色。采用模块化对系统进行设计,使得实现和维护变得更加轻松。另外,采用面向对象的实现方式,把数据和方法实现分离开来,是程序封装更加彻底,减少了开发中不必要的麻烦。增加了不同算法之间的对比。使得可以更加清晰明了地看出各个算法之间的差异以及优缺点。从不同算法的人头检测效果中也可以看出自己对此程序将来升级维护的方向。
    但是,这里仍然有许多需要完善和解决的问题:

    检测结果精确度问题,不管是AdaBoost人头检测还是SVM人头检测,图像中的人头检测结果都存在漏检,需要对特征点数据加强筛选。使用GPU加速提高算法效率:采用SVM检测算法时,算法占用大量CPU和内存,需要进行更精确的优化。界面的优化,界面仍存在许多很多需要优化的地方结合门禁卡,实现人员进出门禁时,自动比较刷卡次数与出入人员数量是否一致,是否有人员未刷卡,并及时作出相应的判断。系统在安全性方面还需要进一步的加强。为用户提供可靠的保障
    参考文献[1] 陈东伟,韩娜.嵌入式数据库在基于多核处理器的视频监控中的应用〔J〕.郑州大学2007(4):52-55.
    [2] 杨富国.Visua1C++程序开发案例解析[M].北京:清华大学出版社;北京交通大学出版社2006.
    [3] 王华. 智能视频监控系统设计与实现. 山东大学2013
    [4] 刘瑞祯.OpenCV教程基础篇[M].北京:北京航空航天大学出版社 2007
    [5] http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/histograms/template_matching/template_matching.html?highlight=matchtemplate
    [6] 黄佳.基于OPENCV的计算机视觉技术研究.上海.华中理工大学
    [7] HatemH, Beiji Z, Majeed R, et al. Head Pose Estimation Based On Detecting FacialFeatures[J]. 2015.
    [8] HaritaogluI,Harwood D,Davis L. UW4: real-time surveillance of people and theiractivities[J]H. IEEE Trans PaRem Analysis and Machine Intlligence,2000,22(8):809—830
    [9] 郑金荣.视频监控系统中运动目标跟踪算法的研究[D].硕士学位论文,江南大学,2009
    [10] 徐振兴.基于机器视觉的行人检测和跟踪技术研宄[D].硕士学位论文,浙江理工大学,2012
    [11] 牛胜石. 基于AdaBoost 和 SVM 的人头检测[D].硕士学位论文,中南民族大学,2010
    [12] 廖红文,周德龙.AdaBoost及其改进算法综述[J].浙江工业大学.2012(21)
    [13] https://msdn.microsoft.com/zh-cn/library/system.componentmodel.backgroundworker.aspx
    [14] 胡铮.面向视频监控的目标检测和跟踪技术.[D].浙江大学.2011:10~12
    致 谢光阴似箭,四年的本科生学习生活很快就要结束了。在西南科技大学的这四年里,我周围发生了很大的变化,最重要的是我四年前制定的目标实现了,四年让我收获颇丰。
    本论文的工作是在我的导师的悉心指导下完成的。在本课题的研究以及论文的撰写的过程中,老师给与我精心的指导;在生活中,老师也给与我了无微不至的关怀。正是这些指导和关怀使得我在本科生的学习期间取得了很大的进步。老师严谨的治学态度、科学的工作方法以及朴实的生活作风对我有着深远的影响。在此,向老师表达衷心的谢意。
    前几届的师兄对于我的工作学习以及论文都提出了许多宝贵的意见,对于论文的内容以及存在的问题提供了许多指导以及帮助。同时感谢所有在我学习期间教导过我的老师,谢谢你们在我求学的过程中给与的关怀和帮助,你们的一言一行都将成为我人生未来的宝贵财富。
    在课题研究以及论文的撰写过程中,许多同学对我论文中的研究工作也提供了热情的帮助,在此向他们也表达我的感激之情。最后特别感谢我的父母,他们一直在我的身边默默地鼓励、关心、支持我,是他们的理解和支持使能够专注于研究和学习,顺利完成我的学业。
    1 评论 55 下载 2018-09-28 22:21:45 下载需要13点积分
  • 基于JAVA的聊天室系统

    一、任务简要描述用java实现一个聊天程序:

    使用 Java 技术完成聊天室系统,深入学习使用 Java 语言。
    使用 Java 的多线程机制,深入理解 Java 多线程技术的应用。
    使用 GUI,对 JFrame 的深入学习。
    使用网络编程, 掌握基于 TCP 协议的 Socket 编程, 了解 Socket编程的协议约定,掌握简单应用协议的开发。
    使用 C/S 架构,对网络编程有一定的了解。

    二、系统需求分析功能性需求:

    用户注册
    用户登陆
    一个聊天室
    多个客户同时聊天
    不能重复登陆
    每个人能够看到当前聊天室的情况,有多少人,都有哪些人在聊天。
    多个聊天室
    能够私聊

    非功能性需求:暂无
    用例图:

    三、系统设计从角色上分析,聊天室可以有两种类型的角色:管理员和普通用户。
    普通用户在登录后,就可以进入这个聊天室了,并可以选择通过聊天界面进行单人一对一的私聊或者是和大家一起群聊。如果是第一次进入该聊天室,还可以选择本模块提供的注册功能,通过提交注册信息,成为该聊天室的新用户。
    管理员除了拥有普通用户的所有功能外,还可以通过专门的管理员界面,对普通用户进行管理,可以通过“管理”界面把一个或多个用户删除,让他们下次无法再登录到聊天室。
    3.1 模块设计:服务器端:



    模块名
    类名
    功能描述




    数据库操作
    DBHandler
    封装了一些JDBC的API,向本聊天室提供数据库操作方面的接口


    服务器界面
    ChatServer
    定义服务器端的界面,添加事件侦听与事件处理


    监听端口
    ServerListen
    实现服务器端用户上线与下线的侦听


    消息收发
    ServerReceive
    实现服务器消息收发的类


    端口设置
    PortConf
    继承自JDialog,是管理员对服务器侦听端口进行修改配置的类


    用户节点
    Node
    用户链表的节点类,定义了链表中的用户


    用户链表
    UserLinkList
    用户链表节点的具体实现类



    客户端:



    模块名
    类名
    功能描述




    客户端界面
    ChatClient
    定义客户端的界面,添加事件侦听与事件处理


    消息收发
    CliientReceive
    实现服务器端与客户端消息收发的类


    连接设置
    ConnectConf
    是用户对所要连接的服务器的IP及侦听端口进行修改配置的类


    登录
    LoginFrame
    提供权限检测的功能


    注册
    Registerframe
    提供普通用户注册功能


    管理
    ManageFrame
    提供管理员删除用户的功能



    3.2 系统关键抽象的类图:服务器端:

    客户端:

    3.3 数据库设计:3.3.1 ER图(实体-关系图):
    3.3.2 userInfo表的结构:


    字段
    中文描述
    数据结构
    是否为空
    备注




    userID
    用户ID
    int

    自增长,主键


    Name
    用户名
    Varchar(50)




    Password
    密码
    Varchar(50)




    Role
    权限
    int

    0 表示管理员 1 表示普通用户


    Online
    状态
    int

    0 表示离线 1 表示在线



    3.3.3 Mysql数据库中保存用户信息的表如下所示:
    3.4 人机界面(UI)设计:3.4.1 服务器界面:
    这是服务器端的主页面,管理员可以点击“端口设置”按钮,

    设置本服务器(本计算机代替)所要监听的端口。
    管理员可以点击“启动服务”来启动服务器服务,然后,可以通过想法的选择框选择发送系统消息的对象,可以是所有人,也可以是某一个人,然后再输入框里输入系统消息,然后点击发送按钮发送出去。
    最后,点击“关闭服务”来关闭服务器服务,或者点击“退出”按钮,关闭服务器服务并退出服务器界面。
    3.4.2 客户端界面:
    如果是新用户,可以点击“注册”按钮,

    输出想要设置的“用户名”和“密码”,全部操作无误后,即可成功注册;
    如果是管理员,可以输入“用户名”和“密码”,然后点击“管理”,进入管理界面,删除想要删除的一个或多个用户:

    如果是普通用户,可以点击“连接设置”设置想要连接的服务器的IP地址和端口号:

    然后点击“登录”按钮,即可进入聊天室:

    用户可以选择设置自己的状态“上线”或者“下线”,只有上线后,才能与服务器建立连接,与他人聊天。
    四、系统实现4.1 TCP网络通信服务器端:

    首先,默认的服务器端侦听的端口号是8888;
    后面,管理员可以根据需要更改成自己想要的端口号,并且,客户端的用户在登录之前,也可以修改想要连接的服务器的IP地址和端口号。

    当管理员点击“启动服务”按钮后,即运行startService()方法:

    同理,关闭服务器服务时,

    客户端:

    和服务器同理,点击登录后,

    服务器端的侦听进程,

    此时,服务器和客户端TCP网络连接建立成功!点击下线后,

    4.2 用户链表的实现当前在线的用户我是通过在服务器端建立一个链表实现的。首先,用户节点类的结构如下:

    然后,链表类的结构如下:

    count是用来计数当前在线人数的。另外,链表类中,定义了诸多操作链表的方法,以完成用户上线下线的业务逻辑功能。
    4.3 JDBC数据库连接用户的用户名,密码,权限等信息是保存在数据库中的,这样,用户一经注册,便能长期的使用这个账号登录聊天室系统。
    我将所有的关于数据库操作的方法都写进了DBHandler类中,这样DBHandler便为服务器端提供了数据库操作的接口。
    连接到Mysql数据库的方法如下:

    另外,DBhandler类中,还定义了查询用户权限,用户注册,用户删除等等方法,以便于实现用户登录,用户注册等业务逻辑功能。
    4.4 通信协议的制定当服务器端与客户端建立了TCP连接后,二者之间的信息传递通过类ServerReceive和ClientReceive实现。
    二者之间消息类型的识别是通过在消息的头部添加不同的“消息类型”标签实现的。

    无论是服务器端还是客户端,当收到一条信息时,首先检查这条信息的首部,确定信息的类型,然后调用不同方法,已实现不同的功能。
    3 评论 62 下载 2019-02-02 20:02:18 下载需要12点积分
  • 医药管理系统设计

    1 系统的详细设计面对企业办公自动化的现状和发展趋势,应医药公司的要求,本小组有针对性的为该公司开发一套办公自动化系统,借助该自动化系统,提高了办公过程的自动化程度,也提高员工日常工作效率,减少了纸张浪费和规范管理层的工作。
    一套软件,首先要能够满足用户的使用要求,这是基本条件。诚然,经过这么多年的发展,时常上的进销存软件的功能都已经非常完整,可以说基本上可以满足一般企业的仓库管理要求。
    了解到该医药公司的业务流程特点,结合现代企业的先进管理思想和模式,采用了Client/Server的可靠、高效系统作为平台,该系统包括了七大功能模块:系统管理、基本信息设置、进货信息管理、售货信息管理、库存信息管理、财务信息管理、系统帮助。
    对于一般的企业,采用相应的安全措施,没有可能权限的用户不能直接大开文件查看数据,有足够安全措施。从而构成了严密的权限保护系统。
    创建面向整个公司所处理的数据对象的数据结构,从而减少、消除相同数据多次重复录入,数据一直性差、冗余的现象,以保证数据准确性、安全性提高工作的时效性。
    1.1 系统的目标市场竞争的激烈意味着管理工作的重要性,药品种类和数量的增加也就意味着销售管理的重要性。本医药公司销售管理系统的目标大体有:

    为该公司提供一体化解决方案涵盖物流的整个过程,满足业内各种经营模式和特性。
    适合特色管理和经营,针对该行业经营品种繁多,对药品的有效期,批准文号,合格证等要有比较严格的管理。

    1.2 系统的功能图
    1.3 系统功能模块设计系统开发的总体任务是实现各种信息的系统化,规范化和自动化。该公司的销售管理系统完成功能的设计如下:
    系统管理用于管理本系统用户的增加、删除和修改用户密码等操作

    基本信息设置包括对药品类别的设置、药品的设置、供应商的设置和业务员的设置等

    货源信息管理主要完成对订货单的录入和进货入库等操作

    分类销售查询主要完成销售结果的查询,如按照药品查询和按照业务员查询

    2 系统实现面向对象分析首要的高能工作,是建立问题域的对象模型,这个模型描述了现实世界的“类—-&——对象”以及它们之间的关系,表示了目标系统的静态数据结构,静态数据结构对应细节以来较少,比较容易确定;当用户的需求变化时,静态数据结构相对来说比较稳定。因此,用面向对象开发的决大多数软件时,都首先建立对象模型,然后再建立子模型。
    类和对象是对应用领域中的概念的标识,是系统分析及软件的复用的基础,这一过程需要考虑多种情况,正确的表示类—对象,以形成下一步软件的复用性,提高软件质量及生产效率。例如,在办公自动化系统中,文档是整个软件的基础,如果没有标识此类对象,一旦文档稍有改变,则整个系统就会面临重建的风险。
    OOA系统的属性层包括对象的属性及对象间的实例连接(关系),属性为对象的一些静态信息,它是对象的内部资料描述,即内部封装的资料。
    对象所能执行的操作称为服务或方法。在属性层讨论是应用领域的静态方面。而对象间的动态关系及对象实例间的消息连接构成了服务层。
    结合面向对象的语言,就非常符合实际的情况。应用户在各种处理方面的需求,以及针对系统功能的具体设计将得到如下所示的本系统所要处理的数据流程图。

    2.1 用户登陆模块的创建运行本系统后将出现一个对话框如图6所示,提供用户输入用户名和密码,验证用户的合法性。如果用户3次输入登陆信息错误,将退出系统。这个模块包括三个类:LoginSystem.java、CheckUser.java和Main.java。其中Main.java是系统启动后运行的第一个类,在该类中初始化登陆窗口(Longinsystem.java)并将它显示出来,CheckUser.java封装了登陆和验证中一些公用的方法。
    在CheckUser类中用JDBC连接数据库,提供了验证用户,也实现了为以后添加用户和修改密码的功能。
    package com.csbook.restaurant.utility;import java.sql.*;import javax.swing.*;public class CheckUser{ //构造数据库连接参数 //private String url="jdbc:odbc:yumen","",""; public CheckUser() { try { //装载数据库驱动程序 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch (Exception ex) { ex.printStackTrace(); } } //检查指定用户是否为合法用户 public boolean isValidUser(String operator,String password) { Connection con=null; PreparedStatement ps=null; ResultSet rs=null; boolean isValid=false; try{ con = DriverManager.getConnection("jdbc:odbc:yumen","",""); String queryStr = "select * from operator WHERE id=? and password=?"; ps = con.prepareStatement(queryStr); ps.setString(1, operator); ps.setString(2, password); rs = ps.executeQuery(); if (rs.next()) isValid = true; } catch(SQLException exc){ exc.printStackTrace(); } finally{ if (rs != null) try { rs.close();}catch (SQLException ignore) {} if (ps != null) try{ ps.close();}catch (SQLException ignore) {} if (con != null) try{con.close();}catch (SQLException ignore) {} } return isValid; } //更改用户密码 public void updatePassword(String operator,String password) { Connection con=null; PreparedStatement ps=null; try{ //con = DriverManager.getConnection(url); con = DriverManager.getConnection("jdbc:odbc:yumen","",""); String updateStr = "update operator set password=? WHERE id=?"; ps = con.prepareStatement(updateStr); ps.setString(1, password); ps.setString(2, operator); ps.executeUpdate(); } catch(SQLException exc){ exc.printStackTrace(); } finally{ if (ps != null) try{ ps.close();}catch (SQLException ignore) {} if (con != null) try{con.close();}catch (SQLException ignore) {} } } //检查指定用户是否存在 public boolean userExist(String userID) { Connection con = null; PreparedStatement ps = null; ResultSet rs=null; boolean exist=false; try{ // con = DriverManager.getConnection(url); con = DriverManager.getConnection("jdbc:odbc:yumen","",""); String selectStr = "select id from operator where id=?"; ps = con.prepareStatement(selectStr); ps.setString(1, userID); rs=ps.executeQuery(); if(rs.next()) exist=true; } catch(SQLException exc){ exc.printStackTrace(); } finally{ if (rs != null) try{ rs.close();}catch (SQLException ignore) {} if (ps != null) try{ ps.close();}catch (SQLException ignore) {} if (con != null) try{con.close();}catch (SQLException ignore) {} } return exist; } //添加新用户 public void addOperator(String userID,String username,String userType,String password,String PICNo,String tel,String addr,String remark) { Connection con=null; PreparedStatement ps=null; try{ //con = DriverManager.getConnection(url); con = DriverManager.getConnection("jdbc:odbc:yumen","",""); String updateStr = "insert into operator(id,password,name,type,tel,addr,PICNo,remark) values(?,?,?,?,?,?,?,?)"; ps = con.prepareStatement(updateStr); ps.setString(1, userID); ps.setString(2, password); ps.setString(3,username); ps.setString(4,userType); ps.setString(5,tel); ps.setString(6,addr); ps.setString(7,PICNo); ps.setString(8,remark); ps.executeUpdate(); } catch(SQLException exc){ exc.printStackTrace(); } finally{ if (ps != null) try{ ps.close();}catch (SQLException ignore) {} if (con != null) try{con.close();}catch (SQLException ignore) {} } } //删除用户 public boolean deleteOperator(String userID) { Connection con=null; PreparedStatement ps=null; boolean succeed=true; try{ //con = DriverManager.getConnection(url); con = DriverManager.getConnection("jdbc:odbc:yumen","",""); String deleteStr="delete from operator where id=?"; ps=con.prepareStatement(deleteStr); ps.setString(1,userID); ps.executeUpdate(); } catch(SQLException exc){ succeed=false; } finally{ if (ps != null) try{ ps.close();}catch (SQLException ignore) {} if (con != null) try{con.close();}catch (SQLException ignore) {} } return succeed; } //获得用户类型 public String getUserType(String user) { Connection con=null; PreparedStatement ps=null; ResultSet rs=null; String userType=""; try{ //con = DriverManager.getConnection(url); con = DriverManager.getConnection("jdbc:odbc:yumen","",""); String queryStr = "select * from operator WHERE id=?"; ps = con.prepareStatement(queryStr); ps.setString(1, user); rs = ps.executeQuery(); if (rs.next()) userType = rs.getString("type"); } catch(SQLException exc){ exc.printStackTrace(); } finally{ if (rs != null) try { rs.close();}catch (SQLException ignore) {} if (ps != null) try{ ps.close();}catch (SQLException ignore) {} if (con != null) try{con.close();}catch (SQLException ignore) {} } return userType; } }
    2.2 用户管理功能的实现以添加用户为例说明用户管理功能的实现,在Jbuilder自动生成的jbInint()方法的末尾加上如下的代码:
    userType.addItem("operator");userType.addItem("manager");userType.addItem("sa");
    然后在设计(design)界面选定“确定”按钮,在Events选项的actionPerformed后的空格中双击,加入如下代码:
    void ok_actionPerformed(ActionEvent e) { String id = userID.getText(); //检查用户名是否为空,如为空,提示用户输入用户名 if(id.trim().equals("")){ JOptionPane.showMessageDialog(this, "用户名不能为空!", "警告", JOptionPane.ERROR_MESSAGE); return; } String name = username.getText(); String userT = (String) userType.getSelectedItem(); String telephone = tel.getText(); String addr = address.getText(); char temp[]=password.getPassword(); String pass=new String(temp); String PIC = PICNo.getText(); String note = remark.getText(); CheckUser cUser = new CheckUser(); boolean userExist=cUser.userExist(id); if(userExist) { JOptionPane.showMessageDialog(this, "系统中已存在该用户!", "错误", JOptionPane.ERROR_MESSAGE); return; } //调用CheckUser类中的方法添加用户 cUser.addOperator(id,name,userT,pass,PIC,telephone,addr,note); //刷新列表显示 JButton refreshButton=DBNavToolBar.getRefreshButton(); refreshButton.doClick(); //提示用户添加成功 JOptionPane.showMessageDialog(this,"该用户已成功添加","提示",JOptionPane.PLAIN_MESSAGE); }

    2.3 药品信息设置功能的实现在药品信息设置界面中,药品类型和生产厂商的输入信息是以下拉框的形式给出的,它不能由用户自由输入,它们的选项列表分别从yType和supplier中读取的。在本系统中它们是在prepareShow()方法中实现的。
    private void prepareShow(){ Connection conn=null; PreparedStatement ps=null; ResultSet rs=null; try{ conn=DriverManager.getConnection("jdbc:odbc:yumen","",""); ps=conn.prepareStatement("select name from supplier"); rs=ps.executeQuery(); while(rs.next()) producer.addItem(rs.getString("name")); ps=conn.prepareStatement("select name from foodType"); rs=ps.executeQuery(); while(rs.next()) foodType.addItem(rs.getString("name")); } catch(SQLException e){ e.printStackTrace(); } finally{ if(rs!=null)try{rs.close();}catch(SQLException ignore){} if(ps!=null)try{ps.close();}catch(SQLException ignore){} if(conn!=null)try{conn.close();}catch(SQLException ignore){} } }
    在添加之前,先要检测系统中是否已经存在相同名称的药品,通过加入下面的方法来实现。
    private boolean foodExist(String food) { Connection conn=null; PreparedStatement ps=null; ResultSet rs=null; boolean exist=false; try{ conn=DriverManager.getConnection("jdbc:odbc:yumen","",""); ps=conn.prepareStatement("select name from food where name='"+food+"'"); rs=ps.executeQuery(); if(rs.next()) exist=true; } catch(SQLException e){ e.printStackTrace(); } finally{ if(rs!=null)try{rs.close();}catch(SQLException ignore){} if(ps!=null)try{ps.close();}catch(SQLException ignore){} if(conn!=null)try{conn.close();}catch(SQLException ignore){} } return exist; }

    2.4 创建销售功能模块销售模块是本系统中比较复杂的功能模块,主要是同时更新销售信息表和库存信息表里的对应信息和一些异常处理。把Jbuilder自动生成的构造函数修改为:
    public BookService(String title,boolean resizable,boolean closable,boolean maximizable,boolean iconifiable,String operator) {super(title,resizable,closable,maximizable,iconifiable);this.currentOper=operator; try { jbInit(); } catch(Exception ex) { ex.printStackTrace(); } }
    此外,还要在BookServer中声明一个String类型的变量currentOper来保存传入的数据。在系统的构造函数中还应有下面的方法,提供下拉框的选项。
    public void prepareShow(){ Connection conn=null; PreparedStatement ps=null; ResultSet rs=null; try{ conn=DriverManager.getConnection("jdbc:odbc:yumen","",""); ps=conn.prepareStatement("select id from room"); rs=ps.executeQuery(); while(rs.next()) roomNo.addItem(rs.getString("id")); } catch(SQLException ex){ ex.printStackTrace(); } try{ conn=DriverManager.getConnection("jdbc:odbc:yumen","",""); ps=conn.prepareStatement("select commodity from stockInfo"); rs=ps.executeQuery(); while(rs.next()) customer.addItem(rs.getString("commodity")); } catch(SQLException ex){ ex.printStackTrace(); } finally{ if(rs!=null)try{rs.close();}catch(SQLException ignore){} if(ps!=null)try{ps.close();}catch(SQLException ignore){} if(conn!=null)try{conn.close();}catch(SQLException ignore){} } }

    参考文献[1] 作者:张海潘 书名:软件工程 出版社:人民邮电出版社
    [2] 作者:杨岚 刘静 书名:java实例导航 出版社:人民邮电出版社
    [3] 作者:Herbert Schilot 书名:java2参考大全 出版社:电子工业出版
    [4] 作者:陆正中 马进德石正贵 书名:JBiulder软件开发项目实践 出版社:清华大学出版社
    [5] 网络文章:工作流技术在流程分析中的应用研究
    [6] 网络文章:基于面向对象技术的异构系统整合
    3 评论 54 下载 2019-01-29 08:42:02 下载需要11点积分
  • 基于C#和SQL SERVER实现的零食销售管理系统

    第一章 零食销售管理系统调查与规划1.1 系统调查1.1.1 调查方法与步骤
    开调查会:分配调查工作,计划出任务流程
    发调查问卷:以调查问卷的形式,在网络上发布调查问卷,邀请一些商家对零食管理系统的需求进行调查,了解对功能的需求都有哪些
    访问:对用户进行访问,了解他们需要什么样的购物系统
    网络搜索:网络搜索资料,登录59store的零食销售网站,研究其各个功能的作用

    1.1.2 调查内容
    系统用户

    店长、客户、游客
    管理功能

    店长对订单、零食、用户进行管理,查看营业情况,查看客户反馈,发布和修改公告客户进行购物,查看公告,反馈信息,修改个人信息和密码游客查看零食信息和公告
    业务流程

    客户注册账号,店长可以查看客户部分信息客户选择零食后提交订单,店长对订单进行查看和确认店长发布公告,客户可以查看公告信息客户对自己信息和密码的修改客户填写对零食的反馈意见,店长查看反馈店长对零食信息进行管理游客查看零食信息和查看公告信息
    各种原始资料

    流程图



    商品信息表

    1.2 可行性分析1.2.1 技术可行性系统的技术方案采用面向用户的B/S架构和Microsoft Visual Studio 2010开发工具,使用c#语言开发,后台数据库Microsoft Sql Server 2014企业版,服务器采用Microsoft Internet Information Services。
    1.2.2 经济可行性无较大的开发成本,只需熟练掌握开发中所用的软件与技术,和拥有开发的硬件即可。
    1.2.3 其他因素可行性开发技术要求不高,开发费用不高,开发人员要求不高。
    综上所述,本系统的开发立项是可行的。
    1.3 系统规划1.3.1 项目概况随着经济文化水平的显著提高,人们对生活质量及工作环境的要求也越来越高,零食销售的工作也越来越受到销售人员的青睐。因为销售时的繁杂记录,销售过后的繁杂对账等工作让管理人员感到非常麻烦。因此,销售管理作为零食销售的便利方式越来越受到重视,如何设计一个性能优良的零食销售管理系统也就成了一个大众化的课题。
    1.3.2 项目计划
    项目目标:开发出零食销售管理系统,实现对零食的线上销售和管理
    项目范围:零食的线上销售和管理
    限定条件:使用系统的店长和经过注册客户可以使用全部功能,游客只能使用一部分功能
    所需可交付的工作任务:分析设计报告、软件产品、使用手册、课程设计报告、汇报演讲
    每一项任务所需技能:

    分析设计报告:语言组织能力,信息采集能力,计算机编程能力软件产品:Visio的运用能力,Photoshop美功能力使用手册:Photoshop美功能力,文字组织能力课程设计报告:语言组织能力,计算机编程能力汇报演讲:PPT制作能力,演讲口才能力
    所采用的工具和技术清单:

    可视化编程工具:Visual studio2010数据库工具:SQL Server2014文档编辑工具:Microsoftword2013多媒体制作工具:Microsoftpowerpoint2013图形设计工具、:PhotoshopCs6需求分析工具:Visio、Erwin技术语言:C#、ASP.Net、JavaScript
    已意识到风险及应变计划:

    已意识到的风险:
    如何确保数据的安全性和系统的可扩展性如何对客户及商品信息进行跨平台和兼容性的处理如何处理数据信息检索和数据字典的维护系统页面的美化及客户体验的提高系统运行后期如何对数据信息和功能模块进行简单的维护和管理
    应变计划:
    采用ASP.NET+SQL数据库为基础的B/S数据流控制三层模型结构,从而保证数据的安全性和系统的可扩展性结合Dreamweaver CS5及Visual Studio 2015实现页面的美化


    第二章 零食销售管理系统分析2.1 目标分析2.1.1 管理目标建立一个零食销售管理系统可以更方便的对零食进行管理,提高对零食管理的工作效率,将对零食信息的管理由繁重的人员劳动过渡到网络的科技性,便捷性,可以更好的做出对零食的管理。
    2.1.2 用户目标系统分为店长、客户和游客三种角色。由于零食销售管理系统是一个用来帮助使用者管理销售零食的软件。使用者通过对销售过程中所涉及的商品信息,订单,等资料的输入,便可以轻松实现零食销售流程的管理。所以,该系统必须向使用者提供一下具体功能:

    系统必须向使用者提供系统录入,删除,查询,修改等基本信息的修改功能
    鉴于零食销售业务的复杂繁冗,系统必须设计有多个模块(系统模块,数据管理模块,查询模块,统计模块)
    鉴于系统的安全性考虑,系统必须权限:对系统的使用者,按身份开放管理权限,这样可以在一定程度上保证系统的安全性,避免数据泄露,非法更改。该系统也设计了密码登录功能,这使数据更加安全。

    2.1.3 技术目标系统主要运用SQL Server 2014、Visual Studio 2010、net等系统实现对商品信息的管理,提高对商品管理的效率,方便店长和客户对零食信息的处理,将繁杂的人工转变为智能的计算机,使销售更快捷,更便利。零食销售管理工作更规范化,系统化,程序化,提高信息处理的速度和准确性,能够及时、准确、有效的查询到零食的相关信息。
    2.2 用户分析
    店长:需具有初级的计算机操作能力,具有信息管理的能力,有过管理的基础,进行过有关管理的培训,会数据的插入、更新、查询等基本技能
    客户:只需要具有初级计算机的操作能力
    游客:只需要具有初级计算机的操作能力

    2.3 功能分析
    店长

    登录:店长通过用户名和密码,登录进系统查询:即可通过查询编号、名称、价格、数量,查询商品的全部信息已处理订单:可以查看已经处理过的订单未处理订单:客户提交订单后,店长可通过订单管理处理未处理订单商品管理:店长可以通过该页面添加商品,编辑商品信息用户管理:店长通过输入用户ID或零食ID等信息,查询客户反馈信息,并可删除客户反馈信息营业情况统计:可以查看营业情况,通过折线图来显示客户反馈:店长可以查询客户的反馈信息发布公告:店长可通过发布公告,在页面展示最新商品信息、促销信息管理公告:可以对公告进行编辑及删除
    客户

    注册:客户通过输入用户名、密码、电子邮件等信息,注册成为新用户查看公告:进入系统即可看见最近公告及以往公告购物管理:客户可以看到全部商品信息,并可把商品加入购物车反馈信息:客户填写对商品的反馈信息个人信息:客户对个人信息进行修改
    游客

    登录:不需要用户名和密码,直接可登录系统查看零食信息,查看公告信息

    2.4 业务流程分析业务流程图

    2.5 数据流程分析2.5.1 数据流程图



    2.5.2 数据字典数据元素条目

    数据结构条目

    数据流条目

    数据存储条目

    处理过程

    2.6 管理模型分析主要用ER图来进行静态建模,通过JSD进行动态建模。
    2.7 计算机资源的配置分析2.7.1 硬件的配置服务器采用Microsoft Internet Information Services300G SCSI硬盘及以上,内存为具有ECC技术的8G内存以上,4核处理器以上。PC端,硬盘64G以上,内存512MB以上,奔腾处理器以上。
    2.7.2 系统软件的配置Window xp 及以上版本。
    2.7.3 工具软件的配置Microsoft Visual Studio2010以上版本,Microsoft SQL Server 2014以上版本。
    2.7.4 应用软件开发需求分析开发还需用到Dreamweaver、Photoshop、Word、visio等软件。
    2.8 与新系统相配套的管理制度的建立
    系统的每个使用者(除了游客)都有自己专有的用户名,必须用户名和密码对应才能登录系统
    店长要及时查看库存、更新零食信息;处理客户提交的订单信息,及时发货
    客户根据所购零食的真实情况进行评价,及时将真实的零食评价信息反馈给店长
    游客只能查看系统的公告和零食信息,只有注册后,才能使用系统的其他功能

    第三章 零食销售管理系统设计3.1 系统功能结构设计3.1.1 运行环境
    Microsoft Visual Studio2010
    Microsoft Visual Studio2015
    Microsoft SQL Server 2014

    3.1.2 基本设计概念和处理流程
    店长登陆系统添加零食信息,查看零食信息,编辑零食信息,发布公告
    用户登陆系统,如果用户为游客,则只能看到用户端系统的首页和零食信息。需要完成注册登陆之后才有更多权限
    客户登陆系统,查看最新公告或以往公告,查看零食详细信息,选中自己喜欢的加入购物车
    客户还可以对自己的信息进行完善和修改登陆密码
    客户对购物扯里的零食数量进行修改,提交订单,填写地址和电话,选择一个付款方式
    店长登陆查看未处理的订单,然后安排送货之后选择确认送达,订单处理
    订单经店长处理后,客户可填写反馈信息;如果店长没有处理订单,客户还可以取消订单
    店长登录系统查看客户的反馈信息和本天的销售量折线图,还可以查看客户注册的信息

    3.1.3 功能结构图
    3.1.4 功能要求与程序的关系*系统功能结构图和模块功能说明(IPO图)功能要求与程序的关系
    零食销售系统主要是提供一个线上的平台,供客户购买零食、店长处理订单。所以主要的功能包括客户在客户端提交订单,店长在店长端处理订单,并且能清晰的看到每个零食的库存情况,以供店长及时补货。并且还提供了数据统计的功能,店长可以直观的看到每日销售额的变换。
    系统功能结构图

    模块功能说明
    根据订单处理系统的数据流程图,应用HIPO图法进行模块层次功能分解

    根据DFD把模块分为三个功能模块

    根据总体IPO图将各模块逐层进行功能分解,画HIPO图。模块的执行顺序是从上到下,由左向右

    人工处理过程
    店长上传零食的信息时,需要人工地输入商品名称,单价,数量等各种信息。
    尚未解决的问题

    清空购物车和取消订单都不能使库存发生变化
    付款时只能采用货到付款,不能采用支付宝和微信支付

    3.2 数据库设计3.2.1 E-R图

    关系模式

    Dingdan(ID,kehuSno,totle,ddxq,date,ddaddress,ddphone,status,daytotle)
    Gonggao(id,title,infor,picture,submitdata)
    Gouwuche(lsid,kehuSno,lsName,lsSum,lsNumber,lsPrice)
    Kehufankui(userId,dingdanbianhao,remarks,date)
    Lingshi(id,name,numbers,price,kind,guige,image,introduce)
    Users(id,kehuSno,password,confpassword,email,phone,chihuoaihao,address,sex,age)
    查看1(用户账号,客户.id,密码,公告.id,内容,标题,图片,提交时间)
    查看2(用户账号,零食.id,零食名,数量,价格,种类,规格,介绍,图片)
    购买取消(用户账号,密码,地址,手机号,零食ID,零食名,零食总和,零食数量,零食单价)
    反馈(用户id,订单编号,评论信息,日期)
    订单存储(用户账号,零食数量,订单详情)
    编辑1(id,用户名,内容,标题,图片,提交时间)
    编辑2 (用户名,零食.id,零食名,数量,价格,种类,规格,介绍,图片)
    查看处理(用户名,用户账号是否被处理,该日订单,订单详情,零食数量,日期,订单地址,订单手机号)
    处理(用户名,用户id,订单编号,评论信息,日期)

    3.2.2 数据库设计在SQL Server数据库中创建了6个表,分别为dingdan、gonggao、gouwuche、kehufankui、lingshi、users。
    3.2.3 数据库中表的设计(表名称、字段名、字段类型、长度、主键、外键)dingdan表

    gonggao表

    gouwuche表

    kehufankui表

    Lingshi表

    Users表

    3.3 代码设计3.3.1 编码对象商品,订单,用户,公告,用户信息反馈。
    3.3.2 代码设计商品编码
    根据商品的属性等将商品编码设置为:商品名称+分类。商品名称为商品拼音的首字母。分类为饮料01,糖果02,饼|糕点|酥 03,果脯|蜜饯04、干果 05、其他06。
    其他编码
    用户id,订单编号,公告编号均等其余编码是系统自动生成,无需手动编码。
    3.3.3 举例商品编码例如:

    巴旦木:bdm05(巴旦木属于干果类型)
    马卡龙:mkl03(马卡龙属于糕点)

    3.4 输入/输出设计3.4.1 设计思路随着科技的发展,网购已经成为一种潮流,所有我们就顺应潮流,应用c#和数据库设计一个网购系统,便于店长管理零食销售,也便于客户购物。
    3.4.2 主要界面设计举例系统首页

    店长登录的界面

    客户/游客登录的界面

    3.5 主要模块的处理流程设计3.5.1 程序描述该程序是一个网上购物系统,方便店长管理零食销售,也方便客户购物。
    客户可以填写上账户信息登录到系统中,可以查看公告,公告里有店长发布的优惠信息,如果看到自己喜欢的零食,可以进行选购,然后进行结算,店长处理订单后,就可以发货,在收到零食后,还可以对本次的购物填写一个反馈信息。
    3.5.2 功能系统分为店长、客户和游客三种角色。

    店长具有如下功能

    对商品的信息进行查询对商品进行管理,如管理本店铺商品的上、下架等查看本店当月的营业额查看订单详情拟写公告并发布处理客户的订单
    客户具有以下功能

    对网页上的公告进行查询对商品的信息进行查询购买商品查看订单如果店长没有处理订单,客户还可以取消订单填写反馈信息完善资料和修改密码
    游客具有以下功能

    查看零食信息查看公告

    3.5.3 性能
    系统必须向使用者提供系统录入,删除,查询,修改等基本信息的修改功能
    鉴于零食销售业务的复杂繁冗,系统必须设计有多个模块(系统模块,数据管理模块,查询模块,统计模块)
    鉴于系统的安全性考虑,系统必须权限:对系统的使用者,按身份开放管理权限,这样可以在一定程度上保证系统的安全性,避免数据泄露,非法更改。该系统也设计了密码登录功能,这使数据更加安全

    3.5.4 输入项
    客户购买零食,提交订单,店长处理订单后,客户可填写反馈信息
    店长输入公告内容

    3.5.5 输出项
    客户的购物订单,客户的反馈信息
    店长发布的公告

    3.5.6 流程逻辑根据需要详细描述主要处理流程


    3.5.7 存储分配所有的数据都储存在数据库中
    3.5.8 限制条件店长和客户登录时需要用户名密码,游客登录后,只能查看零食信息和发布的公告,如果想进行其他操作,需要先注册。
    3.5.9 测试计划
    店长用他的账号登录,分别尝试各项功能,然后发布公告,添加商品信息等
    用客户的账号登录,分别尝试各项功能,查看公告,查看零食信息,修改密码,完善资料,购物等
    店长在客户购物的前提下查看订单,并处理
    在店长处理订单后,客户可以尝试写反馈信息,然后还没有处理订单,客户可以尝试取消
    游客登录(无账号登录),游客只可以查看零食信息和公告,不能进行购物,可以尝试购物试试
    游客如果想购物就必须注册,可以尝试游客是否可以注册成功

    第四章 零食销售管理系统实现4.1 模块界面设计及操作说明4.1.1 首页点击人形图标,就可以进到店长登录的页面;点击小车图标,就可以进入到用户登录的页面。

    4.1.2 店长登录页面输入用户名和密码,点击“登录”按钮就可以进入到店长的首页,点击左上角带箭头的小图标,就可以返回到系统首页。

    4.1.3 店长首页通过下拉菜单选择查询类型,然后在文本框中输入相关信息,点击“查询”按钮,如果有你查询的零食的信息,就会显示出来。

    4.1.4 店长——零食管理——添加零食通过填写页面中表格的信息,点击“添加”按钮,就可以添加零食了。

    4.1.5 店长——零食管理——编辑零食信息点击“删除”,可以将零食的信息删除,点击“编辑”,可以对零食信息进行重新编辑。

    4.1.6 店长——订单管理——未处理订单在表中显示还未处理的订单,点击“处理订单”,就可以对订单进行处理。

    4.1.7 店长——订单管理——已处理订单只能查看已完成的订单,不能进行任何操作。

    4.1.8 店长——客户管理通过选择查询类型,输入相关信息,点击“查询”按钮就可以查询出用户,点击“删除”可以删除客户的信息。

    4.1.9 店长——营业情况统计显示营业情况,不能进行任何操作。

    4.1.10 店长——客户反馈通过选择查询类型,输入相关信息,点击“查询”按钮就可以查询出客户反馈的信息,点击“删除”可以删除客户反馈的信息。

    4.1.11 店长——公告——发布公告在表中填写信息,点击“发布”按钮,就可以发布公告。

    点击发布公告之后,界面变成如下图所示(显示刚刚发布的公告),点击编辑按钮,调到编辑公告界面。

    4.1.12 店长——公告——编辑公告点击详情下的图标(下图红圈内位置),可以查看公告详情,点击“编辑”可以对公告进行修改编辑,点击“删除”可以删除公告。


    4.1.13 客户登录页面
    先选择用户类型:
    如果选择类型为游客,可不输入账号直接登录,随便输入的账号也可以登录,进入客户端首页;如果选择类型为客户,有账号的通过账号密码登录,否则点击注册进入注册界面。
    如果忘记密码,点击忘记密码后进入忘记密码界面。登录时账号密码不符合时登录失败,提示用户或密码错误。

    4.1.14 客户注册页面输入注册用户需要的信息,点击注册按钮完成注册。什么都不填就点击注册按钮,显示必填项不能为空的信息

    4.1.15 用户登录页面——忘记密码——修改密码通过客户登录界面的“忘记密码”按钮进入该界面,输入用户账号和注册邮箱后点击确定,如果账号邮箱匹配,则在下方出现修改密码的界面,点击修改按钮后,自动跳到登录界面;如果账号邮箱不匹配,提示输入邮箱有误或不存在。

    4.1.16 客户/游客首页上方显示最近的一个公告,下方显示以往的一些公告,点击“查看更多详情”跳到更多公告的界面(如下图)。点击每个公告标题后,在下方显示该公告的详情。

    4.1.17 客户/游客——我的购物——零食信息通过下拉框选择查询类型输入查询值后进行查询,如果有匹配信息就显示出来,否则提示对不起没有数据;如果不输入就点查询,提示查询值不能为空。
    点击购买按钮,库存减少,该商品自动加入购物车,点击查看购物车按钮进入购物车界面。点击详情介绍,弹出一个新的界面,显示该商品详情。

    4.1.18 客户——我的购物——购物车点击“+”数量增加,点击“-”数量减少,点击“删除”该行商品被删除,点击“继续购物”跳到零食信息界面,点击“清空购物车”界面被清空,点击红圈内图片,进入零食信息界面,点击“结算”跳到提交订单界面。

    4.1.19 客户——我的订单——提交订单先填写电话和地址,选择结账方式,点击“确认”跳到查看订单的界面。不填信息或不选结账方式都有提示错误信息,不能提交。订单提交后,购物车界面清空。

    4.1.20 客户——我的订单——查看订单根据订单处理状态,未被处理的订单点击“取消”,订单被取消;点击反馈,提示未处理不能进行反馈。已处理的订单点击“取消”,提示已处理不能取消;点击“反馈”,跳转到反馈界面。

    4.2 控件使用及功能介绍店长母版页



    控件
    控件名称
    功能




    LoginView
    HeadLoginView
    用于生产店长登录事件,跳转到店长登录页面


    Menu
    NavigationMenu
    用于生产导航栏


    ContentPlaceHolder
    MainContent
    当页面引用母版页的时候,页面上的内容和此控件合并,最终显示出来



    店长登录页面



    控件
    控件名称
    功能




    ImageButton
    ImageButton1
    用于插入一个图标作为按钮,点击后返回上一页面


    文本框
    UserName Password
    用于输入用户名 用于输入密码


    ImageButton
    ImageButton1
    用于插入一个图标作为按钮,点击后返回上一页面


    按钮
    LoginButton
    点击后登录进系统



    店长首页



    控件
    控件名称
    功能




    单选下拉列表
    ddlQueryItem
    用于选择查询的类型


    文本框
    txtValue
    用于输入查询的信息


    按钮
    Button1
    用于生产查询事件,查出所需的信息


    GridView
    queryGrid
    用于将数据库lsxsgl中表lingshi的部分数据显示在表格中


    SqlDataSource
    sdsQueryNews
    用于连接数据源



    店长——订单管理——未处理订单



    控件
    控件名称
    功能




    GridView
    GridView1
    用于将数据库lsxsgl中表dingdan里未处理的订单的数据显示在表格中,同时可以进行订单的处理


    SqlDataSource
    SqlDataSource1
    用于连接数据源



    店长——订单管理——已处理订单



    控件
    控件名称
    功能




    GridView
    GridView1
    用于将数据库lsxsgl中表dingdan里已处理的订单的数据显示在表格中


    SqlDataSource
    SqlDataSource1
    用于连接数据源



    店长——零食管理——添加零食



    控件
    控件名称
    功能




    单选下拉列表
    kindList
    用于选择要添加的零食的类型


    文本框
    nameTxt guigeTxt Introduce idTxt priceTxt numberTxt
    用于输入:产品名称 规格 详细介绍 编号 价格 数量


    FileUpload
    image
    用于上传图片


    RequiredFieldValidator
    RequiredFieldValidator2 RequiredFieldValidator3 RequiredFieldValidator1 RequiredFieldValidator4 RequiredFieldValidator5
    验证输入不能为空,若为空则分别显示提示信息


    标签
    message
    显示提示信息“添加成功”


    按钮
    addNews
    用于生成添加事件,将添加的信息保存到数据库中



    店长——零食管理——编辑零食信息



    控件
    控件名称
    功能




    单选下拉列表
    ddlQueryItem
    用于选择查询的类型


    文本框
    txtValue
    用于输入所属查询类型的值


    按钮
    Button1
    用于生成查询事件,查出所需信息


    GridView
    queryGrid
    用于将数据库lsxsgl中表lingshi的数据显示在表格中,同时可以删除和编辑信息


    SqlDataSource
    sdsQueryNews
    用于连接数据源



    店长——客户管理



    控件
    控件名称
    功能




    单选下拉列表
    DropDownList1
    用于选择查询的类型


    文本框
    TextBox1
    用于输入所属查询类型的值


    按钮
    Button1
    用于生成查询事件,查出所需信息


    GridView
    GridView1
    用于将数据库lsxsgl中表users的部分数据显示在表格中,同时可以删除信息


    SqlDataSource
    SqlDataSource1
    用于连接数据源



    店长——营业情况统计



    控件
    控件名称
    功能




    Chart
    Chart1
    用于显示折线图,将dingdan表中的数据汇总显示在折线图中


    SqlDataSource
    SqlDataSource1
    用于连接数据源



    店长——客户反馈



    控件
    控件名称
    功能




    单选下拉列表
    chaxunleixing
    用于选择查询的类型


    文本框
    chaxuntxt
    用于需要输入信息


    Button
    chaxun
    生产查询事件,查询出所需要的信息


    GridView
    GridView1
    用于将数据库lsxsgl中表kehufankui的数据显示在表格中,并且可以进行删除的操作


    SqlDataSource
    SqlDataSource1
    用于连接数据源



    店长——公告——发布公告



    控件
    控件名称
    功能




    Panel
    fabu
    用于存放控件,并控制控件的显示和隐藏


    文本框
    title
    用于填写标题


    RequiredFieldValidator
    RequiredFieldValidator1
    验证标题不能为空,若为空则显示提示信息“*标题不能为空”


    文本框
    ggnr
    填写公告内容


    FileUpload
    imgupload
    用于上传图片附件


    按钮
    fbgg
    用于生成发布事件,并将填写的信息保存到数据库中,同时将此时显示的信息隐藏,将FormView1中的信息显示出来


    标签
    message
    若填写信息不符合要求,则显示提示信息“公告发布失败”


    FormView1
    FormView1
    用于显示刚刚添加了的公告


    Image
    Image1
    用于显示上传的图片附件


    SqlDataSource
    SqlDataSource1
    用于连接数据源



    店长——公告——编辑公告



    控件
    控件名称
    功能




    GridView
    GridView1
    用于将数据库lsxsgl中表gonggao中的数据显示在表格中,并且可以进行编辑和删除的操作


    ImageButton
    ImageButton1
    用于显示一个图标,点击后弹出一个显示公共详情的对话框



    客户母版页



    控件
    控件名称
    功能




    Label
    username
    用于显示所登录的客户名


    Menu
    NavigationMenu
    用于生产导航栏


    ContentPlaceHolder
    MainContent
    当页面引用母版页的时候,页面上的内容和此控件合并,最终显示出来


    Input
    info
    用于显示时间



    客户登录页面



    控件
    控件名称
    功能




    ImageButton
    ImageButton1
    用于插入一个图标作为按钮,点击后返回上一页面


    标签
    lbMsg
    若用户账号或密码输入错误,则显示提示信息“用户或密码错误”;若用户名或密码为空则显示提示信息“登录失败-用户名密码不能为空”


    文本框
    usernametxt Password
    用于输入客户账户 用于输入密码


    DropDownList
    role
    用于选择用户类型


    按钮
    LoginButton
    输入信息都正确,点击后则登录进系统


    HyperLink
    HyperLink1
    用于链接到客户修改密码的页面



    客户注册页面



    控件
    控件名称
    功能




    ImageButton
    ImageButton1
    用于插入一个图标作为按钮,点击后返回上一页面


    文本框
    UserName Password ConfirmPassword Email Phone
    用于输入用户名,不能为空,且只能为数字; 用于输入密码,不能为空 用于确认密码 输入电子邮件,不能为空 输入手机号,不能为空


    标签
    lbname
    若用户名为空,则显示提示信息“用户名不能为空”


    标签
    lbpassword
    若密码为空,则显示提示信息“密码不能为空


    标签
    lbemail
    若电子邮件为空,则显示提示信息“电子邮件不能为空”


    标签
    lbMsg
    若没有填写任何信息,则显示提示信息“注册失败”


    RegularExpressionValidator
    RegularExpressionValidator4
    验证输入的用户名是否符合正则表达式制定的模式,即是否为数字


    CompareValidator
    PasswordCompare
    用于和文本框Password中输入的密码进行比较,若不同则提示“*密码必须一致”


    RegularExpressionValidator
    RegularExpressionValidator1
    验证输入的邮箱是否符合邮箱的格式


    RegularExpressionValidator
    RegularExpressionValidator2
    验证输入的手机号是否符合手机号的格式


    按钮
    zhuce
    若信息都符合要求,点击则注册成功,信息将保存到数据库中



    用户登录页面——忘记密码——修改密码



    控件
    控件名称
    功能




    标签
    message
    输入的邮箱和数据库中的不相符时,显示提示信息“输入邮箱有误或不存在!”


    文本框
    usernametxt email password confirm
    用于输入客户账户 用于输入电子邮件 用于输入新密码 用于输入确认的新密码


    CompareValidator
    CompareValidator1
    用于与文本框password中填写的密码相比较,若不相同则显示提示信息“*密码必须一致”


    按钮
    Button1
    生产事件,输入的邮箱和数据库中的相比


    按钮
    btnxiugai
    点击后更改密码成功,新密码替换掉旧密码,保存在数据库



    客户/游客首页



    控件
    控件名称
    功能




    Image
    Image1
    用于显示图片


    FormView
    FormView1
    用于显示公告


    GridView
    GridView1
    用于将数据库lsxsgl中表gonggao的数据显示在表格中


    HyperLink
    HyperLink1
    用于链接到公告详情页面


    SqlDataSource
    SqlDataSource1
    用于连接数据源



    客户——我的购物——购物车



    控件
    控件名称
    功能




    按钮
    Button2
    用于生成查询事件,查询出所需信息


    按钮
    Button1
    点击后跳转到购物车的页面


    GridView
    GridView1
    用于将gouwuche里的数据显示在表中,并且可以对零食的数量进行增减操作,还可以删除已选零食


    LinkButton
    lnkbtnContinue
    用于链接到零食信息页面,以便继续购物


    LinkButton
    lnkbtnClear
    点击后购物车里的数据将清空


    LinkButton
    lnkbtnSettleAccounts
    点击后跳转到结算页面进行结算


    标签
    sum
    显示所需金额的总数


    标签
    tishi
    如果购物车里没有零食,则会显示提示信息“您的购物车为空,请在零食界面挑选零食商品”


    ImageButton
    lingshi
    按钮链接到零食信息页面



    客户/游客——我的购物——零食信息



    控件
    控件名称
    功能




    单选下拉列表
    ddlQueryItem
    用于选择查询的类型


    文本框
    txtValue
    用于输入查询的信息


    按钮
    Button2
    用于生成查询事件,查询出所需信息


    按钮
    Button1
    点击后跳转到购物车的页面


    DataList
    DataList1
    用于显示零食的信息


    Image
    Image1
    用于显示图片


    LinkButton
    infor
    用于链接到零食详情页面


    LinkButton
    buy
    点击商品后自动加入购物车



    客户——我的订单——查看订单



    控件
    控件名称
    功能




    GridView
    GridView1
    用于将数据库lsxsgl中表dingdan里的数据显示在表中,并且可以对未处理的进行取消,可以对已处理的订单进行反馈


    Image
    xxxx
    用于显示一张图标


    按钮
    fankui
    点击后跳转到信息反馈的页面


    按钮
    quxiao
    点击后取消该订单



    客户——我的订单——提交订单



    控件
    控件名称
    功能




    GridView
    GridView1
    用于将数据库lsxsgl中表gouwuche里的数据显示在表中


    Label
    sum
    用于显示订单总金额


    LinkButton
    lnkbtnContinue
    用于链接到零食信息页面,以便继续购物


    Label
    tishi
    若还没有订单,则显示提示信息“您还没有订单,可在零食信息页面挑选您喜欢的零食”


    ImageButton
    Lingshi address
    用来输入联系电话 收货地址


    文本框
    phone
    点击后跳转到结算页面进行结算


    RadioButtonList
    jiezhangfangshi
    用来选择付款方式


    按钮
    queren
    生产订单提交的事件,点击后填写的数据将保存带数据库中


    按钮
    quxiao
    点击后取消结算,同时返回的购物车页面


    标签
    yanzheng
    若联系方式或地址未填,则显示提示信息“电话或地址不可为空”



    客户——我的反馈



    控件
    控件名称
    功能




    GridView
    GridView1
    用于将数据库lsxsgl中表fankui的数据显示在表格中



    客户——信息反馈的页面



    控件
    控件名称
    功能




    RadioButtonList
    RadioButtonList1
    单选按钮,选择自己的评价


    文本框
    TextBox1
    用于输入对订单的评价


    按钮
    Button1
    生产提交事件,同时点击后信息将保存到数据库中



    客户——我的信息——完善信息



    控件
    控件名称
    功能




    TextBox
    Username address Email phone
    用于输入客户名 送货地址 邮箱 联系方式


    RadioButtonList
    sexgroup
    单选按钮,用来选择性别


    ListBox
    age
    用来选择自己的年龄


    CheckBoxList
    chihuoaihao
    用来选择自己的爱好口味


    按钮
    sumbit
    生产提交事件,并将信息保存到数据库中


    按钮
    CancelPushButton
    生产清除事件,清除刚刚在表中填写的全部信息



    客户——我的信息——更改密码



    控件
    控件名称
    功能




    标签
    compare
    若ConfirmNewPassword中输入的密码与Newpassword中不一致,则显示提示信息“与新密码不一致!!”


    标签
    message
    若还没有修改密码就点击“更改密码”的按钮,则显示提示信息“您还未填写新密码!”


    文本框
    Newpassword ConfirmNewPassword
    用于输入新密码 用于输入确认的新密码


    按钮
    CancelPushButton
    用于清除所填的新密码


    按钮
    ChangePasswordPushButton
    点击后更改密码成功,新密码替换掉旧密码,保存在数据库



    客户——我的信息——查看信息



    控件
    控件名称
    功能




    标签
    Label11、Label12、Label13、Label14、Label15、Label16、Label17
    用于显示客户的具体信息



    4.3 关键技术说明
    面向对象技术
    JavaScript技术
    Microsoft Visual Studio技术
    SQL Server技术
    C/S技术
    2 评论 129 下载 2018-11-06 11:14:19 下载需要13点积分
  • 基于Face++的人脸融合及换脸系统

    1.项目介绍在本项目中,我们实现了对人脸图片数据的三种处理:人脸互换(face swap)、人脸融合(face morph)以及基于特征向量的人脸处理(eigen face)。
    1.1 人脸互换(face swap)人脸互换部分主要实现的功能是,给定任意两张人脸图片,通过一系列操作,使两个人的脸部交换,这部分需要的问题有:

    不同的人的脸部结构千差万别,同一个人也会因为角度、面部表情的不同而导致差别,即如何实现不同图片的人脸对齐
    不同人脸的肤色、光照不同,即不同图片的面部亮度不同,在换脸后如何与整体亮度统一
    不同人脸的纹理不同,比如老人的皱纹等,如何实现换脸后纹理的统一

    1.2 人脸融合(face morph)在人脸融合部分,我们需要实现给定任意两张人脸图片和融合度α,通过一系列操 作,实现两个人脸的融合。这一部分的困难在于:

    人脸结构的检测与分割。对于给定的人脸图片,人脸的结构差异很大
    人脸融合度的构建。对于给定的融合度 α,如何对两张图片的人脸取样与映射

    1.3 本征脸(eigen face)在这一部分,需要对较大的数据集(几百张,几千张人脸图片)进行处理,通过主成分分析的方法,得到一定数量的人脸主成分。这一部分的主要困难在于数据集的预处理,我们需要将不同图片中的人脸对齐,才能进行后续的处理。
    2.算法结构与处理过程2.1 人脸变换2.1.1 人脸关键点检测实现人脸变换的第一步,便是人脸关键点的检测,得到图片中的人脸的结构。在这 里,我们利用旷视face++的API来定位人脸关键的集合{V1,V2,…,Vn},其中关键点的数量可 以选择 83 或者 106。
    左:人脸关键点与凸包;右:德劳内三角集。

    2.1.2 计算凸包在获取人脸关键点集合后,我们需要计算这些关键点的凸包(convex hull)(凸包是一个计算几何(图形学)中的概念:在一个实数向量空间 V 中,对于给定集合 X,所有包含 X 的凸集的交集 S 被称为 X 的凸包。X 的凸包可以用 X 内所有点(X1,…Xn)的凸组合来构造.)在这里,我们计算凸包是为了获取这些人脸关键点组成的一个人脸区域。
    2.1.3 德劳内(Delaunay)三角划分在获得凸包以后,我们对凸包内的人脸关键点进行德劳内三角的划分。德劳内三角划分能将我们的凸包区域进行分割,并且更易于保留人脸的细节部分,并且因为获取仿射变换需要原图片和目标图片的各三个点,正好对应于原图和目标图的对应的德劳内三角。
    2.1.4 进行仿射变换在获得原图片和目标图图片的德劳内三角以后,我们需要寻找两张图对应的三角形对,对这样的每一对三角形,我们可以计算得到一个仿射函数。这个仿射函数将被用于三角形对之间的仿射变换。重复这个操作,直到所有区域都操作完毕,我们得到了人脸的位置变换。
    2.1.5 无缝融合在上述人脸仿射变换后,我们得到人脸结构和位置的变换,但我们没有对人脸区域亮度进行调整,这样会造成人脸区域和其他区域的颜色协调的问题。所以最后我们用 opencv 的无缝融合函数 seamlessClone()来实现无缝融合操作。
    2.2 人脸融合2.2.1 人脸关键点检测和 2.1.1 部分一样,我们首先需要确定给定图片的人脸的结构,所以需要检测人脸的关键点。在这里我们仍然使用旷视 face++的人脸关键点识别 API,选择 108 点检测。
    2.2.2 定义融合度要实现两张人脸的融合,我们还要定义融合度 α(0=<α<=1):

    M 是融合后的图像,I,J 是两张待融合图像。我们定义 α,使 α 趋于 0 使,越来越接近图 像 I;α 趋于 1 时,越来越接近图像 J;α 等于 0.5 时,相当于两张图像的平均。
    2.2.3 采样点加权在获得两张人脸的关键点后,我们再对两张人脸进行加权平均:

    通过这个式子,我们计算加权后的人脸关键点的位置。
    左:采样点加权后的人脸结构;右:德劳内三角划分。

    2.2.4 德劳内三角划分如同 1.1.3,我们对获取的人脸关键点进行德劳内三角划分,不同的是,我们为了获取人脸框架结构在整张图中的位置,需要手动添加图片四个角以及四边中心点作为辅助点,再进行德劳内三角划分。这样,我们就得到非常详细的人脸结构。
    2.2.5 图像融合在经过以上步骤后,我们进行人脸融合。首先,我们对源图像的人脸关键点对我们在 2.2.3 中得到的加权后的人脸关键点进行仿射变换。由对应的德劳内三角形确定的三个点,我们可以确定一个仿射变换;对所有的三角形进行这样的操作,我们就得到了仿射后的人脸图片。对两张源图进行这样的操作,我们就得到两个仿射后的人脸图片,再运用我们定义的融合度 α 进行加权平均,最终得到我们的目标图片。

    2.3 本征脸2.3.1 数据预处理此次我们用于测试的数据集有两个,一个是 NBA 现役球员,另一个是女外女明星。对于我们的人脸图片数据集,我们首先要做的是将它们的大小固定为统一的大小。然后,我们需要将每张人脸配准定位,一个方法是将每张图片的人的眼睛定位于同一水平线上,并且使每张图片的两眼中心点在相同的位置。
    2.3.2 主成分分析在预处理图片后,我们对图片的数据进行主成分分析。首先,对于每张 NxN 大小的图片,我们将其转化成一个(NxNx3)x 1 的向量。当有 M 张图片时,我们便有一个(NxNx3)x M 的矩阵。
    在计算主成分之前,我们先来对我们的图片矩阵数据求平均值向量,这是为了后面的方差和协方差准备的。在获取了平均值向量之后,我们来计算主成分。在数数学上,我们通过线性代数中的矩阵特征值分解,可以找到矩阵的特征值和相应的特征向量,我们将这些特征值按从大到小排列,越大的特征值说明数据在这个特征值对应的特征向量的方向上 的方差越大,这就是我们要找的主成分。在这里,我们可以设置参数,来选择主成分的数量。例如,我们选择前十大的特征值和对应的特征向量。
    2.3.3 获得本征脸在获得主成分之后,我们将选取的主成分矩阵,按原来图片矩阵转化为向量的逆操 作,将矩阵变成图片矩阵。
    3.代码结构3.1 人脸互换相关文件:faceswap.py

    get_points 函数。用于封装好 Face++的 API,得到图片的 83 个人脸特征点,并存储在一个列表当中,方便后续处理
    AffineTransform 函数。该函数输入源图、源图的德劳内三角、目标图的德劳内三角和给定的大小。通过计算获取仿射变换函数,并且进行仿射变换,输出变换后的图片
    DelaunayTriangles函数。用于计算我们人脸关键点的德劳内三角。我们应用openCV的Subdiv2D 函数,可以得到我们的德劳内三角
    warpTriangle 函数。通过德劳内三角的划分,我们定义这个函数,用来实现对德劳内三角的仿射变换,并且最终将左右变换后的三角形区域合并,得到我们的目标脸
    最后是主函数,调用这些定义好的函数,读取我们的图片进行处理

    3.2 人脸融合有关文件:morph.py

    detect 函数。用于封装好 Face++的 API,得到图片的 108 个人脸特征点,并存储在一个字典当中,方便后续处理
    addBorderPoints 函数。该函数功能是给处理图片准备要划分三角形的时候,把图片四个顶点和四条边的中点的坐标添加到带划分的点中,这让得劳内三角形能完整的划分 整张图片
    delaunaryTriangles 函数。由特征点的坐标生成其用来划分这些特征点的得劳内三角形
    affineTransform 函数。根据划分好的三角形,我们可以用来计算一张图的三角形到另外一张图所对应的三角形的仿射变换,该函数在 morphingTriangle 函数中使用
    morphingTriangle 函数。对两个仿射后的人脸图片,运用我们定义的融合度 α 进行加权平均,最终得到我们的目标图片


    morphing 函数。总的融合函数的接口,得到融合图片的脸部特征点的坐标,与新图片的脸部划分三角形坐标,调用 morphingTriangle 函数得到新的融合图片
    getPic 函数。用于实现 GUI 中根据 alpha 生成一张图片的功能
    get20Pics,create,sortKey,createGIF 函数。用于实现 GUI 生成一张 gif 图片的功能

    3.3 本征脸人脸相关文件:eigenface_origin.py

    readImages 函数。从指定的文件夹中读取图片文件,将其转化成 numpy 矩阵,放到一个 list 中。在此过程中,每张图片翻转后又保存了一次
    createdatamatrix 函数。将保存图片的 numpy 矩阵压平。(每张图片压平)
    createnewface 函数。产生特征脸并且用 opencv 可视化界面展示
    resetslidervalues 函数。在 opencv 可视化界面中,点击一下图片,就重置所有 bar
    总体思路:从文件夹中读取图片,变成矩阵,每张图片 flatten,用求平均向量,特征向量,再计算出 eigenface。

    3.4 GUI 部分有关文件:

    mainPage.py 主界面 GUI
    morphGUI.py 融合脸功能界面 GUI
    swapGUI.py 换脸功能界面 GUI
    eigenGUI.py 特征脸界面 GUI

    4.开发环境在本次项目中,算法几接口 API 都是由 pyhton3.5(python3.6)完成的,其中还使用了openCV 库。GUI 使用 pyqt 完成。API 使用 face++人脸关键点接口。
    5.可执行文件及使用的数据集5.1 数据集我们有 2 个数据集,其中一个 image_swap 是用于测试换脸操作的;另外一个 image_eigen 数据集是用来测试本征脸的,是 NBA 现役球员的图片。人脸融合测试图片,一定要是放在与该py文件夹中相同的文件夹,所以没有专门的数据集,可以从其他地方复制一些图片,进行测试。
    5.2 可执行文件及运行方式在 windows 下,我们有可执行文件 face#.exe。执行方式:双击打开,会看到我们 GUI 的初始界面。在界面中我们会看到三个按钮,这是我们 GUI 实现的三个功能,及人脸互换、人脸融合和本征脸。点击其中一个按钮,会进入下一层界面,具体的操作可以参考我们附加提交的操作演示视频。




    在 macOS 系统下,可以通过 python 文件名.py 命令运行我们的 python 文件。
    6.项目成果与反思6.1 项目成果6.1.1 人脸互换
    从测试结果图中,我们可以看到,我们的人脸互换效果还是非常好的:从前景图上截取的脸部,能够非常好地与背景图融合;在边缘部分,没有明显的边界;在人脸的姿势上,也根据背景的姿势得到了调整,能够与背景姿势相一致。当然我们也可以看到,在第二个结果中,由于前景脸和背景脸的脸部颜色相差太大,导致结果图中的脸部与额头等地方有明显的不一致,这是因为我们在做人脸互换的时候,只根据人脸关键点确定的凸包进行变换,而人脸关键点是没有包含额头及脖子部分的。这是我们人脸互换做的不好的地方
    6.1.2 人脸融合
    同样,对于我们人脸融合的结果,也非常好。在它融合度为 0.5 的情况下,包含了两张源图中一样多的特征,让我们能在结果图中能找到明显的属于两张源图的特征。但是同样存在一些问题,比如在上面一张结果中,我们可以看到头发部分有重影。这是因为两张源图片的头发差异部分存在白色的背景,当进行融合时,由于有两部分的特征,所以会造成重影;但是第二张结果图中,我们没有看到这个现象,这是因为两张源图的差异部分没有很白的背景颜色。
    6.1.3 本征脸
    对于我们的本征脸,我们在此解释一下左侧拖条的含义:首先我们这部分是对人脸数据集进行主成分分析,所谓的主成分就是数据中方差最大的一些方向,对应到人脸数据中,便是影响数据集中人脸的形态的最大的方向,或者说数据集中人脸变化最大的一些特征。比如,NBA 球员数据集中,球员的肤色有黑有白,这是变化非常大的特征,所以应该会有一个主成分只指向球员肤色的黑白的。而之所以右侧的结果会很模糊,正是因为我们计算出的主成分代表了人脸数据集中变化最大的特征,所以这些特征组成的图片必定是非常模糊非常不整齐的。
    6.2 项目思考与改进6.1.1 人脸互换我们的人脸互换算法依赖于人脸关键点锁定的区域,基本上限定于眉毛-两侧脸颊-下巴组成的区域,当两张源图的脸部颜色差别很大时,会出现结果图中脸部与额头差别很大的问题。所以,我们设想后续的优化是,将脸部的区域扩大到额头,乃至整个脖子,但是由于一般人脸检测的算法只限于原先的区域,如何检测这些扩展的区域,是一个较难解决的问题。
    6.1.1 人脸融合对于人脸融合中出现的结果图中脸部区域以外的重影问题,我们设想的优化是,将脸部以外的区域,全部设置成其中一张源图的背景区域。
    6.2.3 本征脸对于主成分分析得出来的若干个对人脸变化影响最大的特征,其中一些我们能够直观地看出来,例如肤色的黑白等,但有一些特征并不能很容易地得知与什么相关,需要我们进一步测试、观察与分析。
    11 评论 98 下载 2019-05-24 10:28:45 下载需要11点积分
  • 基于Android Studio实现的论坛网站Android客户端和JAVA EE后台

    第一章 概述1.1 开发环境本安卓程序在Windows 10系统下使用Android Studio开发,后台使用MyEclipse开发,测试环境为安卓系统5.1、4.4、4.3、5.0,屏幕尺寸5.0、5.1、5.5的安卓手机。
    1.2 安装配置本安卓程序要求安卓SDK为API level 15以上,target level为23,即,android 4.0.3到android 6.0。
    1.3 需求分析本程序为安卓APP开发项目,项目内容为IT主题的论坛开发。根据需求分析,需要一下功能:

    用户的登陆与注册功能
    用户权限包括管理员、版主、普通用户和游客身份登陆
    根据不同权限登录用户可以对帖子进行不同程度的管理,管理员可以查看、删除所有帖子,版主可以查看所有帖子、删除做属板块的帖子,普通用户和游客都只能查看帖子
    除了游客外所有用户都能发帖、回帖,游客不能发帖、回帖
    用户可以查看自己发的帖子并管理自己的帖子

    第二章 程序概要设计2.1 程序功能模块本安卓程序分为登陆注册模块、查看帖子模块、删除帖子模块、回复帖子模块。

    登陆注册模块是程序的入口,如果已经登陆过了又没有退出登陆,就可以自动登陆,如果没有账号,可以游客登陆
    查看帖子模块可以根据板块选择性查看所有帖子,已注册用户可以查看自己的帖子,帖子信息包括标题、内容、时间等
    删除帖子模块包括管理员可以删除所有帖子,版主可以删除所属板块的帖子,所有用户可以删除自己的帖子,游客不能使用删除功能,程序根据登陆用户的权限自动显示是否可以使用
    回复帖子模块用于已注册用户对帖子的回复,游客不能回复帖子

    2.2 流程图
    2.3 程序文件结构分析java文件夹下MyWork包内的java文件是每个布局对应的Activity,其中Circle是自定义的一个控件;control包下是两个适配器,包括主页面的适配器MainAdapter和回复页面的适配器LookAdapter,还有联网的工具类NetWord。

    res资源文件夹下的layout布局资源文件包括各个Activity的布局和listview的自布局,其中tool_bar是ToolBar的布局。

    menu文件夹下是两个ToolBar的菜单布局,values文件夹下使用到了strings文件和colors文件,特别的是attrs文件,这个是Circle自定义控件的配置文件。

    2.4 数据库设计本程序使用javaEE后台,数据库为sql server,包括card表、section表和userTable表,分别的字段如下:

    card:id、nameId、contents、date、title、sectionId、replyId、isTop、topDate
    section:id、name、host
    userTable:id、username、password、power、pic

    第三章 程序详细设计3.1 关键代码分析联网:使用java jdk自带的HttpURLConnection进行联网,并使用json进行数据传输。图3-1包括了链接网络的方法connect()、传参的输出流ObjectOutputStream,图3-2判断了状态码是否为200然后接收后台传过来的参数并处理返回,接收参数使用InputStream输入流。


    自定义适配器:先写了继承BaseAdapter的适配器类,这个项目中使用了两个适配器,分别为MainAdapter、LookAdapter,作为主界面和回复节目的适配器。两个泪重写了getView方法,处理每个listview中每个item的布局,以显示每一个帖子。
    侧滑菜单:在布局中使用DrawerLayout如图3-3,在Activity中使用ActionBarDrawerToggle作为侧滑开关,并实现开和关的监听,如图3-4。


    界面返回刷新:使用Intent跳转时用startActivityForResult,并重写onActivityResult方法,如图3-5。

    3.2 疑难问题解决用户权限识别:在第一次登陆成功后将后台返回的用户信息存进SharedPreferences,后面根据从中取出来的权限信息进行判断,然后决定是否显示相应按钮。

    第四章 程序的发布和测试4.1 发布过程安卓端的发布,将程序运行到手机,通过android studio的Logcat查看运行信息;
    JavaEE端的发布,将程序部署到Tomcat,同样通过myeclipse的Logcat查看运行信息。
    4.2 测试过程图4-1为登陆界面,点击注册按钮到如图4-2的注册界面,注册成功后跳转回登陆界面登陆。



    登录
    注册









    图4-3为管理员登陆的界面(还有打开侧滑菜单的状态),图4-4为版主和普通用户及游客登陆后的界面。



    管理员登录
    普通用户登录









    图4-5为游客登陆的侧滑菜单界面,与其他用户是不同的,只有一个选项,当其他用户登录时,可以点击右上角的笔进入发帖节目,如图4-6。



    侧滑菜单界面
    发帖









    第五章 分析与总结5.1 优点本安卓程序的优点在于界面简洁,有与服务器后台联系,交互友好,基础功能及部分拓展功能已经实现。
    5.2 缺点本安卓程序的缺点在于界面跳转仍有部分不流畅,因为代码效率问题有待改进,还有其他计划中的拓展功能由于时间关系还没实现。
    5.3 总结通过此次安卓大作业的开发,让我对安卓开发更加熟悉,对知识点的运用更加熟练,由于运用到了javaEE后台,使我对javaEE的熟练度也增加了。因为这次大作业的制作时间比较短,所以刺激了自己的潜力,锻炼了自己赶项目的感觉。
    第六章 参考目录[1] 《疯狂安卓讲义》 电子工业出版社 李刚 2015.8
    [2] 《android应用开发学习手册》 清华大学出版社 管蕾 2015.7
    14 评论 267 下载 2018-11-06 15:32:08 下载需要12点积分
  • 基于JAVA和MYSQL数据库实现的图书资料管理信息系统

    第一章 概述1.1 项目背景随着人们知识水平层次的提高,图书馆成为日常生活中不可缺少的一部分, 基于图书数目不断增加,读者数目不断增长,对图书信息管理自动化和准备花要 求日益强烈的背景下,实现读者信息管理工作网络化以及查询和统计一体化的管 理信息系统。该系统为学校职员和学生提供图书的详细信息和馆内库存情况,建 立庞大的数据库;图书管理员需要管理借书、还书情况,并进行借阅者的登记, 工作量较大,图书管理系统可以高效率地处理这些功能,减轻管理员的工作量。
    1.2 编写目的实现图书的智能化、信息化和简单化;实现图书信息的增加、删除、修改、 查找、借阅、还书的显示操作及实时数据库的提交和更改;提高图书管理员工作 信息报送及反馈的工作效率,减轻管理员的劳动负担;提高信息的及时性和汇总统计信息的准确性,使图书和读者管理更加合理化和科学化。
    1.3 开发环境
    系统开发环境:Eclipse Java Neon
    系统开发语言:Java
    数据库:MySQL Workbench 6.3 CE
    运行平台:Windows 8.1

    第二章 需求分析2.1 概要分析经过对图书管理系统的分析,这里把系统的层次划分为了四个部分:图书维护,人员信息管理,图书借阅管理,信息查询。能够实现以下功能:

    进行新书入库、现有图书信息修改以及删除
    能够实现对读者基本信息的查询和编辑管理
    能够进行超期罚款功能
    能够进行借阅信息的查询功能

    2.2 详细分析通过详细分析所得的信息如下:
    2.2.1 处理对象
    读者信息:学号,姓名,性别,学院,专业,年级,登录口令,办证日期, 登录次数,最近一次访问系统时间
    管理员信息:管理员编号,姓名,性别,登录口令,住址,电话
    馆藏图书信息:图书编号(即 ISBN),索书号,图书名称,作者,出版社, 出版日期,单价,摘要,关键字,副本数,借出数量,分类号,所在馆室
    对应在借图书——借阅信息:图书编号(即 ISBN),读者编号,图书名,作 者,借阅日期,归还日期,应还日期,续借次数(每续借一次应还日期固定 增加一周),罚金
    对应借阅历史——借阅历史信息:图书编号,读者编号,图书名,作者,借 阅日期,还书日期
    罚款信息:读者编号,图书编号,图书名,作者,借阅日期,应还日期,归 还日期,罚款金额,处理状态,管理员编号

    2.2.2 处理功能及要求用户对图书管理系统的功能及要求如下:

    能够存储一定数量的图书信息,并方便有效的进行相应的书籍数据操作和管理
    图书信息的录入、删除及修改
    图书信息的多关键字检索查询
    图书的借阅续借、归还及超期罚款
    对一定数量的读者、管理员进行相应的信息存储与管理,包括读者信息的登 记、删除及修改
    管理员信息的增加、删除及修改
    读者资料的统计与查询
    提供一定的安全机制,提供数据信息授权访问,防止随意删改、查询
    对查询、统计的结果能够列表显示

    第三章 数据库设计3.1 ER 模型图
    3.2 定义表及其关键字3.2.1 馆藏图书信息表图书编号,索书号,图书名称,作者,出版社,出版日期,单价,摘要, 关键字,副本数,借出数量,分类号,所在馆室

    3.2.2 读者信息表学号,姓名,性别,学院,专业,年级,登录口令,办证日期,登录次数, 最近一次访问系统时间

    3.2.3 管理员信息表管理员编号,姓名,性别,登录口令,住址,电话

    3.2.4 借阅信息表图书编号,读者编号,借阅日期,归还日期,应还日期,续借次数,罚金, 罚款处理状态,管理员编号

    3.2.5 图书馆室信息表馆室编号,馆室地址

    3.3 描述表之间的关系
    第四章 程序设计4.1 软件功能设计4.1.1 管理员角度
    查询图书功能
    修改图书功能
    删除图书功能
    新增图书功能
    查询读者功能
    修改读者功能
    删除读者功能
    新增读者功能
    查询借阅记录功能
    查询罚款记录功能
    查看个人信息功能
    修改密码功能

    4.1.2 读者角度
    查询图书功能
    借阅新书功能
    续借旧书功能
    按时还书功能
    过期缴费功能
    查看个人信息功能
    修改密码功能
    查询借书、缴费记录功能

    4.1.3 系统功能模块图
    4.1.4 读者信息查询、更新模块
    4.1.5 图书基本信息的查询和更新模块
    4.2 界面设计4.2.1 登录界面
    4.2.2 读者操作界面查询图书界面

    借阅、续借图书界面

    归还、缴费界面

    查看信息界面

    我的图书馆界面

    4.2.3 管理员操作界面查询图书界面

    新增图书界面

    修改图书界面

    删除图书界面

    查询读者界面

    新增读者界面

    修改读者界面

    删除读者界面

    记录查询界面

    查看信息界面

    第五章 课设心得这次课程设计题目是图书资料管理信息系统。在我看来,数据库课程设计主要的目标是利用课程中学到的数据库知识和技术,较好地开发设计出数据库应用系统,去解决各行各业信息化处理的要求。通过这次的课程设计,可以巩固我们对数据库基本原理和基础理论的理解,掌握数据库应用系统设计开发的基本方法,进一步提高我们综合运用所学知识的能力。
    在课程设计初期,我选择了大学图书馆系统进行调研,结合此次课设要求确定了最终的功能和相应界面的设计。通过概念设计、逻辑设计,建立 ER 模 型图,并按照要求删除冗余使最终结果都能达到 BC 范式,创建数据字典,建立 数据表、视图、触发器以及存储过程等等,完成相应的数据库设计,并从已有图 书馆中向数据库插入原始数据。在软件设计阶段,因为之前有过设计界面的经验 所以做起来没有什么困难,但是在 Java 链接数据库进行相应操作时,偶尔会有 逻辑上的错误以及 SQL 语法错误,经过上网搜索相关信息、翻书查阅资料,最 终都一一修改了过来,程序能够完成预期的目标,界面友好简洁,便于操作,比较满意。
    当然本次课程设计还存在着需要改进的地方:点击菜单栏的时候菜单栏选项可以变色,方便用户清楚自己目前在哪个功能面板;读者借了一本书之后就立即刷新查询书籍表格中的借出数。感谢老师给予的改进建议和帮助,我一定会继续努力学习相应理论知识,结合实际,提高自身各方面的能力,更好地完成今后的课程设计任务。
    12 评论 203 下载 2018-11-25 15:29:06 下载需要13点积分
  • 基于Spring+SpringMVC+hibernate+MySQL实现的体检中心管理系统

    摘 要随着人们生活水平的不断提高,人们的保健意识随之增强,体检已普遍成为人们保健的重要部分。特殊职业的体检、各种职业病的体检、单位职工的群体体检及个人体检使得医院体检人数急剧增加。然而传统的体检工作效率远远不能满足当下剧增的体检业务。所以,医院急需满足健康体检需要的信息管理系统来提高体检工作效率。
    本系统包括体检项目管理、预约体检管理、体检套餐管理和体检管理四个部分,可以用户登录注册、预约体检、添加体检项目、设置体检套餐、查看用户信息、查看体检记录等功能。但由于时间有限,系统部分功能不够完善,还有待于进一步修改和完善使之功能更强大,操作更简捷,以便更好的应用于实际中去。
    本次课程设计的主要任务是基于B/S模式,即Browser/Server(浏览器 /服务器 )结构。在这种结构下,用户界面完全通过浏览器实现。B/S结构利用不断成熟和普及的浏览器技术实现原来需要复杂专用软件才能实现的强大功能,并节约了开发成本,是一种全新的软件系统构造技术。利用当前,JavaWeb开发技术繁多,但为开发团队选择一款优秀的框架非常重要,一个好的框架决定了开发团队的软件开发周期、开发成本、维护成本甚至于软件的生命周期。在选择一个可行的方案时,一般要从稳定成熟性、可扩展性及灵活等多方面综合考虑。本文将以一个商品出库模块为例,详细介绍由Spring、SpringMVC、hibernate几种技术构成的软件架构的搭建技术要点和以此为平台的功能模块实现过。Spring+SpringMVC+hibernate不同于之前流行的Spring+struts2+hibernate技术架构,该架构是将后者最重要的前端控制部分struts2替换成用SpringMVC,同时将Spring和hibernate多种开源技术有机结合在一起,从而构建出一个健壮可靠、高效成熟的JavaWeb应用程序技术架构。结合MySQL后台数据库开发“体检中心管理系统”,可应用于各大中小型医院。
    一、开发背景随着计算机性能不断提高,价格不断下降,计算机已在医院医疗、教学、科研、管理等方面等到越来越广泛的应用。计算机化的医院信息系统(HIS)已成为现代化医院运营过程中必不可少的基础设施与技术支撑环境。就好像一个现代化医院的成功运行离不开功能完整、美观舒适的建筑物、及时娴熟的医护人员、性能齐全、高精尖的医疗设备一样,它也离不开计算机化的医院信息系统。国际上医院信息化系统大致可以分为三个阶段:第一个十年,集中在开发医院行政管理的功能上,像住院病人和问诊病人管理等。但在1972 年Collen仍报告美国迄今为止连一个成功的已完成的全面医院管理计算机系统都没有。第二个十年,在继续完成和实现医院管理信息的计算机化同时,开发者的努力已进入医疗信息的处理领域,像病人医疗处理系统,实验室系统等。到1985年,美国全国医院数据处理工作调查表明,100张床位以上的医院80%实现了计算机财务收费管理、70%的医院可支持病人挂号登记和行政事务管理,25%的医院有了较完整的HIS。最后一个十年至今,研究者又把重点放在了病人床位系统、医学影像处理、统一的医学语言处理等方面。医院信息系统正在经历着小型化、智能化和集成化的改造过程。

    为了给病人提供更好、更快的服务,提高医院在医疗服务市场上的竞争力,以吸引更多病人到本院就诊
    人力工资的昂贵,迫使医院采用计算机以提高劳动效率
    国家和保险公司为施行预付款制度,而需求医院及时上交复杂的有关 DRGS 的报告,迫使医院采用计算机技术。我国医院信息系统的研究工作,从八十年代初期算起,至今也有二十多年的历史,其中经历了单机单任务的阶段,多机多任务的阶段以及微机网络一体化的阶段,应该承认这期间我们有很大进步。医院对信息的需求永远是 HIS 发展的原动力,刺激我国医院广泛采用计算机信息系统的因素主要有:

    医院要强化自身的管理,逐步实现医疗价格与按成本收费,实现医院内按成本核算与全面财务计划,并体现在建立和优化医院内合理的分配制度上,为此每个医院都迫切需要建立自己的以财务管理为中心的医院管理信息系统医院要加强医疗服务质量的自我监督、自我控制的能力,为病人提供更快更好的服务,必然要依赖与计算机信息系统医疗制度的改革正在把病人—医院的二元关系变为病人—医院—保险机构—政府监督的多元关系。大量的有病人的诊断、治疗、用药、资源消耗的信息不仅在医院内而且在许多部门之间流通、传递每个医院的信息系统是全国或地区性医疗信息网络的基础,医疗信息网络即所谓“金卫”工程,是我国国民经济信息化的重要组成部分建立以计算机化病人病历 CPR为核心 HIS 会成为已初步建立医院管理信息系统的那些医院的下一个努力目标

    二、需求分析2.1 用户基本需求描述
    体检套餐设置:组合基本体检项目成一个体检套餐,并设置套餐使用年龄段、使用人群、套餐价格、有效期和注意事项等数据
    体检预约功能:客户在提交个人信息进行注册之后,可以预约体检套餐,包括套餐类型、预约时间、套餐预约状态等
    体检记录管理:体检中心的工作人员会对客户实际进行的体检做相关记录,包括体检时间、体检选择的套餐、满意程度等
    查询功能:客户可以查询各类体检套餐包含的具体体检项目和价格,可以查询自己的预约信息和历史体检记录;体检中心的工作人员可以查询客户预约记录以及现行的客户体检记录

    2.2 数据流图分析体检中心管理系统-顶层图

    体检中心管理系统-0层图

    2.3 数据字典
    数据流名称:预约体检

    别名:无简述:用户预约体检是填写的项目来源:用户去向:输入到预约记录组成:编号+套餐编号+用户编号+预约时间
    数据流名称: 体检记录

    别名:无简述:用户体检后,用户向系统查询体检记录来源:体检记录去向:用户组成:编号+项目编号+用户编号+体检时间
    数据流名称: 客户预约信息

    别名:无简述:客户预约成功后,查询到该用户的预约记录来源:预约记录去向:体检中心工作人员组成:编号+套餐编号+用户编号+预约时间
    数据流名称: 体检相关记录

    别名:无简述:用户体检后,工作人员向系统录入改用户已体检来源:体检中心工作人员去向:体检记录组成:编号+项目编号+用户编号+体检时间
    数据流名称: 体检项目

    别名:无简述: 信息管理员录入体检项目来源: 信息管理员去向: 体检套餐组成: 项目编号+项目名称+合适年龄+项目详情
    数据存储名称:预约记录

    别名:无简述:记录用户预约体检成功后的相关信息组成:编号+套餐编号+用户编号+预约时间组织方式:索引文件,以火纹编号为关键字查询要求:要求能立即查询
    数据存储名称:体检记录

    别名:无简述:记录用户体检完成后的相关信息组成:编号+项目编号+用户编号+体检时间组织方式:索引文件,以火纹编号为关键字查询要求:要求能立即查询
    数据存储名称:体检套餐

    别名:无简述:由若干体检项目组合成的体检项目集合组成:套餐编号+套餐名称+合适年龄+合适性别+指标意义组织方式:索引文件,以火纹编号为关键字查询要求:要求能立即查询
    加工名:处理预约体检

    编号:1激发条件:接受到合格的预约体检信息时优先级:普通输入:合格预约体检信息输出:记录到预约信息
    加工名:查询体检记录

    编号:2优先级:普通输入:从体检记录存储中查询体检记录信息输出:体检记录信息

    三、详细设计3.1 概念模型设计
    3.2 关系模型设计
    用户(ID,姓名,性别,手机号,等级,密码,年龄,身份证号)
    预约记录(ID,套餐ID,用户ID,预约时间 ,处理状态)
    体检记录(ID,项目ID,用户ID,体检时间)
    套餐(ID,套餐名称,合适年龄,合适性别,指标意义)
    关联表(ID,项目编号,套餐编号)
    体检项(ID,项目名称,合适年龄,项目详情)

    3.3 物理模型设计体检中心管理系统-用户物理模型

    体检中心管理系统-项目与套餐物理模型

    体检中心管理系统-体检、预约记录物理模型

    四、系统功能模块说明4.1 用户注册模块
    功能描述:此模块的主要功能是实现用户注册。系统的用户必须在注册获得合法身份之后才能登录系统进行对应的操作
    输入:手机号、密码
    输出:系统合法用户

    4.2 用户登录模块
    功能描述:此模块的主要功能是实现用户登录。系统的用户在注册之后,登录系统进行对应的操作
    输入:手机号、密码
    输出:登录成功

    4.3 修改用户信息模块
    功能描述:此模块的主要功能是实现用户信息的修改。系统用户在登录成功后,可修改自己的个人信息
    输入:姓名、性别、手机号、身份证号
    输出:修改成功

    4.4 在线预约体检模块
    功能描述:此模块的主要功能是实现用户预约体检。系统用户在登录成功后,可进行预约体检
    输入:套餐类型、预约体检时间
    输出:预约成功

    4.5 查看预约记录模块
    功能描述:此模块的主要个功能是实现用户查看预约记录。系统用户在登录成功后,可查看自己的历史预约体检记录,默认是所有历史记录,可查询具体某一条记录
    输入:无
    输出:历史预约体检记录

    4.6 用户信息管理模块
    功能描述:此模块的主要功能是系统管理员与体检中心工作人员登录后进行查看、修改用户信息、禁用用户
    输入:姓名、性别、登录名、电话
    输出:修改成功

    4.7 用户角色权限管理模块
    功能描述:此模块的主要功能是系统管理员与体检中心工作人员登录后给系统用户进行角色分配和权限的管理
    4.8 登录日志模块
    功能描述:此模块的主要功能是系统管理员与体检中心工作人员登录,查看所有用户登录的信息日志
    输入:无
    输出:用户登录日志信息

    4.9 体检项目管理模块
    功能描述:此模块的主要功能是系统管理员与体检中心工作人员登录后,进行体检项目的增加与删除
    输入:项目名称、项目描述
    输出:添加体检项目成功

    4.10 体检套餐管理模块
    功能描述:此模块的主要功能是系统管理员与体检中心工作人员登录后,进行体检套餐的生成
    输入:套餐名称、合适年龄、合适性别、指标意义
    输出:创建套餐成功

    4.11 查询预约记录模块
    功能描述:此模块的主要功能是系统管理员与体检中心工作人员登录后,进行查询用户预约记录
    输入:无
    输出:用户预约记录信息

    4.12 体检记录管理模块
    功能描述:此模块的主要功能是系统管理员与体检中心工作人员登录后,进行查询用户体检记录
    输入:无
    输出:用户体检记录信息

    五、系统实现服务端项目结构图

    客户端项目结构图

    5.1 主界面
    主页,未登录用户可进行注册、登录、查看体检套餐操作,注册登录用户可进行体检在线预约、修改个人信息、查看体检套餐、查看预约记录操作。
    5.2 注册模块
    进入主页面,点击注册按钮,进入注册页面。输入合法的手机号、密码,点击注册按钮,注册完成。
    5.3 登录
    进入主页面, 点击登录按钮,输入存在的用户名和密码,点击登录。若密码错误,则弹出密码错误框,若密码正确,进入主页面。若用户未注册,可点击注册按钮,进入注册页面,进行注册。
    5.4 修改个人信息
    进入主页面, 用户注册登录后,可点击用户下拉框,选择修改信息按钮,进入修改信息页面。用户可修改合法的姓名、性别、手机号、身份证信息,点击确定按钮进行修改。
    5.5 在线预约
    进入主页面,用户点击在线预约下拉框,选择在线预约按钮,进入在线预约页面。用户选择套餐类型,体检时间点击确定按钮,进行在线预约。
    5.6 预约记录
    进入主页面,用户点击在线预约下拉框,选择预约记录按钮,进入预约记录页面。用户可查找并查看用户的历史体检预约记录。
    5.7 后台管理登录
    进入体检中心管理系统登录页面,系统管理员与体检中心工作人员输入合法的用户名和密码,点击登录按钮。
    5.8 用户信息
    进入体检中心管理系统,系统管理员与体检中心工作人员可查看、修改、禁用用户信息,可以进行登录名,姓名的模糊查询。
    5.9 角色分配与权限管理

    进入体检中心管理系统,系统管理员可进行用户的角色分配与权限管理。角色:工作人员、普通用户、系统管理员,默认为普通用户。权限管理,设置用户对每项功能的权限。可以进行登录名,姓名的模糊查询。
    5.10 登录日志
    进入体检中心管理系统,系统管理员与体检中心工作人员可查看所有用户的登录日志。日志包括用户名称、用户性别、联系电话、登录地址、登录时间。
    5.11 体检项目管理
    进入体检中心管理系统,系统管理员与体检中心工作人员可对体检项目进行添加、删除、批量删除操作,可以进行模糊查询。添加项目完善信息即可。
    5.12 体检套餐管理
    进入体检中心管理系统,系统管理员与体检中心工作人员可对体检套餐进行添加删除、修改、上传套餐图片操作,可以进行体检套餐名称、合适性别的模糊查询。点击编辑套餐,可添加已有的体检项目。
    5.13 预约记录
    进入体检中心管理系统,系统管理员与体检中心工作人员可查看预约记录、生成体检记录。可以进行体检套餐名称、用户名的模糊查询。
    5.14 体检记录
    进入体检中心管理系统,系统管理员与体检中心工作人员可对普通用户预约记录进行生成体检记录信息。可以进行体检套餐名称、用户名的模糊查询。
    总 结课程设计是我们小组的在本学期生涯中的最后一个环节,这不仅是对学习基础知识和专业知识的一种综合应用,更是对我们所学知识的一种检测与丰富,它是一次综合的再学习、再提高的过程,这一过程对我们的学习能力、独立思考及工作能力也是一个培养。
    参考文献[1] 明日科技.Java从入门到精通.第五版[M].清华大学出版社.2018
    [2] 罗如为. Java Web开发技术与项目实战[M].水利水电出版社.2018
    [3] 汪云飞.JavaEE开发的颠覆者[M].电子工业出版社.2016
    [4] 孙卫琴.Tomcat与Java Web开发技术详解[M].电子工业出版社.2009
    [5] 葛萌,黄素萍,欧阳宏基. 基于Spring MVC框架的Java Web应用
    [6] 孙卫琴 精通hibernate[M]电子工业出版社 2005年4月 100-120
    [7] 林信良 spring2.0技术手册[M]电子工业出版社 2006年6月 50-100
    [8] 傅鹏,殷旻昊.基于Springmvc+spring+hibernate+ajax技术的科研管理系统设计
    [9] 耿祥义编著.jsp基础编程[M].清华大学出版社,2004.55-162
    [10] 姜承尧.高性能网站MySQL数据库实践[M].维普中文科技期刊数据库.2013
    [11] 杨占胜.JSP WEB应用程序开发教程[M].电子工业出版社.2018
    [12] 王宜贵 软件工程[M] 北京:机械工业出版社,2002:20-79
    [13] 萨师煊,王珊.数据库系统概论(第三版)[M].北京:高等教育出版社,1998.
    1 评论 5 下载 2020-08-05 10:47:44 下载需要15点积分
  • 基于Java和Sql Server 2000实现的学生选课管理系统

    一、课程设计任务完成学生选课管理系统的开发。
    二、需求描述本系统是一个单机版的小型的学生选课管理系统,在本系统中,开发了一个面向管理员、学生和教师这三个对象的教务平台,对学生提供的服务有登录、选课、、修改登录密码、和查询成绩这几个服务,所选课程总数不能超过3门;对教师提供的服务有登录、修改登录密码和登录成绩;对管理员提供的服务有登录开设学生和教师帐号、删除学生和教师帐号的服务。
    三、系统总体设计3.1 系统架构设计
    架构

    单机
    运行软件环境

    windows XP SP3jdk1.6
    开发环境

    硬件平台
    CPU:P41.8GHz内存:256MB以上
    软件平台:windows XP SP3 、jdk1.6
    操作系统:WindowsXP数据库:SQL Server 2000、SQLServer SP4补丁开发工具:Eclipse 3.3分辨率:1024*768


    3.2 功能模块设计
    各模块功能:

    登录界面:登录界面是有帐号,密码两个JTextField,管理员帐号一字母A开头,教师帐号一字母T开头,学生帐号以字母S开头,登录帐号或密码输入错误会弹出相应的提示对话框
    学生信息管理模块:管理员用于添加和删除学生信息的模块
    教师信息管理模块:管理员用于添加和删除教师信息的模块
    教师密码修改模块和学生密码修改模块:管理员添加的用户帐号的初始密码与用户的帐号相同,用户通过密码修改模块可以自己需改密码
    教师录入成绩模块:教师可以浏览选修自己课程的学生的信息并且录入该学生的成绩
    学生选择选修课模块:该模块通过表格的形式将所有课程列出来,学生可以根据个人兴趣选择不同的课程,每个学生选择的课程数目不能超过3门,而且不能重复选课,否则会弹出对话框,提示用户查看已经选择了的课程
    学生查询成绩模块:通过表格的形式将该学生选择了的课程列出来,如果教师有录入成绩,则可以看到自己的课程成绩

    3.3 数据库设计E-R图

    关系模式

    学生(学生学号,学生姓名,教师性别,教师生日,所在班级)
    教师(教师编号,教师姓名,教师性别,教师生日,教师职称,所在院系)
    课程(课程号,课程名,学分,选课人数)
    选课(课程号,学生学号,成绩)
    授课(课程号,教师编号,上课地点)

    数据库管理系统
    Microsoft SQL Server 2000
    数据库命名
    StudentManager
    数据库表
    Logon(登录帐号密码),主要用来保存用户登录信息。



    字段名
    数据类型
    长度
    是否为空
    是否主键




    UserID
    char
    10
    不为空
    主键


    Passwordr
    charr
    10




    StudentTable1(学生信息表),主要用来保存学生信息。



    字段名
    数据类型
    长度
    主键否
    是否为空
    描述




    StudentID
    Char
    10
    主键
    不为空
    学生学号


    StudentName
    Char
    10

    不为空
    学生姓名


    StudentSex
    Char
    2

    不为空
    学生性别


    StudentBirthday
    Datetime
    8


    学生生日


    Class
    char
    16


    所在班级



    TeacherTable1(教师信息表),用来储存教师的基本信息。



    字段名
    数据类型
    长度
    主键否
    是否为空
    描述




    TeacherID
    Char
    10
    主键
    不为空
    教师编号


    TeacherName
    Char
    10

    不为空
    教师姓名


    TeacherSex
    Char
    2

    不为空
    教师性别


    TeacherBirthday
    Datetime
    8


    教师生日


    Post
    char
    10


    教师职称


    Department
    char
    20


    所在院系



    CourseTable(课程信息表)



    字段名
    数据类型
    长度
    主键否
    是否为空
    描述




    CourseID
    Char
    16
    主键
    不为空
    课程编号


    CourseName
    Char
    16

    不为空
    课程名


    Point
    Char
    8

    不为空
    学分


    StuNumber
    Datetime
    4

    不为空
    选课人数



    ScoreTable(学生成绩表),用于存储学生成绩。



    字段名
    数据类型
    长度
    是否为空
    是否主键




    CourseID
    char
    16
    不为空
    主键


    StudentID
    char
    10
    不为空
    主键


    Score
    int
    4




    TeachTable(j教师授课表)



    字段名
    数据类型
    长度
    是否为空
    是否主键




    CourseID
    char
    16
    不为空
    主键


    TeacherID
    char
    10
    不为空
    主键


    Location
    int
    10




    数据库账户及权限 (截图)
    学生账户表

    教师账户表

    用户登录表

    数据库存储过程
    AllCourse
    create proc AllCourseasbegin select x.CourseID,x.CourseName,x.Point ,y.TeacherName,y.Post,z.Location,x.StuNumber from Course x,TeacherTable1 y,TeachTable z where x.CourseID=z.CourseID and y.TeacherID=z.TeacherIDend
    DeleteLogon
    create proc DeleteLogon(@id char(10))asbegin delete from Logon where UserID=@idend
    DeleteStudent
    create proc DeleteStudent(@id char(10))asbegin delete from StudentTable1 where StudentID=@idend
    DeleteTeacher
    create proc DeleteTeacher(@id char(10))asbegin delete from TeacherTable1 where TeacherID=@idend
    InsertLogon
    create proc InsertLogon(@id char(10))asbegin insert into Logon values(@id,@id)end
    InsertStudent
    create proc InsertStudent(@userid char(10),@username char(10),@sex char(2),@birth datetime,@class char(10))asbegin insert into StudentTable1 values(@userid ,@username,@sex,@birth,@class)endreturn
    InsertTeacher
    create proc InsertTeacher(@userid char(10),@username char(10),@sex char(2),@birth datetime,@post char(10),@department char(10))asbegin insert into TeacherTable1 values(@userid ,@username,@sex,@birth,@post,@department)endreturn
    IsExistsStu
    create proc IsExistsStu(@id char(10))asbegin select * from StudentTable1 where StudentID=@idend
    IsExistsTea
    create proc IsExistsTea(@id char(10))asbegin select * from Teachertable1 where TeacherID=@idend
    ProcAllStu
    create proc ProcAllStuasbegin select * from StudentTable1end
    ProcAllTea
    create proc ProcAllTeaasbegin select * from TeacherTable1end
    ProcLogon
    create proc ProcLogon(@userid char(16),@password char(10))asbegin select * from Logon where UserID=@userid and Password=@passwordendreturn
    ProcModify
    create proc ProcModify(@id char(10),@password char(16))asbegin update Logon set Password=@password where UserID=@idend
    ProcStudent
    create proc ProcStudent(@id char(10))asbegin select * from StudentTable1 where StudentID=@idend
    SelectCourse
    create proc SelectCourse(@id char(10),@courseid char(16))asbegin insert into ScoreTable values(@courseid,@id,null)end
    SelectedCourse
    create proc SelectedCourse(@id char(10))asbegin select * from ScoreTable where @id=StudentIDend
    SelectedCourseNum
    create proc SelectedCourseNum(@id char(10))asbegin select COUNT(*) from Scoretable where StudentID=@idend
    SelectedDetail
    create proc SelectedDetail(@id char(10))asbegin select x.CourseID,x.CourseName,x.Point ,y.TeacherName,y.Post,z.Location,s.Score from Course x,TeacherTable1 y,TeachTable z,ScoreTable s where @id=s.StudentID and x.CourseID=z.CourseID and z.TeacherID=y.TeacherID and x.CourseID=s.CourseIDend
    3.4 系统界面设计3.4.1 窗体功能描述登录界面Logon.java

    管理员以帐号Admin密码123登录成功进入管理员的信息管理界面,通过点击“学生信息管理”和“教师信息管理”进入不同的管理界面,学生信息管理界面如下:

    教师信息管理界面如下:

    以学生帐号(如:帐号:S001001,密码:S001001)登陆成功后进入如下界面,首先显示的 是学生的基本信息:

    点击“课程列表”按钮进入如下界面:

    根据自己的跟人兴趣选择课程,选择的课程数目不能超过3门否则弹出对话框如下:

    点击“确定”跳转到已选课程列表。
    在主界面点击“已选课程”按钮也可以进入下面的界面查看已经选择的课程:

    以教师帐号(如:帐号:T01001,密码:T01001)登陆成功后进入如下界面,首先显示的是教师的基本信息:

    点击“录入成绩”可以通过表格来录入学生的成绩,界面如下图所示:

    3.4.2 页面/窗体关系结构图
    四、系统实现技术小结为了方便管理,将数据库的封装分成两部分,数据库资源配置文件和封装数据库操作的类SqlManager.java。
    数据库资源配置文件sysConfig.properties
    #Sepecify the system type: window or unixsystem-type=windows#specify the database's typedatabase-type=sqlserver#specify some parametersDBhost=localhostDBport=1433DBname=StudentManagerDBuser=saDBpassword=
    封装数据库操作的类:SqlManager.java
    import java.sql.*;import java.util.*;import javax.swing.JOptionPane;public class SqlManager { private static SqlManager p=null; private PropertyResourceBundle bundle; private static String jdbcDriver=null; private static String split=null; private String DBType=null; private String DBhost="localhost"; private String DBname=""; private String DBport=""; private String DBuser=""; private String DBpassword=""; private Connection Sqlconn=null; private Statement Sqlstmt=null; private String strCon=null; private SqlManager(){ try{ bundle=new PropertyResourceBundle(SqlManager.class. getResourceAsStream("/sysConfig.properties")); this.DBhost=getString("DBhost"); this.DBname=getString("DBname"); this.DBport=getString("DBport"); this.DBuser=getString("DBuser"); this.DBpassword=getString("DBpassword"); String system_type=getString("system-type"); if(system_type!=null){ if(system_type!=null){ if(system_type.toLowerCase().equals("widows")) split=";"; else if(system_type.toLowerCase().equals("unix")) split=":"; } String database_type=getString("database-type"); this.DBType=database_type; if(database_type!=null){ if(database_type.toLowerCase().equals("mysql")){ jdbcDriver="com.mysql.jdbc.Driver"; strCon="jdbc:mysql://"+DBhost+":"+DBport+"/"+DBname; } else if(database_type.toLowerCase().equals("oracle")){ jdbcDriver="oracle.jdbc.driver.OracleDriver"; strCon="jdbc:oracle:thin:@"+DBhost+":"+DBport+":"+DBname; } else if(database_type.toLowerCase().equals("sqlserver")){ jdbcDriver="com.microsoft.jdbc.sqlserver.SQLServerDriver"; strCon="jdbc:microsoft:sqlserver://"+DBhost+":"+DBport+";DatabaseName="+DBname; } } } }catch(Exception e){ e.printStackTrace(); } } public static SqlManager createInstance(){ if(p==null) { p=new SqlManager(); p.initDB(); } return p; } private String getString(String s) { return this.bundle.getString(s); } public void initDB(){ System.out.println(strCon); System.out.println(jdbcDriver); try{ Class.forName(jdbcDriver); }catch(Exception ex){ System.err.println("Can't Find Database Driver."); } } public void connectDB(){ try{ System.out.println("SqlManager:Connecting to database..."); Sqlconn=DriverManager.getConnection(strCon,DBuser,DBpassword); Sqlstmt=Sqlconn.createStatement(); }catch(SQLException ex){ System.err.println("connectDB"+ex.getMessage()); } System.out.println("SqlManager:Connect to database successful."); } public void closeDB(){ try{ System.out.println("SqlManager:Close connection to database..."); Sqlstmt.close(); Sqlconn.close(); }catch(SQLException ex){ System.err.println("closeDB:"+ex.getMessage()); } System.out.println("Sqlmanager:Close connection successful."); } public int executeUpdate(String sql){ int ret=0; try{ ret=Sqlstmt.executeUpdate(sql); }catch(SQLException ex) { System.out.println("executeUpdate:"+ex.getMessage()); } return ret; } public ResultSet executeQuery(String sql){ ResultSet rs=null; try{ rs=Sqlstmt.executeQuery(sql); }catch(SQLException ex){ System.err.println("executeQuery:"+ex.getMessage()); } return rs; } public static void main(String args[]){ SqlManager.createInstance().connectDB(); SqlManager.createInstance().closeDB(); }}
    五、课程设计体会该系统主要实现了学生选课的功能,这个系统是我独立完成,从需求分析,界面的搭建,到数据库的连接,表格,存储过程和存储过程等的建立,在这段时间的摸索中,我确实学到了很多东西,特别是对以前不太了解的Java Swing组件有了更深刻的了解。比如JTable,对于它的用法我在网上找了很多资料,JTable的建立有各种不同的方法,可以使用DefaultTableModel类来实现,如DefaultTableModel dtm=new DefaultTableModel(new Object [] {“”,”课程编号”,”课程名称”,”学分”,”任课教师”,”教师职称”,”上课地点”,”以选人数”},0));然后再table.setModel(dtm); 或者继承AbstractTableModel类,还有对于如何在JTable中添加Swing组件,原本我是直接新建一个JcheckBox对象直接添加到表格的单元格里,结果发现只能显示出一串字符串,上网查找后才知道,要用DefaultCellEditor来添加Swing组件,再设置setCellRenderer(new MyTableRenderer()) 这是一个实现了TableCellRenderer接口的JCheckBox。TableCellRenderer可以看做是Swing组件的呈现器,这样Table就会把内容显示绘制交给JCheckBox了。
    对于数据库,我尽量将对数据库的操作放在存储过程中,这样的抽象和封装使得源程序代码更加容易理解,而且在web应用系统中也可以避免发生不安全的状况,我想这是一个号的程序员应当要养成的习惯,在这次的课程设计中,层次化,模块化,抽象化也是我学到的一个重要的经验,参考一些资料后发现模块化能使程序设计更加简单,设计代码时目标更加明确,效率更高,以前虽然也知道这些道理,但自己真正实施起来却感到无从下手,比如前面的数据库操作和数据库资源配置文件,就是我从书中看来的,这样做的好处是,在程序中操作数据库的时候避免了使用很多try和catch语句,是代码更加简洁,更容易理解,此外需要连接不同的数据库时只要修改数据库的资源配置文件sysConfig.properties就可以了。原本我是想用jsp 做一个web应用程序的,因为对于学生选课系统做成单版的确实没什么实用性,但是我对jsp还不太熟悉,所以这次先做个单机版的,以后我会尝试用jsp来做这个系统。
    7 评论 159 下载 2019-04-29 20:07:05 下载需要13点积分
  • 基于JSP和MYSQL的酒店房间管理系统

    摘 要随着社会服务行业的不断发展,使用计算机系统软件来管理整个酒店业务的 要求也逐年提高,我国一些酒店都采用了相关的酒店管理系统来管理酒店业务, 以解决酒店全凭原始的手工记录管理效率低、易出错的缺陷;另外酒店行业对自 身提供服务的质量和能力也有了更高的要求,因此,酒店管理系统正因此而越来 越受到管理者的重视。
    本课题结合酒店管理系统的开发过程,详细介绍如何针对酒店的需求,将先 进的软件应用技术融入现代酒店管理系统当中,开发出功能更完善的酒店管理系 统。本酒店管理系统采用 JSP 技术、MYSQL 数据库,基于 B/S 结构开发实现,系 统主要包括两大功能模块,即用户功能模块和管理员功能模块。本系统采用当前 流行的 B/S 结构,将酒店管理各方面信息集中存储于数据库,实现了信息的实时 共享,适合酒店向集团化发展的需要。系统具有运行稳定、数据结构严谨、稳定 性强等特点。
    关键词 :酒店管理系统; MYSQL 数据库; JSP 技术; B/S 结构
    1 概述1.1 研究背景网络的快速发展从根本上更改了世界的企业的管理方式,自二十世纪九十年 代开始,我国的很多企业就设想可以通过互联网来进行管理企业相关信息。因为 当时存在很多的原因,比如企业的声誉非常不好进行认证、互联网的相关法律法 规也不够完善、开发技术也不够成熟等,阻碍了互联网在各大企业中的发展速度。 进入二十一世纪以后,我国经济有了快速的发展,限制企业管理的各个难题逐一 被解决,国内各大企业都加入到了电子信息化的管理模式中来。
    由于我国经济发展水平正在飞速发展,酒店这个行业作为服务行业中的重要 组成部分,己经越来越显示出其强劲的发展势头。随着我国酒店的不断增多,酒 店这一行业竞争也越来越激烈,因此需要开辟一个新的管理方式。我国酒店业利 用计算机管理系统来加强管理、提高服务水平,虽然至今已有多年的历史,但由 于我国起步发展较晚,只是一些浅层次应用,大多数还停留于七拼八凑的 MIS 系 统水平,甚至还仅限于简单的电算化和信息发布阶段,与国际酒店业先进信息化 应用的差距非常明显。信息化程度不高导致企业决策失误、市场反应速度缓慢等, 己经成为制约我国酒店业进一步发展的重要瓶颈。
    鉴于目前酒店管理的现状,结合信息管理系统的发展,该 JSP 酒店管理系统 充分运用 MIS 的总体思想,综合应用了 MYSQL、JSP 等技术开发,具有很好的管 理功能,真正完好地达到服务于用户的计划。
    1.2 研究现状根据最新调查得知,在此之前对酒店信息的管理通常是基于文本,表格等纸 介的手工处理,酒店客户信息情况的统计和核实等通常采用人工检查与核实,以 及对客房信息的管理等通过人工计算或手抄等方式进行,信息量大,但在数据处 理方面存在工作量大且易出错,其次还存在数据繁多与数据丢失等现象出现,而 且还不方便查找,在总体上存在缺乏系统与规范的信息管理系统现象,为了提高 工作效率我们急需开发出这套 JSP 酒店管理系统。
    随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信 息的重要场所,二十一世纪是信息的时代,所以信息的交换和信息流通显得特别重要。因此,使用计算机来管理酒店信息成为必然。开发合适的酒店管理系统, 可以方便酒店管理者对客房、预订以及会员等信息的管理,提高酒店管理的工作 效率及查询效率,有利于更好的了解客户、管理客户。
    1.3 研究意义JSP 酒店管理系统是酒店业务流程的重组整合用户信息资源,以更有效的方 法来管理酒店业务,从而降低运营成本,为客户提供更经济、快捷、周到的服务, 保持和吸引更多的客户,以求最终达到酒店利润最大化的目的。
    JSP 酒店管理系统与传统方式管理方式比较有很多的优点如:

    查询比较方便:JSP 酒店管理系统提供了非常多的查询途径,可以通过各种途径进行查询, 快速又准确
    信息量大:与过去的管理方式比较,JSP 酒店管理系统能够提供方便的酒店信息
    成本比较低,风险小,不受地点的限制:JSP 酒店管理系统最突出的优势是,管理员通过本系统可快速进行酒店相关 信息的管理,这样就使管理者直观的了解酒店相关信息,大大节省了手工翻阅的 时间。同时为用户提供了一个便利的查询预订的途径,更好的为客户服务

    2 系统相关技术介绍2.1 开发工具本系统的设计主要运用了 MyEclipse 和 Tomcat 后台服务器技术,设计时中 采用了 JSP 技术完成了页面设计过程,接下来我们主要对 MyEclipse 和 Tomcat 进行说明。
    2.1.1 MyEclipseMyEclipse,通常用来设计 Java, J2EE 的 Eclipse 插件集合,利用它可以 完成对数据库和 J2EE 的开发。通过对应用程序服务器进行整合,可以大大的增 强运算速度。MyEclipse 的功能十分强大,几乎涵盖了各种设计功能。
    2.1.2 TomcatTomcat 是一种是一个免费的开放源代码的 Web 应用服务器。在访问客户比 较少的情况下被经常采纳,在设计 JSP 程序时成为最好的选择。换句话说,将 Tomcat 服务器安装到一台电脑上时,可通过它对 HTML 页面的访问请求进行配合。 事实上,Tomcat 可以看成 Apache 服务器基础上的延伸,但它工作时相对比较独 立,因此当 tomcat 工作时,事实上它是看成一个与 Apache 服务器相对独立的 进程运行的。
    2.2 JSP 技术JSP 程序使用了 Java 编程语言,JSP 技术可以对动态网页进行封装。通过 tags 和 script,网页还能访问存在于服务端的资源的应用逻辑。JSP 可以分离网页逻 辑与网页设计和显示,对可重用的基于组件的开发进行支撑,更容易的对基于 Web 的应用程序进行设计。
    当 Web 服务器接收到访问 JSP 网页的请求时,首先运行的程序段,接下来将 JSP 文件中的 HTML 代码和运行效果一并返还给用户。通过 Java 文件的插入能够 对数据库、网页多重定向等运行,从而满足构建动态网页所需要的程序。JSP 和 Servle 相同,都可以通过服务器端运行。由于能够将一个 HTML 文本返回给用户 端,所以用户端具备浏览器就可以进行浏览。HTML 程序和穿插在内部的 Java 程 序可以构建 JSP 网页。在服务器被用户端访问时,能够处理相应的 Java 代码, 然后将产生的 HTML 页面再返回给用户端的浏览器。JSP 的设计关键是 Servlet, 通常大型的 Web 应用程序的设计成果也通过 Java Servlet 和 JSP 的协作。JSP既拥有了方便快捷的 Java 程序,又统统的面向用户,既实现了平台的无关性危 险还比较小,可以具备互联网的全部优势。
    JSP 技术的优点:

    一次编写,到处运行。除了系统之外,代码无需做任何改动
    系统的多平台支持。通常情况下,能够在任何情况下的全部平台上进 行设计,能够安排在任何情况中,也能够在任何情况下进行发展。相比 ASP/.net 来说,优点是显而易见的
    强大的可塑性。通过一个不大的 Jar 程序能够对 Servlet/JSP 进行运 行,也能够通过很多服务器进行集群和负载平衡,甚至能够通过多台 Application 解决问题。单台服务器到多台服务器,Java 展现了一个强大的功能
    具有强大和多样化的开发工具支持。Java 已经有了很多的设计方法, 何况大部分工具都是没有花费的,这中间有很多都在多种平台之下顺畅的进展
    支持服务器端组件。只有很有力的服务器端组件才能支撑 web 运行,因 此开发者可以在调用 web 页面时通过另外的开发工具来达成纷乱效用的组件,来 加强系统的可操作性。JSP 可以通过完善的 JAVA BEANS 组件来达成纷乱的商务功能

    内部对象表现出:request 用户端请求,此请求会涵盖来自 GET/POST 请求 的参数; response 网页传回用户端的反应;管理 pageContext 网页的属性; session 与请求相关的会话;application servlet 正在进行的内容;out 用来 输送响应的输出流; config 代码片段配置对象;page JSP 网页本身。
    2.3 B/S 结构在三层体系结构的 B/S(Browser/Server,浏览器/服务器结构)系统中, 用户可以通过浏览器向分布在网络上的众多服务器发出请求。B/S 系统极大地简 化了客户机的工作量,客户机上只需要安装、配置少量的客户端运行软件即可, 服务器将担负大量的工作,对数据库的访问以及应用程序的执行都将由服务器来 完成。
    B/S 架构的不断成熟,主要使用 WWW 浏览器技术,结合多种浏览器脚本语言, 用通用浏览器需要实现原本复杂的专有软件来实现的强大功能,并节约了开发成 本,是一种新的软件架构。B/S 系统包括:表示逻辑层,控制逻辑层,数据展现 层,三层是相对独立又相互关联。
    2.4 MYSQL 数据库在软件项目中,通过使用数据库来操作数据,可以保证数据的独立性、一致 性和安全性,为系统提供有效地访问数据的方式,同时为程序员减少了应用程序 的开发时间。
    常见的数据库无非分为两类,一类是关系型数据库(Oracle,DB2,MySQL, SQL Server )和非关系型数据库(NoSql、MongeDB)。不同的数据库有各自的优缺 点,此处不做具体介绍。
    MySQL 支持多线程的特点,可以方便的利用系统资源,有效提高速度,而 且提供了 TCP/IP、ODBC 和 JDBC 等多种方式途径来连接数据库;虽说其功能 不够强大、规模也相对较小,但是对于本系统来说足够了,同时也可以进行二次 开发的数据库表结构空间的扩展。
    使用 MySQL 建立系统数据库,不仅有利于前期对数据的整合处理操作,同 时利于后期的二次开发的数据扩展操作,对于有限级的数据处理,MySQL 可以 很好的胜任。
    3 系统分析3.1 可行性分析对所有的系统来说,都有可能会受到时间和空间上的制约。所以,我们在设 计每一个项目的时候,必须对该系统实行可行性分析,这样不但能够降低项目的 危害,还能改降低人力、物力和财力的损耗。下面对技术、经济、操作和法律四 个方面进行介绍。
    3.1.1 技术可行性JSP 酒店管理系统的开发基于 B/S 模式,主要包括前端应用程序的开发以及 后台数据库的建立和维护两个方面。对于应用程序的开发要求具备功能要完备、 使用应简单等特点,而对于数据库的建立和维护则要求建立一个数据完整性强、 数据安全性好、数据稳定性高的库。
    在过去很长一段时间,网络软件的开发都采用客户端(Client)/服务器(Server)模式,即所谓的 C/S 模式。比如在 Java 中,可以通过 Socket 实现一 个客户端/服务器的架构。在这种模式下,主要业务逻辑都集中与客户端的程序, 因此,必然导致以下问题:

    系统的安装、运行、调试、维护和升级的困难
    在 JSP 酒店管理系统中,客户端分布在信息逻辑和用户界面之间,必然增 加了系统的安全隐患

    正是由于 C/S 架构的这些问题,人们逐渐接受了基于浏览器/服务器(Server) 结构的系统,即 B/S 模式。在 B/S 这个模式中,用通用的浏览器来取代之前的客 户端系统程序就是主要的核心。
    B/S 模式对 C/S 模式虽然只作了少许改动,但却带来了很大的优势:因为客 户端统称为浏览器,所以,应用程序在下载、升级、维护时,仅需要在服务器端 进行配置就可以了。所有的配置工作均集中在服务器端,大大的解决了了系统的 安全隐患。
    虽然 B/S 模式拥有很多优势,但是因为在客户端能够利用编程对象仅仅是浏 览器,因此,之前在 C/S 模式下很简单就能实现的一些客户端功能,在 B/S 模式 下,却变的很难实现甚至无法实现。
    虽然如此,B/S 模式仍然是当前许多应用系统的首要选择模式。
    对于计算机专业毕业的学生,对数据库比较熟悉,该系统运行 MYSQL 数据库, 掌握了 Java 编程语言,建立这样一个系统应该在能力范围之内。
    因此从技术方面讲开发此系统是可行的。
    3.1.2 经济可行性本系统采用的软件都是开源的,这样能够削减很多的精力和资源,降低开发 成本。同时也能够提升设计的作用,JSP 酒店管理系统对计算机配置的条件要求 很低,即使是网吧淘汰下来的计算机也能够满足需要,因此,本系统在经济上是 完全具有可行性的。
    3.1.3 操作可行性JSP 酒店管理系统是基于 B/S 模式,通过电脑进行访问和操作,且界面简单 易操作,用户只要平时使用过电脑都能进行访问和操作。本系统具有易操作、易 管理、交互性好的特点,在操作上是非常简单的。因此本系统可以进行开发。
    3.1.4 法律可行性此 JSP 酒店管理系统是自己设计的管理系统,具有很大的实际意义。开发环 境软件和使用的数据库都是开源代码,因此对这个系统进行开发与普通的系统软 件设计存在很大不同,没有侵权等问题,在法律上完全具有可行性。
    总而言之,设计一个 JSP 酒店管理系统具有效率高,操作简便,降低成本等 优点,所以,建立一个 JSP 酒店管理系统是非常必要的。
    3.2 用户需求分析JSP 酒店管理系统主要满足 2 种类型用户的需求,这 2 种类型用户分别为管理员和用户。用户间的静态结构图如图 3-1 所示:

    3.3 性能需求分析为了保证JSP酒店管理系统能够长期、稳定、高效的运行,必须要保证系统 开发的性能。在JSP酒店管理系统的开发过程中,必须用充分的方法确保系统的 安全性和有效性。我们要充分考虑以下几点:

    安全性:在信息化的时代,信息就是宝贵的财富,保证信息的安全,特别是 个人信息更要求可靠的安全性
    先进性:结合当前流行趋势,开发要符合用户的需求,能够快速准确的实现 酒店信息管理相关功能
    可扩展性:JSP酒店管理系统给酒店信息管理带来了极大的便利,提高了管 理效率,备受管理人员的关注,因此在开发JSP酒店管理系统的过程中,我们要 考虑到系统的可扩展性,便于将来系统的升级、更新
    有效性:有效性主要包括功能有效性,设计JSP酒店管理系统的功能一定要 最大限度地满足用户的需求

    3.4 系统流程分析3.4.1 操作流程为了保证系统的安全性,要使用本系统必须先登陆到系统中,管理员和用户 通过不同的账号和密码,登录到不同的管理界面。其登录流程图如图3-2所示。

    3.4.2 注册流程用户在注册账号的时候,首先进入注册界面,填写用户信息进行注册。用户 注册流程图如图3-3所示。

    3.5 系统用例分析3.5.1 管理员用例系统中的核心用户是系统管理员,管理员登录后主要功能有系统用户管理, 注册用户管理,酒店楼层管理,酒店类型管理,酒店客房管理,客房信息管理, 酒店活动管理,留言管理和系统管理。管理员用户的用例如图3-4所示。

    3.5.2 用户用例用户可以查看网站信息,包括首页,酒店活动,地理位置,客房信息,在线 留言,注册登录,登录后进入个人中心,包括个人资料管理,我的预订管理,入 住记录管理和退房记录管理,用户用例图如图3-5所示。

    4 系统设计4.1 系统结构设计JSP 酒店管理系统的设计与实现主要分为用户和管理员 2 个用户角色,系统 结构图 4-1 所示:

    4.2 系统功能模块设计4.2.1 功能概述JSP酒店管理系统分为三个用户角色,分别是管理员,员工和用户,其具体 功能如下:

    管理员功能模块: 管理员登录后主要功能有系统用户管理,注册用户管理,酒店楼层管理,酒店类型管理,酒店客房管理,客房信息管理,酒店活动管理留言管理和系统管理
    用户功能模块: 用户可以查看网站信息,包括首页,酒店活动,地理位置,客房信息,在线留言,注册登录,登录后进入个人中心,包括个人资料管理,我的预订管理,入 住记录管理和退房记录管理

    4.2.2 系统功能结构通过上述分析,得出本JSP酒店管理系统功能模块图如图4-2所示:

    4.3 系统顺序图顺序图表示交互、是指为得到一个期望的结果而在多个分类器角色之间进行的交互序列。
    4.3.1 登录模块顺序图
    4.3.2 添加信息模块顺序图
    4.4 数据库设计4.4.1 数据库设计原则在概念设计中,通常用四种方法: 自顶向下、自底向上、逐步扩张、混合策略,以它为骨架集成由自底向上策略中设计的各局部概念结构 在物理结构设计阶段首先分两步走:确定数据库的物理结构,在关系数据库中主要是指存取方法和存储结构。对 物理结构的评价是时间和空间效率。选取正确的关系模式存取方法,常用的有:存取索引方法、聚簇存取、HASH 存取方法等。
    4.4.2 数据库实体在此阶段,用户可以参与和评价数据库系统的设计,从而有利于保证数据库 系统的设计与用户的需求相吻合。在概念模式的设计中,E-R模型法是最常见的 设计方法。
    通过上述分析对数据库的需求,与系统概念模型的特点及开发方法相结合, 我们可以建立E-R模型图,本系统的E-R图如下图所示:
    管理员信息实体E-R图如图4-5所示:

    酒店客房信息实体E-R图如图4-6所示:

    客房预订信息实体E-R图如图4-7所示:

    留言板信息实体E-R图如图4-8所示:

    入住登记信息实体属性图如图4-9所示:

    退房信息实体属性图如图4-10所示:

    4.4.3 数据库表设计本酒店管理系统需要后台数据库,本系统采用MYSQL数据库进行数据的存储, 下面介绍数据库中的各个表的详细信息。
    allusers 管理员信息表



    列名
    数据类型
    长度
    是否主键
    注释




    ID
    int
    1,1

    编号


    username
    varchar
    50

    用户名


    pwd
    varchar
    50

    密码


    cx
    varchar
    50

    权限


    addtime
    datetime


    添加时间



    jiudiankefang 酒店客房信息表



    列名
    数据类型
    长度
    是否主键
    注释




    id
    int
    1,1

    编号


    fanghao
    varchar
    50
    用户名
    房号


    louceng
    varchar
    50

    楼层


    leixing
    varchar
    50

    类型


    jiage
    varchar
    50

    价格


    yajin
    varchar
    50

    押金


    zhuangtai
    varchar
    50

    状态


    tupian
    varchar
    50

    图片


    beizhu
    varchar
    500

    备注


    addtime
    datetime


    添加时间



    kefangyuding 客房预订信息表



    列名
    数据类型
    长度
    是否主键
    注释




    id
    int
    1,1

    编号


    fanghao
    varchar
    50

    房号


    louceng
    varchar
    50

    楼层


    leixing
    varchar
    50

    类型


    jiage
    varchar
    50

    价格


    yajin
    varchar
    50

    押金


    yudingriqi
    varchar
    50

    预定日期


    yudingshiduan
    varchar
    50

    预定时段


    tianshu
    varchar
    50

    天数


    yudingren
    varchar
    50

    预订人


    xingming
    varchar
    50

    姓名


    shenfenzheng
    varchar
    50

    身份证


    beizhu
    varchar
    500

    备注


    issh
    varchar
    2

    是否审核


    addtime
    datetime


    添加时间



    liuyanban 留言板信息表



    列名
    数据类型
    长度
    是否主键
    注释




    Id
    int
    1,1

    编号


    cheng
    varchar
    50

    昵称


    xingbie
    varchar
    2

    性别


    QQ
    varchar
    50

    QQ


    youxiang
    varchar
    50

    邮箱


    dianhua
    varchar
    50

    电话


    neirong
    varchar
    500

    留言内容


    addtime
    datetime


    留言时间


    huifuneirong
    varchar
    500

    回复内容



    ruzhudengji 入住登记信息表



    列名
    数据类型
    长度
    是否主键
    注释




    id
    int
    1,1

    编号


    fanghao
    varchar
    50

    房号


    louceng
    varchar
    50

    楼层


    leixing
    varchar
    50

    类型


    jiage
    varchar
    50

    价格


    yajin
    varchar
    50

    押金


    xingming
    varchar
    50

    姓名


    shenfenzheng
    varchar
    300

    身份证


    ruzhuriqi
    varchar
    50

    入住日期


    lidianriqi
    varchar
    50

    离店日期



    tuifang 退房信息表



    列名
    数据类型
    长度
    是否主键
    注释




    id
    int
    1,1

    编号


    fanghao
    varchar
    50

    房号


    yajin
    varchar
    50

    押金


    xingming
    varchar
    50

    姓名


    shenfenzheng
    varchar
    50

    身份证


    jine
    varchar
    50

    金额


    feiyongjiesuan
    varchar
    50

    费用结算


    tuifangriqi
    varchar
    50

    退房日期


    tuifangren
    varchar
    50

    退房人


    beizhu
    varchar
    200

    备注


    issh
    varchar
    2

    是否审核


    addtime
    datetime


    添加时间



    5 系统的实现5.1 用户功能模块的实现5.1.1 系统主界面用户进入本系统可查看酒店活动、地理位置以及客房信息等,系统主界面如 下图5-1所示。

    5.1.2 用户登录界面用户要想实现酒店客房预订操作必须登录系统,用户登录界面展示如图5-2 所示。

    5.1.3 酒店客房信息界面用户可就如酒店客房信息界面查看客房详情信息,登录后并可进行预订和评 论操作,酒店客房信息界面展示如图5-3所示。

    5.1.4 客房预订界面用户在客房预订界面可输入预定日期、离店时间以及身份证等,客房预定界 面展示如图5-4所示。

    5.1.5 用户注册界面未有账号的用户可进入注册界面进行注册操作,用户注册界面展示如图5-5 所示。

    5.1.6 在线留言界面用户在在线留言界面可输入留言内容,进行留言操作,在线留言界面展示如 图5-6所示。

    5.1.7 我的预订管理界面用户登录后可进入我的预定管理界面查看个人预定信息,并可对其进行删除 操作,我的预定管理界面展示如图5-7所示。

    5.2 管理员功能模块的实现5.2.1 管理员登录界面管理员要想进入系统后台进行管理操作,必须登录系统,管理员登录界面展 示如图5-8所示。

    5.2.2 注册用户管理界面管理员登录后可查看注册用户信息,并可对其进行审核、修改和删除操作, 注册用户管理界面展示如图5-9所示。

    5.2.3 酒店楼层管理界面管理员可添加、修改和删除酒店楼层信息,酒店楼层管理界面展示如图5-10 所示。

    5.2.3 酒店客房管理界面管理员可添加、修改和删除酒店客房信息,酒店客房管理界面展示如图5-11 所示。

    5.2.5 预订信息查询界面管理员可查看用户客房预订信息,并可对其进行审核和添加预订入住操作, 预订信息查询界面展示如图5-12所示。添加预订入住界面展示如图5-13所示。
    预订信息查询界面

    添加预订入住信息界面

    6 系统测试6.1 系统测试目的与意义系统测试是开发一个管理信息周期中非常重要而且漫长的的阶段。其重要性 体现在他是保证系统质量与可靠性的重要关口,是对整个系统开发过程的最终审 查。
    系统测试的主要任务是尽可能的检查出程序中的错误,提高系统的可靠性, 主要的目的是位列检验系统“做得如何”。其中这一阶段又可以分为三个步骤: 模块测试;组装测试;确认测试;通过测试整个管理系统来确定能不能够满足用 户的需求。通过测试发现问题以后,我们要经过不断的调试找出错误具体原因和 位置,然后对其进行修改。
    6.2 测试方法在我们设计软件的过程中,测试系统常用的测试方法主要有两种:功能测试 和结构测试。
    功能测试也被叫做黑盒测试和数据驱动测试,是在已经知道系统应该具有的 具体功能的情况下,通过黑盒测试来测试系统功能是不是能够正常运行。在测试 时,将系统当做不能打开的盒子,在不管系统内部结构与特性的状况下进行测试, 它只检查系统功能是不是根据系统说明书的规定正常运行的,同时检测系统是否 能正确接收的输入信息和输出信息的正确对应,并保持系统的完整性的外部信息 需求。
    白盒测试与黑盒测试相反,它了解系统内部工作的各项具体程序,能够通过 测试来检查系统内部的运行是不是按照系统说明书的规定进行正常运作的,因 此,白盒测试又被叫做结构测试和逻辑驱动测试。根据测试程序的结构在每个道 路试验,当系统运行时不是能按预定要求正确运行,无论其功能如,白盒测试试 验,道路试验是一个逻辑驱动器,这种测试主要用来软件测验。
    软件测试工作必须要通过制定测试计划、设计测试、实施测试、执行测试、 评估测试五个阶段完成。设计测试的目的是确定、描述和生成测试过程和测试用 例。实施测试的目的是实施设计测试中定义的测试过程。测试的目的是实施和测 试过程定义的设计实现。测试的目的是确保由运行意图建立系统的实现。
    6.3 其他错误在程序设计实现的过程中不可避免的会产生各种难以预料的错误,如书写错 误、传值类型不一致、参数传递问题等等。这些都需要通过细心的检测与不断的 调试才能够排除。比如在servlet路径配置时因粗心错误导致运行导致所报错误, 如图6-1所示:

    6.4 测试结果经过对上述的测试结果分析,本酒店管理系统满足用户的要求和需求。所有 基本功能齐全,操作简单,系统运行性能良好,是一个值得推广的酒店管理系统。
    7 系统评价7.1 系统的特点和优点本系统设计时借鉴了国内外优秀网站的优点,从界面到系统设计都保证了管 理员、员工以及用户能够方便操作。系统的主要特点和优点归纳如下:

    本系统用的移置性和针对性都比较高,因为针对性高可以提供更好的 服务而移置性可以在多个系统上运行,更给客户带来了极大的方便
    该酒店管理系统内容全面,管理方便可以及时的全面的处理各种错误, 异常,这样避免了很多因客户的马虎操作而出现的失误,其操作方便,用户界面 友好,能够上网的人都可以很好的进行操作

    7.2 系统存在的不足和改进方案本系统应为时间仓促造成了很多的不足,下面我来一一的进行陈述并在日后 得到更好的改进方案:
    首先界面并不够美观,不能更好的吸引用户,所以在今后的日子里我会对其 视觉上的不足作出修改,其次系统的代码和数据库出现了非常多的冗余现象,都 是因为对编程技术的应用不够熟练,在日后我会加强自己的自身学习和能力,减 少这样的冗余现象。
    1 评论 10 下载 2020-08-26 10:31:16 下载需要11点积分
显示 30 到 45 ,共 15 条
eject