视频监控程序设计说明书.doc

上传人:钟*** 文档编号:5413103 上传时间:2020-01-28 格式:DOC 页数:14 大小:44.60KB
返回 下载 相关 举报
视频监控程序设计说明书.doc_第1页
第1页 / 共14页
视频监控程序设计说明书.doc_第2页
第2页 / 共14页
视频监控程序设计说明书.doc_第3页
第3页 / 共14页
点击查看更多>>
资源描述
.视频监控系统程序设计说明书1引言1.1编写目的本文主要说明视频监控系统的详细设计与实现。本文详细介绍了系统中各个模块的设计与实现细节以及关键技术的应用。其中,对每一个模块会有相应的文字说明以及相关设计流程图给出。1.2项目背景本项目是对本实验课程中所介绍的课程的综合应用。本项目主要针对unix/linux系统编程和基于C+语言的GUI程序设计-QT进行针对性训练。旨在加强学生对unix/linux系统编程的理解和应用,提高学生的实践能力、编程能力以及分析问题和解决问题的能力。并且通过对本系统中客户端的设计和实现,让学生体会和熟悉面向对象编程的思想和一般方法。1.3定义本系统=视频监控系统本文=视频监控系统设计说明书2总体设计2.1需求概述本系统是基于C/S架构的网络视频监控系统,主要由负责图形采集和传输的Server端和负责监控(显示图像)的Client端构成。本系统Server端是基于Linux系统的网络服务类软件,主要由数据采集和网络服务两部分构成。数据采集部分利用v4l2(video for linux II)对网络摄像头进行控制和访问并且获取由摄像头捕获到的视频数据,然后再由网络服务部分将获取到的视频数据进行封装成http帧并利用http协议发送到客户端。由于本系统Server端的数据发送是基于http协议的,所以本系统客户端没有平台限制,只要支持http1.0以上的平台就可以访问本系统的服务。而且,本系统服务可以直接通过web浏览器访问(对firefox浏览器支持最佳)。为了提高传输效率我们还需要进行客户端软件的开发,由于对客户端没有平台要求,所在Windows、Linux、Android、等平台都可以实现。本文主将以linux为例用Qt实现一个简易的客户端软件。2.2软件结构servervideo servicedata capturedevicd configget datamove datacreate serverwait connectdata transferclientdisplayget datacreate socketconnect serverget datainit GUIload video dataupdate widgetTCP/IP图2.2.1视频监控系统结构图3程序描述3.1 Server:数据采集3.1.1功能配置设备并从设备中获取图像数据。根据设备信息利用v4l2(video for linux II)通过ioctl对USB摄像头进行配置,打开设备抓取功能开始采集并转存数据,采集完毕以后关闭设备功能,最后关闭设备。 3.1.2技术概要本模块涉及到大量的对于设备的I/O操作,主要通过video for linux II(v4l2)框架对设备进行设置和控制。其中包括一些特殊的结构体属性的赋值以及一些特殊控制标记的实际意义需要详细查阅v4l2提供的API。3.1.3程序逻辑本节主要以流程图的方式介绍Server端数据采集模块的主要程序逻辑设计。startopen(“devicePath”, O_RDONLY)ioctl(fd, VIDIOC_QUERYCAP,& v4l2_capability)ioctl(fd, VIDIOC_S_FMT, &v4l2_format).ioctl(fd, VIDIOC_REQBUFS, &v4l2_requestbuffers)ioctl(fd, VIDIOC_QUERYBUF, &v4l2_buffer)data processingexit?endYN开始数据处理设置缓存属性申请缓存设置采集方式获取设备信息打开设备文件退出?开始是否图3.1.1 Server端数据采集流程图图3.1.1主要描述了服务端数据采集部分的主要流程和编程步骤。下面将对每一个步骤进行详细的介绍:1.打开设备:打开视频设备(这里指我们的USB摄像头)。利用linux系统提供的接口函数open来对设备进行打开的操作。图3.1.2对这一过程进行了详细的描述。2.查询设备信息(或者叫获取设备信息):startfd = -1fd = open()fd0?NYerror1查询设备驱动相关信息以及和视频采集相关的参数,根据获取到的信息初步判断设备类型以及将要处理的数据类型。利用ioctl函数以及v4l2提供的v4l2_capbility和v4l2_format两个结构体来保存获取到的设备驱动信息和帧信息。详细流程见图3.1.3。VIDIOC_G_FMT等属性的含义需查询v4l2提供的API。图3.1.2 打开设备子图struct v4l2_capabilitycapstruct v4l2_formatfmtmemset(&cap, 0, sizeof(cap);memset(&fmt, 0, sizefo(fmt);ioctl(fd, VIDIOC_QUERYCAP, &cap)ioctl(fd, VIDIOC_G_FMT, &fmt)return err?NerrorY1get info:cap.drivercap.cardcap.bus_infocap.versionfmt.fmt.pix.pixelformatfmt.fmt.widthfmt.fmt.height2fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTUREfmt.fmt.pix.field = V4L2_FIELD_ANY图3.1.3 获取设备信息子图3.设置采集方式设置视频设备(这里指USB摄像头)的采集方式,例如采集图像的分辨率,帧的采集速率(既每秒采集帧的数量)等选项的设置。用到v4l2中的v4l2_format和v4l2_streamparm两个结构体以及VIDIOC_S_PARM和VIDIOC_SFMT两个标记,相关介绍请查阅v4l2框架的API信息。实现步骤详见图3.1.4。2struct v4l2_formatfmtstruct v4l2_streamparmparmmemset(&parm, 0, sizeof(parm);memset(&fmt, 0, sizefo(fmt);ioctl(fd, VIDIOC_S_PARM, &parm)ioctl(fd, VIDIOC_S_FMT, &fmt)fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTUREfmt.fmt.pix.field = V4L2_FIELD_ANYfmt.fmt.pix.width = WIDTHfmt.fmt.pix.htight = HEIGHTparm.type = V4L2_BUF_TYPE_VIDEO_CAPTUREparm.parm.capture.timeperframe.numerator = 1parm.parm.capture.timeperframe.denominator = FPS/本模块用到的宏定义#defineWIDTH320#defineHEIGTH240#defineFPS5return err?errorreturn3YN图3.1.4 设置采集方式子图4.申请缓存向驱动申请几块缓冲区(此处缓冲区是由内核管理的,所以需要申请),用来存放设备采集到的数据。用到v4l2中的v4l2_requestbuffer结构体和VIDIOC_REQBUFS标记来向设备驱动申请缓冲区。实现步骤详见图3.1.4。3struct v4l2_requestbufferrbmemset(&rb, 0, sizeof(rb);ioctl(fd, VIDIOC_REQBUFS, &rb)rb.count = NB_BUFFERrb.type = V4L2_BUF_TYPE_VIDEO_CAPTURErb.memory = V4L2_MEMORY_MMAP/本模块用到的宏定义/表示申请缓冲区的数量#defineNB_BUFFER5return err?errorreturn4YN图3.1.5 申请缓存子图5.设置缓存属性对申请到的缓存进行设置,包括设置缓存的访问方式(使用内存映射访问方式),对缓存进行映射,建立缓存队列。4struct v4l2_bufferbufunsigned char * mem_listmem_list = (uchar *)calloc(NB_BUFFER, sizeof(uchar);inti = 0;iNB_BUFFERbuf.index = ibuf.type = V4L2_BUF_TYPE_VIDEO_CAPTUREbuf.memory = V4L2_MEMORY_MMAPioctl(fd, VIDIOC_QUERYBUF, &buf)mem_listi = mmap(0, buf.length, PROT_READ, MAP_SHARED, fd, buf.m.offset)ioctl(fd, VIDIOC_QBUF, &buf)No error?NYYNreturn5error图3.1.6 设置缓存子图5.处理数据通过对设备设置VIDIOC_STREAMON和VIDIOC_STREAMOFF来控制设备开始/停止采集数据,在设置开始和停止之间通过对缓存的轮换读取获得设备采集到的数据并对其进行处理(这里的数据处理主要做对图像压缩和传输两部分工作会在后面做详细介绍)。通过利用VIDIOC_QBUF和VIDIOC_DQBUF两个控制位来对缓冲队列进行入/出队列的控制,从而获得设备采集到的数据。详见图3.1.7。5struct v4l2_bufferbufmemset(&buf, 0, sizeof(buf);ioctl(fd, VIDIOC_STREAMON, &buf)buf.type = V4L2_BUF_TYPE_VIDEO_CAPTUREbuf.memory = V4L2_MEMORY_MMAPreturn err?errorreturnYN数据处理ioctl(fd, VIDIOC_STREAMON, &buf)end图3.1.7 数据处理子图3.2 Server:数据处理3.2.1功能完成图像压缩,建立web服务供客户端访问。对摄像头采集到的数据进行一次huffman编码把图片转换成jpeg或者jpg格式(这个步骤也可以在客户端完成,但是浏览器不支持此种实现)。建立一个基于TCP/IP的web服务器,当有客户端连接本服务时利用HTTP协议发送转换好的数据。3.2.2 技术概要本模块主要涉及到对原始图像数据的压缩以及基于C语言的网络和多线程的编程。关于图像压缩的部分在本项目中不做研究所以只是简单的调用已有接口。对于网络服务功能以及多任务的处理功能的实现都是本项目要涉及到的重要内容,这里需要对基于C语言的TCP编程和多线程编程比较熟悉,可以参考UNIX环境高级编程。3.2.2程序逻辑本模块的作用实际是上一个模块中的“数据处理”部分。由于设备采集到到的每一帧数据经过huffman编码以后会变成一张完整的图片,所以我们在下面发送数据的部分要做一个简单的封装,下面分别给出程序流程图(图3.2.1)和数据封装格式(图3.2.2)。startend建立Server socket绑定监听端口监听端口有客户端链接?启动客户端处理线程读取请求信息发送响应信息处理请求信息发送数据链接断开?N退出线程退出信号?YYNY图3.2.1 数据处理http响应头boundary帧头部图片数据boundary帧头部图片数据boundary .Content-type: Content-length:typelength空行图3.2.2 服务端帧封装结构3.3 Client:获取数据3.3.1功能向服务器发送请求,根据服务器的响应信息接收数据。与服务器建立基于TCP的连接,向服务器发送http请求,接收服务器返回的响应信息,并根据响应信息按照一定的格式接收数据。3.3.2 技术概要本模块主要涉及到基于TCP的客户端编程,关于各户端编程的方法比较灵活,在语言框架选择方面也比较广泛,像Java GUI、MFC、QT等都可以实现。在这里我们一QT为例来实现客户端程序。3.3.3程序逻辑startsocket()read()accept()bind()listen()close()write()endstartsocket()write()connect()close()read()end三次握手链接写入数据读取数据关闭过程SERVERCLIENT这里主要涉及到TCP客户端编程和对服务器数据分割,TCP客户端的编程比较程式化有统一的编程步骤和一般流程,数据分割需要根据服务端数据发送情况的来确定。下面给出TCP网络编程流程(图3.3.1)和数据分割步骤(图3.3.2).图3.3.2 TCP网络编程流程start从socket中读取一行读到标记行?N获取图片长度读取图片发送数据准备好信号endY图3.3.3 客户端 数据分割流程3.4 Client:显示3.4.1功能通过信号控制QT控件刷新图片。我们看到连续的图像是由一张一张的单独的图片不断刷新形成的,所以本模块主要功能是接收上一模块的数据准备好信号后将新的图像数据加载到控件并刷新控件,从而形成连续的图像。3.4.2 技术概要本模块主要涉及到QT的编程和使用,包括对一些控件的控制和线程控制。由于循环显示图像时候会阻塞图形界面,所以用一个单独的线程来完成刷新图像工作。对于QT相关一些知识请详细参考QT官方提供的API。3.4.3程序逻辑页面刷新流程,这里主要到QT中的信号和槽的机制来实现图像的刷新。start连接服务器连接成功?接收到信号?YY出错处理N等待信号N加载数据并刷新控件数据信号?Y响应信号处理N图3.4.1客户端显示模块流程4总结本项目综合了实验教程中的大部分课程,其中包括Linux 系统高级编程、C/C+编程、C+图形界面编程(QT4)、以及多线程和TCP网络编程。上述列举的内容都是本实验课程重点内容中,要求学生让重点掌握并熟练使用,这也是是本项目最终目标。精选word范本!
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!