張洪濤, 葛 林, 楊名軍, 裴 浩, 范羖豪
(1 湖北工業(yè)大學電氣與電子工程學院, 湖北 武漢 430068; 2 北京工業(yè)大學軟件學院, 北京 100081)
隨著科學技術(shù)的發(fā)展,視頻監(jiān)控系統(tǒng)在社會中的應用越來越多,而且視頻監(jiān)控的技術(shù)越來越成熟,已經(jīng)從模擬化走向了數(shù)字化.模擬視頻監(jiān)控只適合小范圍監(jiān)控,擴展能力不足,幾乎被社會所淘汰;數(shù)字視頻監(jiān)控又分為PC端監(jiān)控和基于嵌入式的監(jiān)控,后者比前者體積小、功耗小、功能穩(wěn)定,而且在一些公共場所應用廣泛.
整個嵌入式監(jiān)控系統(tǒng)由三星S3C2440[1]開發(fā)板,宿主機,USB攝像頭,無線網(wǎng)卡和監(jiān)控端PC機構(gòu)成.軟件部分先移植Linux操作系統(tǒng)到ARM9開發(fā)板,然后動態(tài)加載USB攝像頭驅(qū)動和無線網(wǎng)卡驅(qū)動.通過攝像頭采集到視頻數(shù)據(jù)然后壓縮編碼,經(jīng)無線網(wǎng)卡把數(shù)據(jù)發(fā)送到PC機監(jiān)控端,PC機與英特網(wǎng)相連,接收傳輸過來的視頻數(shù)據(jù),解壓后顯示在QT編寫的監(jiān)控界面上.系統(tǒng)總體框圖見圖1.
圖 1 系統(tǒng)整體框圖
本系統(tǒng)是以三星公司的ARM920T內(nèi)核的S3C2440A微處理器為主控芯片的開發(fā)平臺,主要由流媒體服務單元、USB攝像頭、無線網(wǎng)卡和監(jiān)控端組成(圖2).S3C2440A時鐘采用400 MHz的工作主頻,最高可達533 MHz.本系統(tǒng)擴展了128 MB SDRAM、64MB NorFlash及64MB NandFlash,外設有100 M以太網(wǎng)接口、RS-232串口和三個擴展接口、3個USB Host接口及下載引導程序的JTAG接口等.USB攝像頭芯片為中星微ZC301P[2].無線網(wǎng)卡采用的是GPRS DTU[3].
圖 2 系統(tǒng)硬件圖
圖像采集模塊使用中星微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.
傳輸模塊采用的是與開發(fā)板串口相連的無線網(wǎng)卡GPRS DTU.GPRS DTU是一種基于GPRS網(wǎng)絡的無線數(shù)據(jù)終端,具有較大的網(wǎng)絡覆蓋面,支持數(shù)據(jù)透明傳輸,支持斷線自動重連功能.
首先移植Linux系統(tǒng)到開發(fā)板上.本系統(tǒng)用的是S3C2440A開發(fā)板,uboot,kernel,cramfs文件系統(tǒng)的代碼都是開源的,配置宿主機的ftp、tftp、nfs服務,下載開發(fā)包用交叉編譯器編譯之后通過nfs下載到開發(fā)板上,完成移植.
使用命令lsmod查看加載的modules,將ZC301P的驅(qū)動和GPRS DTU的驅(qū)動放到相應的內(nèi)核目錄下,使用命令make menuconfig配置內(nèi)核,再次編譯,然后移植到開發(fā)板上.也可以通過模塊加載的方式,直接編譯驅(qū)動,得到.ko文件,下載到開發(fā)板上,然后使用命令make install或者modprobe gspca(驅(qū)動名)加載驅(qū)動模塊,但是modprobe能使模塊載入的相應問題得到解決.比如要加載B模塊,但是B模塊要求先加載A模塊才能加載B模塊,直接輸入命令insmod會產(chǎn)生錯誤,而modprobe知道m(xù)odules加載的先后順序.一般推薦使用modprobe.加載模塊完畢后輸入lsmod可以查看已加載的驅(qū)動模塊,輸入ls /dev/video0可以查看加載的攝像頭設備.無線網(wǎng)卡的移植類似.如果要卸載模塊,調(diào)用modprobe -r hello或 rmmod hello[3].
Video4Linux是Linux內(nèi)核提供給用戶空間的編程接口,通過v4l提供的系統(tǒng)API來控制視頻和音頻設備,需要的就是使用這些系統(tǒng)的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,);修改調(diào)色板、色深、亮度、對比度等;4)獲得采集到的圖像數(shù)據(jù).a(chǎn))直接讀取設備int v4l_grab_picture(v4l_device *, unsigned int),b)使用mmap內(nèi)存映射來獲取圖像,int v4l_mmap_init(v4l_device *),該函數(shù)調(diào)用vd->map指針把攝像頭圖像數(shù)據(jù)映射到進程內(nèi)存中,即可采集到數(shù)據(jù).int v4l_grab_frame(v4l_device *, int),該函數(shù)可以同時采集當前一幀數(shù)據(jù)和下一幀數(shù)據(jù),真正完成圖像采集.c)Int v4l_grab_sync(v4l_device *),d)使圖像截取同步.最關鍵的一步即為調(diào)用ioctl(vd->fd, VIDIOCMCAPTURE, &(vd->mmap)),調(diào)用后相應的圖像就已經(jīng)獲取完畢.在截取圖像后還要進行同步操作,就是調(diào)用extern int v4l_grab_sync(v4l_device *);5)處理采集的視頻圖像數(shù)據(jù);6)關閉視頻設備int v4l_close(v4l_device *vd)[4].
攝像頭采集到數(shù)據(jù)后,由于實時視頻數(shù)據(jù)量非常大,直接把數(shù)據(jù)傳輸?shù)奖O(jiān)控端需要占用很大的帶寬,傳輸效率也會很低.因此就需要把數(shù)據(jù)編碼壓縮后再傳輸.本文采用的是基于DCT變換順序的JPEG壓縮編碼算法.也可以采用H.264、MPEG系列標準的算法.流程見圖4.
圖4 JPEG編碼流程
主要步驟:用DCT變換對8×8的圖像去除數(shù)據(jù)冗余部分,再通過量化表對DCT系數(shù)量化,然后經(jīng)過Huaffman編碼,最后獲得壓縮數(shù)據(jù),并測得壓縮率為75%左右[5].
本系統(tǒng)采用網(wǎng)絡套接字進行數(shù)據(jù)傳輸, 由于UDP協(xié)議無連接,不可靠,容易丟失數(shù)據(jù),而TCP協(xié)議連接可靠,不丟失數(shù)據(jù),所以選擇TCP協(xié)議.
通信流程見圖5.
圖 5 通信流程圖
程序分為服務器端和客戶端,在服務器端,首先創(chuàng)建流式套接字socket(),bind()函數(shù)綁定服務器IP與socket,listen()函數(shù)處于監(jiān)聽模式.客戶端也要先創(chuàng)建套接字,填充結(jié)構(gòu)體,對服務器的發(fā)送連接請求connect().TCP三次握手完成后,服務器的程序?qū)岩曨l緩沖區(qū)的視頻數(shù)據(jù)拷到網(wǎng)絡傳輸緩沖區(qū),最后發(fā)送到客戶PC機端[5].
在PC機端用QT開發(fā)監(jiān)控畫面,打開即可觀察到監(jiān)控畫面,圖像較為清晰.圖6是截取的畫面.
圖 6 監(jiān)控界面
經(jīng)過測試,基于ARM的無線視頻監(jiān)控系統(tǒng)的設計方案實時性好、畫面流暢、結(jié)構(gòu)簡單、操作方便、成本低,應用前景較為廣泛.
[參考文獻]
[1] 孫 弋. 基于S3C2440的嵌入式Linux開發(fā)實例[M]. 西安:西安電子科技大學出版社,2010.
[2] 趙曉軍. 基于ARM的嵌入式無線視頻監(jiān)控系統(tǒng)[J]. 微型機與應用,2010(16):54-56.
[3] 宋寶華. Linux設備驅(qū)動開發(fā)詳解[M]. 北京:人民郵電出版社,2010.
[4] 韋東山. 嵌入式Linux應用開發(fā)完全手冊[M]. 北京:人民郵電出版社,2008.
[5] 孫 瓊. 嵌入式Linux應用程序開發(fā)詳解[M].北京:人民郵電出版社,2006.
[6] 許雪梅.基于ARM9+LINUX的無線視頻監(jiān)控系統(tǒng)的設計[J].計算機測量與控制,2010,18(11):2 475-2 477.