摘要:視訊影象採集及處理技術在遠端視訊監控和可視電話中有著廣泛的應用前景,驅動視訊採集裝置和獲取視訊資料並進行相應的處理,是實現這些應用的基礎。針對這些應用,構建了一個基於嵌入式 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.