【关键词】视频监控;微控制器;操作系统;多线程
0 引言
近年来,随着科技的不断发展,特别是计算机、网络以及图像处理的飞速发展,计算机处理能力和存储能力的迅速提高,视频监控技术也有了长足的发展。同时随着经济的发展,*、交通、金融、仓储、楼宇等领域对视频监控的需求越来越大,要求越来越高。而随着嵌入式处理器性能的不断提高,嵌入式操作系统的不断完善以及网络、通信、多媒体技术的快速发展,基于嵌入式技术的网络视频监控系统必然以其低廉的价格和便携性成为未来视频监控的一个发展方向。
1 系统总体设计
1.1 视频监控系统组成
网络视频监控系统主要包括远程视频采集和本地视频显示2 大部分。远程采集端通过采集到数据后通过网络传递给本地客户端,进行实时的显示和分析报警。
1.2 远程视频采集模块
系统采用以S3C2440 微处理器芯片为核心的ARM9 开发板为硬件平台[1],操作系统选用LINUX 操作系统[2],采集终端使用的是市面上出售的USB 摄像头。 在视频采集端,我们需要搭建一个简易通用性好的视频网络服务器,这里我们使用mipg-streamer 软件包并对它做一些修改使之适合我们的上位机的需求。因为它是LINUX 下一个开源的支持V4L2 芯片的视频服务软件,可以很方便的修改和编译。我们的视频服务软件使用TCP 协议发送图像数据。
1.2.1 嵌入式linux 交叉开发环境的建立
交叉开发环境是嵌入式应用软件开发时一个显著特点,由宿主机和目标机实现。这里我们的宿主机使用的是2.6 内核的fedora 13 发行版的linux 系统,目标机开发板中的内核是2.6.31 内核本,之间通过串口相连。使用minicom 做串口控制终端,对开发板进行控制。电脑主机编译的程序要在开发板上运行,还必须使用交叉编译工具,这里使用的是ARM-LINUX-GCC 4.3.1 版本。
1.2.2 网络视频服务器的编译和移植
系统以现有开源的基于LINUX[3-5]的视频服务软件mjpg-streamer 为基础,这里我们做了一些必要的修改。因为原版的服务器只能采集一个摄像头的图像,我们把源程序的图像采集部分做了一个循环,使之可以采集多个摄像头的图像,并在相应的网络发送部分做了修改,来达到我们多路视频监控的要求。最后进行交叉编译移植到开发板上,就可以使用了。
将生成的可执行文件uvc-streamer 通过NFS 挂载的方式传到开发板上,然后在minicom 运行./ uvc-streamer –h 可以看到选项 来进行服务器端的一些基本参数的设置,这样网络视频服务器就搭建好了。
1.3 基于QT 的视频显示界面的设计
Qt 是一个支持多操作系统平台的应用程序开发框架[6],它的开发语言是C++ 。Qt 与其他图形用户接口(GUI,Graphical User Interface) 最大的不同就在于它提供了“信号与插槽”机制。这一机制提供了对象间的通信机制,它易于理解和使用,并完全被Qt 图形设计器所支持。它完全可以取代原始的回调和消息映射机制;程序员通过建立一个函数(称作一个插槽),然后调用connect()函数把这个插槽和一个信号连接起来,这样就完成了一个事件和响应代码的连接。信号与插槽机制并不要求类之间互相知道细节,这样就可以相对容易的开发出代码可高重用的类。一个对象的信号可以被多个不同的插槽连接,而多个信号也可以被连接到相同的插槽。
系统的QT 视频显示界面主要分2 个部分:①显示视频图像的用户操作界面,②通过TCP 传输的来自远端视频数据的接收。这里我们采用了多线程技术,主线程在主窗口绘图,实时显示监控视频;次线程建立TCP 连接,接收来自服务器的数据,当接收够一帧的数据后发射信号给主线程,让主线程来绘图。整个客户端软件的设计流程如图1 所示。
1.3.1 视频图像显示界面的设计
首先用QT Creator 创建文件,利用QT 设计师画好整体的主界面,首先建立一个主窗口,然后在这个主窗口上放置一个行编辑框用来输入服务器IP,一个行编辑器用来输入端口号,一个开始按钮,一个关闭按钮,并用画笔在当前窗口的适当位置画了一根黑线,来标示视频显示的区域。
QT 的二维图形引擎是基于QPainter 类的,QPainter 既可以绘制几何形状,也可以绘制像素映射、图形和文字。QPainter 可以画在绘画设备上,如QPixmap、Qwidght、QImage上。在主窗口里,我们定义了2 个QPainter,一个用来画标示视频图像的显示范围,一个用来在QImage 上绘制视频图像。通过调用QPainter 类的公有函数begin( ), drawImage( ), end( )函数来实现绘图事件。主线程通过接受子线程的senddata 信号来绘制图形以及调用updata( )函数来重绘。如图2 所示。
这里我们实现的是四路视频监控画面的显示设计,主要是把当前界面划分成4 个区域,并在不同的部分绘制接受到的来自不同摄像头的图像。通过接受的服务器端的数据辨别是第几个设备的图像就在相应的部分绘图。并且每一个按键都做了一个槽函数来进行可以全屏切换。由于条件限制,这里只有2 个摄像头做的演示。如图3 所示。
1.3.2 数据接收线程的设计
为了提高绘图事件的效率,满足实时显示画面的要求,我们另外开辟了一个线程专门用来接收图像数据提供给主 线程绘图。这里使用了QT 自有的线程类QThread。因为服 务器使用的是TCP 协议来传输图像数据的,我们这里也要使 用TCP 协议来建立网络连接和数据传输。QT 自有的 QTcpSocket 类可以用来实现TCP 客户端。当调用QThread 类的start()函数时,会自动运行子线程的run()函数,我们的 tcp 连接和数据的接受都在这个run()函数里执行。在这个run() 函数里,我们首先初始化并建立一个TCP 连接,当连接 出 错时,返回错误并提示。然后通过QTcpSocket 类的 bytesAvailable()函数来判断是否有数据可读,若可读则通过 该函数的返回值来判断这一帧有多少数据需要读。在读数据 之前我们利用QTcpSocket 类的waitForReadyRead()函数做 了一个开关函数,限定在3 ms 内若不可读就断开连接,防 止在读之前连接断开造成接受数据的误读。然后读这个建立 起来的套接字传输过来的一帧数据并存到已经定义好的缓 冲区。然后发送senddata 信号告诉主线程数据已经读好,开 始绘图。然后编译链接运行,可以看到主界面已经显示出来。 这里我们输入服务器的IP 和端口号,点击开始按钮,可以看 到来自摄像头的监控画面已经显示出来了。
2 结语
通过实验,我们的系统很好的实现了多路视频的实时监 控。我们的监控系统可以很方便的携带和布防,成本也相比 传统的监控系统要低廉很多,在未来的安防领域肯定会有很 大的发展,成为未来监控系统的主流。但是我们的监控系统 实现的功能还很单一,并不能实现运动目标的检测和报警, 不能达到智能监控的目的,这还需要做进一步的开发和设 计。最终做到多路视频的智能监控,自动实现运动目标的检 测和报警。
参考文献
[1] 王黎明,陈双桥,阎晓玲,等. ARM9 嵌入式系统开发与实践[M].北京: 北京航空航天大学出版社,2008:102-166.
[2] 李新峰,何广生,赵秀文. 基于ARM9 的嵌入式Linux 开发技术[M]. 北京:电子工业出版社,2008:330-366.
[3] 杜华. Linux 编程技术详解[M].北京:人民邮电出版社,2007: 322-379.
[4] 杨宗德,邓玉春. Linux 高级程序设计[M].北京:人民邮电出版社, 2009:253-282.
[5] 罗鸿彦,薛质.Linux 下缓冲区溢出的分析与利用[J].信息安全与通 信保密,2008(08):133-135.
[6] Jasmin Blanchette,Mark Summerfield.C++ GUI Qt4 编程[M].北京: 电子工业出版社,2008:166-185, 214-232.
[7] 成洁,卢紫毅.Linux 窗口程序设计-Qt4 精彩实例分析[M].北京:清 华大学出版社,2008:156-163.
[8] 陈周国,王胜银,付国晴,等.基于Linux QT 技术的远程监控GUI设计[J].通信技术,2009,42(12):234-236.
文章出处:http://blog.chinaunix.net/uid-23381466-id-3809342.html