基于GTK+/GNOME的视频监控系统客户端软件设计

2012-06-29 01:37刘立才康维新王海生吴学文
电视技术 2012年23期
关键词:通信协议线程摄像头

刘立才,康维新,王海生,缪 晶,张 强,李 鹏,吴学文

(1.哈尔滨工程大学信息与通信工程学院,黑龙江 哈尔滨 150001;2.华北电力大学控制与计算机工程学院,北京 102206;3.黑龙江省哈双高速公路管理处,黑龙江 哈尔滨 150090)

责任编辑:任健男

随着Linux在中国的普及,必须保证能够用Linux实现其他操作系统(如Windows系列操作系统)下的功能,如文字处理、电子表格、上网等,也就是说,必须有大量图形用户接口(GUI)应用程序满足用户各方面的需求[1]。而基于Linux下的C/C++语言的GUI编程有多种方案,较为流行的有基于QT库和基于GTK+/GNOME两种。KDE(K Desktop Environment)曾经是Linux下最流行的用QT库开发的桌面环境,但是,KDE依赖于Troll Technologles公司所开发的QT库[2],该库许可证的获得非常困难。所以,应该避免使用 QT 库及 KDE[3-5]。

基于上述原因,本项目采用GTK+/GNOME函数库研究客户端用户界面设计。该库仅需XLIB、GLIB(图形底层函数库)和GDK库的支持,且这些库操作简便,同时GTK具有移植性好、可定制、占用空间小、运行稳定等优点,加之它模块化设计和全C编写的特性,使得GTK不但应用在专用嵌入式系统上,也可以在通用PC机上使用,出于这种考虑,采用GTK开发GUI应用程序比较合适[6]。

1 系统方案与主体设计

1.1 系统总体架构

由客户端软件构成的系统整体架构如图1所示。该系统大致由通信协议端程序、服务器端程序和客户端程序三部分组成。由于篇幅所限,这里重点研究客户端程序的设计,具体包括基于GNOME桌面环境下GTK图形用户界面的设计以及视频采集客户端程序的设计过程。而对于通信协议端程序和服务器端程序的设计,这里只简单介绍它们在整个系统中所实现的功能。其中通信协议端程序所实现的功能有:通过该协议能够将服务器采集的视频数据传输到客户端;能够将摄像头图像属性,如对比度、分辨力等信息传递给客户端;通过该协议客户端能够控制服务器端摄像头改变采集的图像属性;在客户端程序退出时能够通知服务器一般进行后续处理。

图1 系统总体架构

服务器端程序实现的功能有:实现基于多线程的循环服务器;传输层基于TCP/IP协议进行通信;通过V4L2接口获取摄像头采集数据;通过V4L2接口设置摄像头图像属性,如对比度、分辨力等;应用层通过自定义通信协议与客户端进行通信;根据命令行参数初始化摄像头。

客户端程序实现的功能有:传输层基于TCP/IP协议进行通信;应用层通过自定义通信协议与服务器进行通信;用户界面基于GNOME桌面环境,并利用GTK进行开发。

1.2 主程序设计

主函数程序设计流程如图2所示,程序开始运行时先进行必要的初始化操作,先通过判断函数g_thread_supported()的值,如果该函数的返回值为true,则说明线程已经初始化,否则要调用g_thread_init()函数进行线程初始化,接着要依次对GDK库和GTK库进行初始化操作。然后创建并启动摄像头运行线程来完成客户端视频采集的功能。如果这时在连接界面中能够通过Connect按钮成功连接至服务器端,则立即通过调用函数create_main_app()进入视频监控界面并进行实时视频图像的显示。在视频监控界面下,程序会停留在gtk_main()处,直到用户驱动某事件后被主循环捕获到,要根据事件携带的窗口ID信息决定接收的构件,然后将信息格式化后以信号的形式传给构件,最后构件调用关联的回调函数进行处理操作。有关连接界面和视频监控界面的软件设计将在下面详细研究。

1.3 连接界面设计

图2 主程序的软件流程

根据功能需求,客户端所设计的连接界面在顶层窗口下建立的构件区主要由图片区、输入区、按钮区和状态区构成。图片区插入图片构件的目的是使整个界面更加美观、更具个性化,这里采用哈尔滨工程大学标志性建筑作为应用图片。对于界面输入区主要由标签和输入条构成,它主要完成人机交互的功能。即用户可以在输入条中输入要连接服务器端的IP地址和端口号。按钮区由Connect和Quit两个按钮构成,主要负责建立C/S之间的连接以及退出连接界面的操作。而当鼠标在上述三个区域动作时,就会在状态区显示相应操作的状态信息。客户端连接界面的软件设计是在主程序中通过调用connect_app()函数来实现,此函数具体的软件实现如图3所示。可见,函数init_conn_if()的调用是用来完成图片区、输入区、按钮区和状态区的创建过程,具体软件流程如图4所示。界面软件设计中各个区域的界线由新建的分割线构件构成,且在图4中每个调用函数中都要完成相应区域中各个构件的生成、构件属性的设置、构件摆放位置的设定以及当用户驱动某事件产生相应信号传递给某构件后,构件处理事件所需关联回调函数的编写等任务。图5为运行客户端软件时所生成的连接界面,可见,达到了所要设计的预期。

1.4 视频监控界面设计

