張洪濤, 葛 林, 楊名軍, 裴 浩, 范羖豪
(1 湖北工業大學電氣與電子工程學院, 湖北 武漢 430068; 2 北京工業大學軟件學院, 北京 100081)
隨著科學技術的發展,視頻監控系統在社會中的應用越來越多,而且視頻監控的技術越來越成熟,已經從模擬化走向了數字化.模擬視頻監控只適合小范圍監控,擴展能力不足,幾乎被社會所淘汰;數字視頻監控又分為PC端監控和基于嵌入式的監控,后者比前者體積小、功耗小、功能穩定,而且在一些公共場所應用廣泛.
整個嵌入式監控系統由三星S3C2440[1]開發板,宿主機,USB攝像頭,無線網卡和監控端PC機構成.軟件部分先移植Linux操作系統到ARM9開發板,然后動態加載USB攝像頭驅動和無線網卡驅動.通過攝像頭采集到視頻數據然后壓縮編碼,經無線網卡把數據發送到PC機監控端,PC機與英特網相連,接收傳輸過來的視頻數據,解壓后顯示在QT編寫的監控界面上.系統總體框圖見圖1.

圖 1 系統整體框圖
本系統是以三星公司的ARM920T內核的S3C2440A微處理器為主控芯片的開發平臺,主要由流媒體服務單元、USB攝像頭、無線網卡和監控端組成(圖2).S3C2440A時鐘采用400 MHz的工作主頻,最高可達533 MHz.本系統擴展了128 MB SDRAM、64MB NorFlash及64MB NandFlash,外設有100 M以太網接口、RS-232串口和三個擴展接口、3個USB Host接口及下載引導程序的JTAG接口等.USB攝像頭芯片為中星微ZC301P[2].無線網卡采用的是GPRS DTU[3].

圖 2 系統硬件圖
圖像采集模塊使用中星微ZC301P芯片的攝像頭, ZC301P芯片最高支持VGA(Video Graphics Array)分辨率(640×480).在VGA模式下速率可達到15幀/s,在CIF(Common Intermediate Format)(352×288)和 SIF(Standard Image Format)(320×240)模式下速率可達到30幀/s.
傳輸模塊采用的是與開發板串口相連的無線網卡GPRS DTU.GPRS DTU是一種基于GPRS網絡的無線數據終端,具有較大的網絡覆蓋面,支持數據透明傳輸,支持斷線自動重連功能.
首先移植Linux系統到開發板上.本系統用的是S3C2440A開發板,uboot,kernel,cramfs文件系統的代碼都是開源的,配置宿主機的ftp、tftp、nfs服務,下載開發包用交叉編譯器編譯之后通過nfs下載到開發板上,完成移植.
使用命令lsmod查看加載的modules,將ZC301P的驅動和GPRS DTU的驅動放到相應的內核目錄下,使用命令make menuconfig配置內核,再次編譯,然后移植到開發板上.也可以通過模塊加載的方式,直接編譯驅動,得到.ko文件,下載到開發板上,然后使用命令make install或者modprobe gspca(驅動名)加載驅動模塊,但是modprobe能使模塊載入的相應問題得到解決.比如要加載B模塊,但是B模塊要求先加載A模塊才能加載B模塊,直接輸入命令insmod會產生錯誤,而modprobe知道modules加載的先后順序.一般推薦使用modprobe.加載模塊完畢后輸入lsmod可以查看已加載的驅動模塊,輸入ls /dev/video0可以查看加載的攝像頭設備.無線網卡的移植類似.如果要卸載模塊,調用modprobe -r hello或 rmmod hello[3].
Video4Linux是Linux內核提供給用戶空間的編程接口,通過v4l提供的系統API來控制視頻和音頻設備,需要的就是使用這些系統的API.
采集流程見圖3.

圖 3 視頻采集流程圖
主要過程如下:typedef struct _v4l_struct v4l_device,1)打開視頻設備.(通常是/dev/video0)int v4l_open(char *, v4l_device *);2)獲得設備信息.int v4l_get_capability(v4l_device *vd),int v4l_get_picture(v4l_device *vd);3)設置設備信息.int v4l_set_picture(v4l_device *, int, int, int, int, int,);修改調色板、色深、亮度、對比度等;4)獲得采集到的圖像數據.a)直接讀取設備int v4l_grab_picture(v4l_device *, unsigned int),b)使用mmap內存映射來獲取圖像,int v4l_mmap_init(v4l_device *),該函數調用vd->map指針把攝像頭圖像數據映射到進程內存中,即可采集到數據.int v4l_grab_frame(v4l_device *, int),該函數可以同時采集當前一幀數據和下一幀數據,真正完成圖像采集.c)Int v4l_grab_sync(v4l_device *),d)使圖像截取同步.最關鍵的一步即為調用ioctl(vd->fd, VIDIOCMCAPTURE, &(vd->mmap)),調用后相應的圖像就已經獲取完畢.在截取圖像后還要進行同步操作,就是調用extern int v4l_grab_sync(v4l_device *);5)處理采集的視頻圖像數據;6)關閉視頻設備int v4l_close(v4l_device *vd)[4].
攝像頭采集到數據后,由于實時視頻數據量非常大,直接把數據傳輸到監控端需要占用很大的帶寬,傳輸效率也會很低.因此就需要把數據編碼壓縮后再傳輸.本文采用的是基于DCT變換順序的JPEG壓縮編碼算法.也可以采用H.264、MPEG系列標準的算法.流程見圖4.

圖4 JPEG編碼流程
主要步驟:用DCT變換對8×8的圖像去除數據冗余部分,再通過量化表對DCT系數量化,然后經過Huaffman編碼,最后獲得壓縮數據,并測得壓縮率為75%左右[5].
本系統采用網絡套接字進行數據傳輸, 由于UDP協議無連接,不可靠,容易丟失數據,而TCP協議連接可靠,不丟失數據,所以選擇TCP協議.
通信流程見圖5.

圖 5 通信流程圖
程序分為服務器端和客戶端,在服務器端,首先創建流式套接字socket(),bind()函數綁定服務器IP與socket,listen()函數處于監聽模式.客戶端也要先創建套接字,填充結構體,對服務器的發送連接請求connect().TCP三次握手完成后,服務器的程序將把視頻緩沖區的視頻數據拷到網絡傳輸緩沖區,最后發送到客戶PC機端[5].
在PC機端用QT開發監控畫面,打開即可觀察到監控畫面,圖像較為清晰.圖6是截取的畫面.

圖 6 監控界面
經過測試,基于ARM的無線視頻監控系統的設計方案實時性好、畫面流暢、結構簡單、操作方便、成本低,應用前景較為廣泛.
[參考文獻]
[1] 孫 弋. 基于S3C2440的嵌入式Linux開發實例[M]. 西安:西安電子科技大學出版社,2010.
[2] 趙曉軍. 基于ARM的嵌入式無線視頻監控系統[J]. 微型機與應用,2010(16):54-56.
[3] 宋寶華. Linux設備驅動開發詳解[M]. 北京:人民郵電出版社,2010.
[4] 韋東山. 嵌入式Linux應用開發完全手冊[M]. 北京:人民郵電出版社,2008.
[5] 孫 瓊. 嵌入式Linux應用程序開發詳解[M].北京:人民郵電出版社,2006.
[6] 許雪梅.基于ARM9+LINUX的無線視頻監控系統的設計[J].計算機測量與控制,2010,18(11):2 475-2 477.