收藏 分销(赏)

视频监控程序设计项目说明指导书.docx

上传人:二*** 文档编号:4710010 上传时间:2024-10-10 格式:DOCX 页数:22 大小:33.21KB
下载 相关 举报
视频监控程序设计项目说明指导书.docx_第1页
第1页 / 共22页
本文档共22页,全文阅读请下载到手机保存,查看更方便
资源描述
视频监控系统程序设计说明书 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软件结构 server video service data capture devicd config get data move data create server wait connect data transfer client display get data create socket connect server get data init GUI load video data update widget TCP/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端数据采集模块关键程序逻辑设计。 start open(“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 processing exit? end Y N 开始 数据处理 设置缓存属性 申请缓存 设置采集方法 获取设备信息 打开设备文件 退出? 开始 是 否 图3.1.1 Server端数据采集步骤图 图3.1.1关键描述了服务端数据采集部分关键步骤和编程步骤。下面将对每一个步骤进行具体介绍: 1.打开设备: 打开视频设备(这里指我们USB摄像头)。利用linux系统提供接口函数open来对设备进行打开操作。图3.1.2对这一过程进行了具体描述。 2.查询设备信息(或叫获取设备信息): start fd = -1 fd = open() fd<0? N Y error 1 查询设备驱动相关信息和和视频采集相关参数,依据获取到信息初步判定设备类型和将要处理数据类型。利用ioctl函数和v4l2提供v4l2_capbility和v4l2_format两个结构体来保留获取到设备驱动信息和帧信息。具体步骤见图3.1.3。VIDIOC_G_FMT等属性含义需查询v4l2提供API。 图3.1.2 打开设备子图 struct v4l2_capability cap struct v4l2_format fmt memset(&cap, 0, sizeof(cap)); memset(&fmt, 0, sizefo(fmt)); ioctl(fd, VIDIOC_QUERYCAP, &cap) ioctl(fd, VIDIOC_G`_FMT, &fmt) return err? N error Y 1 get info: cap.driver cap.card cap.bus_info cap.version fmt.fmt.pix.pixelformat fmt.fmt.width fmt.fmt.height 2 fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE fmt.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。 2 struct v4l2_format fmt struct v4l2_streamparm parm memset(&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_CAPTURE fmt.fmt.pix.field = V4L2_FIELD_ANY fmt.fmt.pix.width = WIDTH fmt.fmt.pix.htight = HEIGHT parm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE parm.parm.capture.timeperframe.numerator = 1 parm.parm.capture.timeperframe.denominator = FPS //本模块用到宏定义 #define WIDTH 320 #define HEIGTH 240 #define FPS 5 return err? error return 3 Y N 图3.1.4 设置采集方法子图 4.申请缓存 向驱动申请几块缓冲区(此处缓冲区是由内核管理,所以需要申请),用来存放设备采集到数据。用到v4l2中v4l2_requestbuffer结构体和VIDIOC_REQBUFS标识来向设备驱动申请缓冲区。实现步骤详见图3.1.4。 3 struct v4l2_requestbuffer rb memset(&rb, 0, sizeof(rb)); ioctl(fd, VIDIOC_REQBUFS, &rb) rb.count = NB_BUFFER rb.type = V4L2_BUF_TYPE_VIDEO_CAPTURE rb.memory = V4L2_MEMORY_MMAP //本模块用到宏定义 //表示申请缓冲区数量 #define NB_BUFFER 5 return err? error return 4 Y N 图3.1.5 申请缓存子图 5.设置缓存属性 对申请到缓存进行设置,包含设置缓存访问方法(使用内存映射访问方法),对缓存进行映射,建立缓存队列。 4 struct v4l2_buffer buf unsigned char ** mem_list mem_list = (uchar **)calloc(NB_BUFFER, sizeof(uchar)); int i = 0; i<NB_BUFFER buf.index = i buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE buf.memory = V4L2_MEMORY_MMAP ioctl(fd, VIDIOC_QUERYBUF, &buf) mem_list[i] = mmap(0, buf.length, PROT_READ, \ MAP_SHARED, fd, buf.m.offset) ioctl(fd, VIDIOC_QBUF, &buf) No error? N Y Y N return 5 error 图3.1.6 设置缓存子图 5.处理数据 经过对设备设置VIDIOC_STREAMON和VIDIOC_STREAMOFF来控制设备开始/停止采集数据,在设置开始和停止之间经过对缓存轮换读取取得设备采集到数据并对其进行处理(这里数据处理关键做对图像压缩和传输两部分工作会在后面做具体介绍)。经过利用VIDIOC_QBUF和VIDIOC_DQBUF两个控制位来对缓冲队列进行入/出队列控制,从而取得设备采集到数据。详见图3.1.7。 5 struct v4l2_buffer buf memset(&buf, 0, sizeof(buf)); ioctl(fd, VIDIOC_STREAMON, &buf) buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE buf.memory = V4L2_MEMORY_MMAP return err? error return Y N 数据处理 ioctl(fd, VIDIOC_STREAMON, &buf) end 图3.1.7 数据处理子图 3.2 Server::数据处理 3.2.1功效 完成图像压缩,建立web服务供用户端访问。 对摄像头采集到数据进行一次huffman编码把图片转换成jpeg或jpg格式(这个步骤也能够在用户端完成,不过浏览器不支持此种实现)。 建立一个基于TCP/IPweb服务器,当有用户端连接本服务时利用HTTP协议发送转换好数据。 3.2.2 技术概要 本模块关键包含到对原始图像数据压缩和基于C语言网络和多线程编程。 相关图像压缩部分在本项目中不做研究所以只是简单调用已经有接口。对于网络服务功效和多任务处理功效实现全部是本项目要包含到关键内容,这里需要对基于C语言TCP编程和多线程编程比较熟悉,能够参考《UNIX环境高级编程》。 3.2.2程序逻辑 本模块作用实际是上一个模块中“数据处理”部分。因为设备采集到到每一帧数据经过huffman编码以后会变成一张完整图片,所以我们在下面发送数据部分要做一个简单封装,下面分别给出程序步骤图(图3.2.1)和数据封装格式(图3.2.2)。 start end 建立Server socket 绑定监听端口 监听端口 有用户端链接? 开启用户端处理线程 读取请求信息 发送响应信息 处理请求信息 发送数据 链接断开? N 退出线程 退出信号? Y Y N Y 图3.2.1 数据处理 http 响应头 boundary 帧头部 图片数据 boundary 帧头部 图片数据 boundary … ... Content-type: Content-length: type length 空行 图3.2.2 服务端帧封装结构 3.3 Client::获取数据 3.3.1功效 向服务器发送请求,依据服务器响应信息接收数据。 和服务器建立基于TCP连接,向服务器发送http请求,接收服务器返回响应信息,并依据响应信息根据一定格式接收数据。 3.3.2 技术概要 本模块关键包含到基于TCP用户端编程,相关各户端编程方法比较灵活,在语言框架选择方面也比较广泛,像Java GUI、MFC、QT等全部能够实现。在这里我们一QT为例来实现用户端程序。 3.3.3程序逻辑 start socket() read() accept() bind() listen() close() write() end start socket() write() connect() close() read() end 三次握手链接 写入数据 读取数据 关闭过程 SERVER CLIENT 这里关键包含到TCP用户端编程和对服务器数据分割,TCP用户端编程比较程式化有统一编程步骤和通常步骤,数据分割需要依据服务端数据发送情况来确定。下面给出TCP网络编程步骤(图3.3.1)和数据分割步骤(图3.3.2). 图3.3.2 TCP网络编程步骤 start 从socket中读取一行 读到标识行? N 获取图片长度 读取图片 发送数据准备好信号 end Y 图3.3.3 用户端 数据分割步骤 3.4 Client::显示 3.4.1功效 经过信号控制QT控件刷新图片。 我们看到连续图像是由一张一张单独图片不停刷新形成,所以本模块关键功效是接收上一模块数据准备好信号后将新图像数据加载到控件并刷新控件,从而形成连续图像。 3.4.2 技术概要 本模块关键包含到QT编程和使用,包含对部分控件控制和线程控制。因为循环显示图像时候会阻塞图形界面,所以用一个单独线程来完成刷新图像工作。对于QT相关部分知识请具体参考QT官方提供API。 3.4.3程序逻辑 页面刷新步骤,这里关键到QT中信号和槽机制来实现图像刷新。 start 连接服务器 连接成功? 接收到信号? Y Y 犯错处理 N 等候信号 N 加载数据并刷新控件 数据信号? Y 响应信号处理 N 图3.4.1用户端显示模块步骤 4.总结 本项目综合了试验教程中大部分课程,其中包含Linux 系统高级编程、C/C++编程、C++图形界面编程(QT4)、和多线程和TCP网络编程。上述列举内容全部是本试验课程关键内容中,要求学生让关键掌握并熟练使用,这也是是本项目最终目标。
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 通信科技 > 监控/监视

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服