?

基于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之間的連接以及退出連接界面的操作。而當鼠標在上述三個區域動作時,就會在狀態區顯示相應操作的狀態信息??蛻舳诉B接界面的軟件設計是在主程序中通過調用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三種安全通信協議實現技術簡介
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合