由于用户实际应用的需求,客户端所要设计的视频监控界面大致分为视频区、状态区、设置区和按钮区四部分。视频区主要负责实时视频的监控,同时还可以根据监控图像的画质情况,在设置区设置服务端摄像头的图像属性,如图像的亮度、对比度、分辨力、锐利度、灰度系数等参数。设置后可通过点击按钮区中的设置按钮实时对服务端摄像头采集的视频帧进行设置与控制,同时服务端又会将设置摄像头后的图像属性通过自定义通信协议实时返回给客户端,所以在客户端监控界面上这些信息将在状态区中得到实时显示。这些功能的软件实现主要通过自定义函数create_main_app()来完成。在主程序运行过程中,当客户端成功与服务端建立连接后,也就是connect_app()函数被成功调用后,程序会立即执行自定义函数create_main_app()来生成视频监控界面,该函数的具体软件实现如图6所示。图中函数video_status_setup()的作用是初始化采集的同时也完成填充全局状态结构的工作,使界面显示后体现出如设备名称、服务器、端口号、捕获帧大小、分辨力以及用户控制和设置等项的状态信息。自定义函数init_main_if()调用主要完成视频监控界面的整体布局和层次分配,它的软件实现如图7所示,每个区的建立通过调用相应的实现函数来完成,而相应实现函数所要实现功能具体包括各个构件的生成、构件属性的设置、构件摆放位置的设定以及当用户驱动某事件产生相应信号传递给某构件后,构件处理事件所需关联回调函数的编写等。客户端软件运行时所生成的视频监控界面如图8所示,该界面的监控区域画面图像清晰、流畅,且整个界面工作稳定。

图8 客户端监控界面的设计(截图)

2 关键技术及处理

2.1 摄像头运行线程的创建

为了克服多进程在软件设计上占用系统资源多、运行效率低和响应速度慢等缺点,更好地保证视频数据及时处理,满足视频图像实时性的要求,本项目采用Linux环境下具有并发性更高的多线程处理技术。通过调用线程执行函数cam_thread()对视频数据进行各种处理操作。在主程序开始运行并初始化后,通过调用摄像头运行线程来完成客户端视频采集的功能。该函数的具体软件实现过程如图9所示。图中g_bcamoff为关闭设备标识符,g_bcamrun为正在视频采集标识符。程序运行过程中根据查询到不同阶段这两个标识符的状态,来完成相应的处理操作。函数cam_get_img()的调用主要完成的工作是客户端向服务端发出获取摄像头采集数据的命令,服务器正常响应后,通过自定义通信协议,把相应采集到的一帧数据发送给客户端,客户端根据与之对应的自定义通信协议,从套接字中得到该帧并把它读取到相应的视频缓冲区。随后调用gwin_draw_area()函数将缓冲区中的该帧视频数据实时地更新到用户监控界面中去。可见此线程的重要性,它成功创建与否直接决定整个软件运行状况。

2.2 界面线程与工作线程冲突处理

在客户端软件运行过程中,主函数通过调用工作线程来完成视频帧数据的获取及处理操作。如果在工作线程运行过程中,客户端从服务端得到的一帧新视频数据不经任何处理直接更新到视频监控界面中,将会出现与工作线程冲突的情况发生,导致视频监控界面出现假死的状况,造成整个软件不能正常工作。为了防止视频监控界面在进行界面更新时出现界面假死的情况。这里在工作线程中采取创建子界面线程的编程方法来加以克服,它是通过调用自定义gwin_draw_area()函数来实现。此函数定义如下:

图9 摄像头运行线程

此线程执行函数的功能就是在修改界面语句前加gdk_threads_enter()进入修改界面的线程锁定,修改完界面后再使用gdk_threads_leave()解除锁定。这样就可以避免界面线程与工作线程冲突所导致的监控界面假死情况的发生,使得界面得到及时的更新,这也是保证视频监控界面实时性好的关键所在。所以,该处理技术在本软件设计中最为重要。

3 小结

本文在Linux环境下充分利用多线程编程方法和GTK+/GNOME技术的优点,结合现代通信传输技术,对能够处理实时视频数据的客户端软件进行了详细设计分析。经过测试该客户端软件性能可靠稳定,所设计的视频监控界面不但协调、美观,而且由该软件构成的监控系统的监控画面清晰、流畅、实时性好,克服了界面在工作过程中遇到的界面假死等现象。此外,如果将无线监控系统客户端和服务端的功能继续加以完善,可以根据不同终端的IP及端口号进行音视频双向通信,就能从根本上解决在嵌入式移动终端上依据IP技术实现网络任意节点间点对点通信的难题,这也是后续研究的重点课题。

[1]许宏松,吴明行.Linux应用程序开发指南使用Gtk+/Gnome库[M].北京:机械工业出版社,2000.

[2]HARLOW.实用技术:Linux中Gtk+和GDK开发Linux图形界面应用[M].北京:电子工业出版社,2000.

[3]陈健.Linux高级程序设计[M].北京:人民邮电出版社,2008.

[4]闫娟,程武山,孙鑫.基于嵌入式Linux的实时网络视频监控系统[J].电视技术,2006,30(12):81-84.

[5]宋国伟.GTK+2.0编程范例[M].北京:清华大学出版社,2002.

[6]战晓苏.GTK+程序设计C语言版[M].北京:清华大学出版社,2002.

猜你喜欢
通信协议线程摄像头
浙江首试公路非现场执法新型摄像头
摄像头连接器可提供360°视角图像
基于C#线程实验探究
基于国产化环境的线程池模型研究与实现
基于Z-Stack通信协议栈的红外地温采集电路设计
浅谈linux多线程协作
基于DMX512通信协议的多路转发器设计与研究
基于NS-3的PLC多频通信协议仿真平台设计与实现
奔驰360°摄像头系统介绍
RSSP-I、RSSP-Ⅱ及SAHARA三种安全通信协议实现技术简介