摘要:視頻圖像采集及處理技術在遠程視頻監控和可視電話中有着廣泛的應用前景,驅動視頻采集設備和獲取視頻數據並進行相應的處理,是實現這些應用的基礎。針對這些應用,構建了一個基於嵌入式 Linux和 PXA270微處理器的視頻采集與傳輸系統,利用 Video4Linux實現 USB攝像頭視頻數據采集,采集的視頻數據經 JPEG壓縮后,在 PXA270為核心的系統控制下通過以太網進行傳輸,並通過重新編譯移植 Webcam_server應用程序實現了實時視頻采集。實驗結果表明,該系統動態刷新良好,具有一定的實用性。
關鍵詞: PXA270;嵌入式 Linux;USB攝像頭;圖像采集與傳輸
Abstract:Video image acquisition and processing technology had a broad application prospect in the long distance supervisory control with video and video telephone. Driving video acquisition equipments and gaining video data to process accordingly are the basis of realization the applications. Aiming at the applications, designed a video acquisition and transmission system based on PXA270 with embedded Linux. The system used USB camera combined with Video4Linux to implement video data acquisition, then were encoded in JPEG, and sent by Ethernet under the control of the PXA270. In the end, compiling and transplanting the webcam server application, actualized real-time video image acquisition. The experimental results shows that the system can be refreshed dynamically better, and it is very useful and practical.
Keywords:PXA270; embedded Linux; USB camera; image acquisition and transmission
1 引言
視頻圖像可以對客觀事物進行形象、生動的描述,它是一種直觀而具體的信息表達形式,也是一種重要的信息載體。而隨着嵌入式系統的不斷發展,它所涉及的領域包括工業控制、網絡通信、軍事國防、航空航天等,我們所熟悉的電子產品幾乎都可以找到嵌入式系統的影子。利用嵌入式微處理器構建的視頻圖像采集系統 [1]具有體積小、成本低、穩定性高等優點,在智能交通、計算機視覺、通信等領域得到了廣泛應用。 2 系統平台上的硬件系統與軟件系統
本系統的硬件平台采用 Intel公司的 PXA270[2] [3]微處理器。該處理器是 Intel公司於 2004年 4月發布的面向移動電話和掌上電腦需求,基於 Xscal架構的 PXA27x系列處理器,最高主頻可達 624MHz。PXA270最引人注目的是加入了無線多媒體擴展技術( Wireless MMX),大大提升了多媒體處理能力;同時 PXA270還加入了 Intel SpeedStep動態電源管理技術,實現嵌入式設備的智能電源管理。此外, PXA270具有豐富的擴展接口: SD/SDIO/MMC、 CF/PCMCIA、CMOS/CCD CAMERA、USB2.0、KEYBOARD等。
平台的軟件系統采用內核為 Linux-2.6.18的嵌入式 Linux操作系統。嵌入式 Linux操作系統具有相當多的優點,它的內核穩定、功能強大、支持多種硬件平台、源代碼完全開放,可裁減和低成本的特性非常適合於嵌入式應用,並且 Linux本身直接提供完整的 TCP/IP協議,可非常方便地進行網絡應用。 3 基於 Video4Linux的視頻圖像采集
在 Linux下,設備驅動程序可以看成 Linux內核與外部設備之間的接口。設備驅動程序向應用程序屏蔽了硬件具體實現細節,使得應用程序可以像操作普通文件一樣來操作外部設備。在 Linux下,視頻采集設備的正常使用依賴於 Video4Linux標准的支持。
Video4Linux(簡稱 V4L)是 Linux中關於視頻設備的內核驅動,它為針對視頻設備的應用程序編程提供了一系列接口函數,這些視頻設備包括 TV卡、視頻捕捉卡和 USB攝像頭等。視頻采集的一般流程為:(1)打開視頻設備;(2)讀取設備信息;(3)進行視頻采集;
(4)對采集的視頻數據進行處理和顯示;(5)關閉視頻設備。
視頻采集主要有兩種方法:(1)直接從設備讀取;(2)內存映射。本系統采用第二種方法進行視頻采集,其優點是當采用內存映射時,直接用 mmap()系統調用使得進程之間通過映射同一個普通文件實現共享內存。普通文件被映射到進程地址空間后,進程可以像訪問普通內存一樣對文件進行訪問,不必再調用 read(),write()等操作。而且采用共享內存通信的一個顯而易見的好處是效率高,因為進程可以直接讀寫內存,而不需要任何數據的拷貝。
采用內存映射實現視頻采集的部分源代碼如下:
(1)調用 VIDIOCGBUF獲取映射的 buffer信息 ioctl(vd->fd, VIDIOCGBUF,&(vd->mbuf))
(2)將 mmap與 video_mbuf綁定 int v4l_mmap_init(v4l_device *vd) { if(v4l_get_mbuf(vd)<0) return -1; if((vd->map=mmap(0,vd->mbuf.size,PORT_READ|PORT_WRITE,
MAP_SHARED,vd->fd))<0) return -1; return 0;}
(3)進行圖像采集前的設置 int v4l_grab_init(v4l_device *vd)
{ vd->mmap.width=640; //設置圖像窗口 vd->mmap.height=480; //窗口大小為 640×480 vd->mmap.format=VEDIO_PALETTE_YUV420P; //采樣格式為 YUV420P …}
(4)調用 VIDIOCMCAPTURE開始一幀的截取 ioctl(vd->fd, VIDIOCMCAPTURE,&(vd->mmap));
(5)調用 VIDIOSYNC等待一幀截取結束
if(ioctl(vd->fd, VIDIOSYNC,&frame)<0) {perror(v4l_sync);return -1;}
該函數成功返回則表示一幀采集已完成,采集到的圖像數據放到起始地址為 vd->map+vd->mbuf.offsets[vd->frame]的內存區中,讀取該內存區中的數據便可得到圖像數據。接着可以做下一次的 VIDIOCMCAPTURE。
使用 V4L進行圖像采集時,可采用 “不間斷采集”的方法加快采集過程。驅動程序要提供至少兩幀圖像大小的緩沖空間,在一幀緩沖完成之后,不管此時應用程序有無提出新的 VIDIOCMCAPTURE請求,驅動都將第二幀圖像覆蓋保存至另一個緩沖內,兩個緩沖輪流使用,不丟任何幀。
4 視頻圖像壓縮與傳輸
通過以上采集程序獲得的圖像數據為原始數據,可以根據圖像采集格式將圖像信息存儲成文件,通過網絡用 webserver傳輸到服務器端刷新顯示。如果不對圖像進行壓縮,則圖像數據較大,不便於在網絡上傳輸,這就要求系統首先對原始視頻圖像數據進行壓縮處理,而通用網絡瀏覽器一般支持 BMP、JPG、GIF三種網絡圖片格式,因此本系統采用 JPEG壓縮方式。
JPEG是 Joint Photographic Experts Group(聯合圖像專家組)的縮寫,文件后綴名為“.jpg”或“.jpeg”,是最常用的圖像文件格式,是由一個軟件開發聯合會組織制定,是一種有損壓縮方式,能夠將圖像壓縮到很小的儲存空間。JPEG格式是目前網絡上最流行的圖像格式,JPEG壓縮技術十分先進,它用有損壓縮方式去除冗余的圖像數據,在獲得較高的壓縮率的同時能展現十分豐富生動的圖像,非常適合於視頻網絡傳輸。
Linux中沒有 jpeg函數庫,需要下載 jpegsrc.v6b.tar.gz后,在 /usr/src解壓安裝: cd jpeg-6b ./configure Make Make install
這樣,Linux就支持 jpeg函數庫了,在編譯器編譯連接時帶有 -l jpeg選項就能連接上 jpeg函數庫了。
利用下面函數將采集到的 YUV420P的原始圖像數據直接壓縮成 JPEG格式進行傳輸:
int yuv420p_to_jpeg(char **jpeg_data, unsigned char *image, int width, int height,int quality),其中, jpeg_data 指向壓縮圖像數據指針的指針, image為采集圖像原始數據,width為長度,height為高度,quality為壓縮質量,函數的返回值為產生壓縮圖像數據的長度。
現在企事業的業務大多通過 Web技術[4]來部署實現。通過 Web方式主要有以下幾點優勢:(1)可以簡化界面的工作,直接使用瀏覽器界面,而瀏覽器已是計算機的必備軟件了。
(2)很容易實現超出局域網范圍的遠程控制,並可以實現遠程自動系統升級。(3)應用層程序開發快捷,由於 Web標准的統一,使得開發是跨平台的。而嵌入式系統性能的增強也使得 Web服務進入嵌入式領域成為可能。 Web服務的優勢也同樣適用於嵌入式系統。
webserver又被稱為 HTTP Server,它是對 HTTP協議服務器端功能的實現。HTTP協議是架構在 TCP/IP協議上的應用級協議,其目的是方便和加速對分布式協同工作的超媒體信息系統的訪問。HTTP協議通過統一資源定位符(Universal Resource Location,URL)來定位分布式的超媒體信息。URL通過“通信協議+網絡地址”字符串來唯一標識信息位置。如: http://www.nass.net/storage.htm就是一個 URL。這個 URL明確給出使用的協議是: HTTP協議。
Linux系統是通過提供套接字( socket)來進行網絡編程的。通過 webserver進行網絡傳輸時涉及到的套接口操作函數[5]主要有:socket()函數,主要功能是創建指定類型的套接口並返回套接口描述符;bind()函數,主要功能是使套接口與 IP地址和端口號綁定;connect()函數,主要功能是用來與遠端服務器建立連接; listen()函數,主要功能是當 socket與某一端口捆綁以后,就需要監聽該端口,以便對到達的服務請求加以處理; accept()函數,主要功能是接受連接隊列里的服務請求,並返回一個新的 socket描述符,來供這個新連接使用。需要注意的是,服務器並不是通過監聽端口來與客戶連接並通信,而是產生一個新的套接口與客戶通信。例如 webserver在 80號端口監聽,當有客戶向 80號端口發出連接請求時,服務器將接受請求且由服務器進程派生出子進程和新的套接口(由 accept()的返回值指向)來與客戶連接並通信。
將采集格式為 YUV420P的原始視頻圖像數據壓縮成 JPEG格式,並當客戶端有連接時,通過子進程向客戶端發送 JPEG圖像數據: if((size=(yuv420p_to_jpeg(&imagebmp,imageptr,640,480,20)))<0) { printf("Error:write jpeg error!");
}
if(!fork())
{
if(revbuf[5]==' ')
send(nsockfd, imagebmp, size, 0);
}
這樣,當系統運行時,通過設置 PC機的 IP地址(與系統 IP地址在同一網段內),在 PC機的 IE瀏覽器內輸入以下 IP地址:http://192.168.0.232:81/,將看到圖像格式為 JPEG的圖片。通過刷新,可以更新圖像。 5 播放視頻流
為了播放實時視頻,可以通過在目標板的 ARM Linux系統中移植一個視頻服務器的應用程序來實現。Webcam[6][7]是一個比較常用的的視頻應用程序,通過網絡下載 webcam_server的 Linux版本: webcam_server-0.50.tar.gz,它是基於 GNU架構之下的,完全免費,源碼開放。解壓后執行./configure,生成 Makefile文件。修改當前目錄和 src目錄下的 Makefile的 CC為/usr/local/arm/3.4.3/bin/arm-linux-gcc,執行 make,產生 webcam_server可執行文件,把此應用程序加載到 270開發板上就可以使用了。
如果遠端客戶端是 Windows操作系統,下載 Active webcam的客戶端,並安裝。設置好 PC機的 IP地址(與系統 IP地址在同一網段內)后,啟動 Active webcam。選擇 Tools—>Create Web Page新建一個網頁瀏覽頁,並選中 settings,對視頻瀏覽的相關參數進行設置。具體設置為:Video Device選中 Network IP Camera;Preview Frame Rate:8 frames per sec;Camera Model:Active WebCam HTTP Server;IP Adress or URL:192.168.0.232(即開發板的 IP地址);Port:8888。整個設置完后,就可以搜索攝像頭,找到攝像頭后,就能在相應的 PC機上動態顯示攝像頭采集的圖像信息,如圖 1所示,畫面清晰,圖像采樣大小為 320×240。點擊記錄按鈕,還能將采集到的動態視頻以 .AWLive的文件格式保存到
C:/Program Files/Active WebCam/Gallery目錄下,文件類型為: Active WebCam Video Record,雙擊該文件能進行自動播放。
如果遠端客戶端是 Linux操作系統,可以使用 java applet進行視頻流播放,需要在 Linux主機上安裝 jdk環境,可從 Sun公司的 Java網站上下載 JDK1.6的 Linux版本: jdk-6u11-linux-i586-rpm.bin,先為該文件增加可執行權限: chmod a+x jdk-6u11-linux-i586-rpm.bin,然后對該文件進行自解壓: ./ jdk-6u11-linux-i586-rpm.bin,將自動進行安裝,在 /usr/java目錄下生成了 java環境,設定相關的環境變量: export PATH=/usr/java/jdk1.6.0_11/bin:$PATH,為了讓瀏覽器找到這個 Java Plug-in,必須將環境參數 NPX_PLUGIN_PATH指到文件 javaplugin.so所在的目錄: export NPX_PLUGIN_PATH=/usr/java/ jdk1.6.0_11/jre/plugin/i386/ns7。設置完后,可以使用 java applet程序播放視頻流,具體命令為:java –classpath applet.jar:/usr/java/ jdk1.6.0_11/lib/tool.jar
WebCam 192.168.0.232 8888。這時,在 Linux主機上可以獲取 usb camera采集的視頻流,並產生動態鏈接的畫面,如圖 2所示,畫面清晰,圖像采樣大小為 320×240,速率能達到 8幀/秒,動態刷新效果良好。 6 結束語
本文討論了基於 PXA270和嵌入式 Linux操作系統下 Web服務器中視頻圖片壓縮及其傳輸的實現方法,並通過移植 Webcam_server及其相應軟件,客戶端可以完成對遠程的視頻圖像的采集和動態顯示。由於該系統的核心工作采用高性能嵌入式微處理器完成,因此該系統具有結構簡單、性能穩定、成本低廉等優點。該技術具有通用性,應用范圍相當廣,可以作為簡單的安全監控、遠程現場監控等應用,同時,在機器人監控系統、視頻電話、遠程教學等應用中也有一定的應用前景。本文創新點: 1 對原始采集的視頻圖像信號進行 JPEG壓縮后,自主設計 Webserver對其進行網絡傳輸; 2 利用 Webcam_server分別在 Linux和 Windows操作系統下進行網絡實時視頻采集與傳輸。
參考文獻
[1]王培珍,徐俊生.基於 ARM9的嵌入式 Linux圖像采集系統設計[J].中國制造業信息化,2007,10:85-88.
[2]李瑞祥.基於 PXA270的視頻監控系統的設計與開發[J].光學儀器 ,2008,3:42-45.
[3]石秀民,魏洪興 .嵌入式系統原理與應用——基於 Xscale®與 Linux[M].北京:北京航空航天大學出版社.2007.
[4]時雨露,潘淑文 ,壽國礎.Linux嵌入式 WEB系統研究及實現 [J].微計算機信息,2007,03Z:3-5.
[5]陳學峰,柴俊霞 .Linux下基於 Socket的網絡編程[J].淮北煤炭師范學院學報 ,2004,3:60-63.
[6]周廣榮.基於 ARM視頻采集系統的設計與實現 .大連海事大學.碩士學位論文.2007:68-71.
[7]金福輝.基於 Intel Xscale270平台與嵌入式 Linux的圖像采集系統設計.山東大學.碩士學位論文.2007:53-54.