李鵬飛
(貴州大學(xué) 計(jì)算機(jī)科學(xué)與信息學(xué)院,貴州 貴陽 550025)
嵌入式圖像技術(shù)已經(jīng)成為當(dāng)前電子產(chǎn)品研發(fā)領(lǐng)域的熱點(diǎn),并已應(yīng)用于智能交通、網(wǎng)絡(luò)通信、計(jì)算機(jī)視覺等領(lǐng)域[1]。傳統(tǒng)的基于PC的圖像采集設(shè)備,成本高而且體積大,因而限制了它在便攜設(shè)備、移動通信等領(lǐng)域的應(yīng)用。開發(fā)小型化、低功耗、速度快的圖像采集系統(tǒng)具有很好的工程應(yīng)用前景。該系統(tǒng)采用三星公司基于ARM9的S3C2440[2]搭建硬件平臺,采用高速率的 USB攝像頭,在 ARM-Linux的操作系統(tǒng)上實(shí)現(xiàn)數(shù)字圖像數(shù)據(jù)的采集與顯示。
硬件系統(tǒng)設(shè)計(jì)是以一款基于 ARM920T內(nèi)核的嵌入式微處理器S3C2440為核心,通過外擴(kuò)存儲器(Flash/SDRAM)、圖像輸入模塊,上位機(jī)通信模塊,LCD顯示模塊等來構(gòu)建硬件平臺,如圖1所示。
圖1 系統(tǒng)硬件結(jié)構(gòu)
1)S3C2440微處理器:S3C2440是韓國三星公司生產(chǎn)的16/32位 RISC嵌入式微處理器。該芯片處理速度快、功耗極低,與其他 ARM 芯片相比,具有豐富的片內(nèi)外圍接口。其內(nèi)部集成LCD顯示控制器以及FLASh控制器,硬件搭建較簡易。
2)外部存儲器:S3C2440支持從NAND FLASH啟動,NAND FLASH具有容量大、比NOR FLASH價(jià)格低等特點(diǎn)。本設(shè)計(jì)采用一片K9F1208作為NAND FLASH存儲器系統(tǒng),容量大小為 64MB,用來存放操作系統(tǒng)、應(yīng)用程序和其他數(shù)據(jù);采用一片HY57V561620CT作為SDRAM,容量大小為 32 MB。
3)圖像輸入模塊:采用 USB接口的宇宙通QC301攝像頭作為圖像采集系統(tǒng)的輸入設(shè)備。USB端口可以滿足即插即用的要求,傳輸速度快。
4)上位機(jī)通信模塊:上位機(jī)采用普通常用 PC機(jī)(CPU主頻1.7 GHz,內(nèi)存512M),通過RS232接口與開發(fā)平臺完成數(shù)據(jù)通信,進(jìn)行程序的輸入與調(diào)試,以便及時(shí)對系統(tǒng)進(jìn)行優(yōu)化和更新。
5)LCD顯示模塊:模塊采用三星4.3英寸液晶屏LTV350QV-F05,它是256色、分辨率為 480×272的TFT液晶屏,帶觸摸屏。具有輕薄、體積小、耗電量低、無輻射及映像穩(wěn)定不閃爍等特點(diǎn)。
硬件環(huán)境確定以后,首先,要為 linux設(shè)計(jì)一個(gè)BootLoader[3],通過BootLoader來初始化硬件,引導(dǎo)linux運(yùn)行。Bootloader設(shè)計(jì)可以在ads中實(shí)現(xiàn)。然后,針對硬件環(huán)境,和設(shè)計(jì)的BootLoader修改linux內(nèi)核。接下來,在Linux操作系統(tǒng)下建立編譯linux的交叉編譯環(huán)境。最后,配置、編譯、連接linux,下載編譯得到的映像文件到Flash,通過BootLoader來啟動linux。
在Linux下,設(shè)備驅(qū)動程序可以看成Linux內(nèi)核與外部設(shè)備之間的接口。V4L是Linux中關(guān)于視頻設(shè)備的內(nèi)核驅(qū)動,它為針對視頻設(shè)備的應(yīng)用程序編程提供一系列接口函數(shù)[4]。在系統(tǒng)平臺上對 USB口數(shù)碼攝像頭驅(qū)動,首先下載相應(yīng)的內(nèi)核補(bǔ)丁,解壓安裝之后,進(jìn)入內(nèi)核配置選項(xiàng),加載驅(qū)動,重新編譯內(nèi)核,使驅(qū)動以靜態(tài)編譯的方式被加載到內(nèi)核中。(1)Multimedia devices --- > <*>Video For Linux(2)USB Support --- > <*>Support for Host-side USB---USB Host Controller Driver Drivers <*>OHCI HCD support (3)USB Multimedia devices <*>USB SPCA5XX Sunplus/Vimicro/Sonix jpeg Cameras
LCD顯示采用framebuffer技術(shù),它是圖形界面顯示的接口[5]。Linux內(nèi)核根據(jù)硬件描述抽象出framebuffer設(shè)備,用戶態(tài)的進(jìn)程能夠直接寫屏。將Frame buffer映射到進(jìn)程地址空間之后,就可以直接進(jìn)行數(shù)據(jù)的讀寫操作,寫操作可以反應(yīng)在顯示設(shè)備上。此系統(tǒng)中framebuffer的設(shè)備文件是/dev /fb0。幀緩沖設(shè)備驅(qū)動程序主要基于兩個(gè)文件:①Linux/include/linux/fb.h;②linux/drivers/video/fbmem.c。由于其為字符設(shè)備,所以采用“文件層——驅(qū)動層”的接口方式。幀緩沖設(shè)備驅(qū)動層接口直接對LCD硬件操作,而fbmem.c能記錄并管理數(shù)個(gè)底層設(shè)備驅(qū)動。
設(shè)計(jì)采用的圖像采集系統(tǒng)軟件部分主要包括圖像獲取模塊、圖像處理模塊、圖像顯示模塊[6]。系統(tǒng)軟件結(jié)構(gòu)如圖2。
圖2 嵌入式圖像采集系統(tǒng)結(jié)構(gòu)圖
首先,打開攝像頭設(shè)備,獲取操作攝像頭設(shè)備的文件描述符,進(jìn)而獲取其一系列設(shè)備參數(shù)信息,將信息從內(nèi)核空間拷貝到用戶程序空間,在用戶空間修改數(shù)據(jù)信息。由于通常最快的磁盤訪問還是比最慢的內(nèi)存訪問要慢,所以系統(tǒng)采用內(nèi)存映射的方式截取圖像,加快I/O訪問速度。用函數(shù)vd->map=mmap(0,vd-> mbuf.size,PROT_READ|PROT_WRITE,MAP_SHARED, vd->fd,0)將攝像頭相應(yīng)的設(shè)備文件映射到內(nèi)存區(qū),在映射內(nèi)存區(qū)進(jìn)行數(shù)據(jù)的讀寫。
其次,本設(shè)計(jì)攝像頭采集的是JPEG圖片格式,由于LCD只能顯示RGB格式的圖像數(shù)據(jù),所以要將采集到的數(shù)據(jù)進(jìn)行解碼轉(zhuǎn)換成RGB格式。libjpeg是一個(gè)被廣泛使用的JPEG壓縮/解壓縮函數(shù)庫,它能夠讀寫 JPEG圖像文件,因此顏色空間轉(zhuǎn)換、降采樣/增采樣、顏色量化之類的工作由 libjpeg庫完成。系統(tǒng)所用的 Framebuffer設(shè)備的顏色深度為16位,采用5-6-5的顏色格式——即R(紅色)在16bit中為高5位,G(綠色)在16 bit中為中間6位,B(藍(lán)色)在16 bit中取低5位; libjpeg解壓出來的圖像數(shù)據(jù)為24位RGB格式,所以必須進(jìn)行數(shù)據(jù)轉(zhuǎn)換。對于24位的RGB,一個(gè)字節(jié)表示一種顏色分量,將其轉(zhuǎn)換為RGB565的方法為:對于R字節(jié),右移3位,對于G字節(jié),右移2位,對于B字節(jié),右移3位,然后將所有右移所得到的值拼接起來,就能夠得到16位的顏色值[7]。
最后,操作LCD設(shè)備,獲取顯示設(shè)備文件描述符,得到framebuffer固定信息,如圖形硬件上實(shí)際的幀緩存空間大小、硬件是否能夠加速等信息。得到FrameBuffer屏幕變化的信息,主要是Framebuffer的長度、寬度以及顏色深度等。然后將 framebuffer映射到內(nèi)存中,通過數(shù)據(jù)填充函數(shù)將之前通過數(shù)據(jù)處理獲得的RGB565顏色值寫到framebuffer中,這樣就可以在LCD顯示設(shè)備上看到采集到的圖像[8]。圖像采集的具體實(shí)現(xiàn)流程如圖3。
圖3 圖像采集流程
實(shí)驗(yàn)中設(shè)定系統(tǒng)向驅(qū)動申請4個(gè)幀緩沖進(jìn)行循環(huán)隊(duì)列采集,實(shí)驗(yàn)設(shè)置采集到的圖像為30幀。在實(shí)驗(yàn)室條件下,將系統(tǒng)串口線與 PC機(jī)連接,配置好超級終端,實(shí)現(xiàn)系統(tǒng)與PC機(jī)在windows下的通信,在 Linux下進(jìn)入要存放程序的目錄/tmp,將圖像采集系統(tǒng)程序通過點(diǎn)擊超級終端菜單中的“發(fā)送文件”將圖像采集系統(tǒng)程序傳送至 tmp目錄下,用命令chmod 777 caiji改變文件權(quán)限,使文件可執(zhí)行。最后執(zhí)行程序,采集到的圖像如圖4示。
圖4 實(shí)驗(yàn)結(jié)果
實(shí)驗(yàn)結(jié)果表明:本系統(tǒng)可以實(shí)現(xiàn)圖像的采集,視頻采集實(shí)現(xiàn)的效果比較流暢,在光線較暗的情況下,攝像頭仍能采集到視頻數(shù)據(jù),并能夠在LCD上顯示。較windows下的視頻采集效果要相對清晰。
設(shè)計(jì)在基于ARM9處理器s3C2440主要架構(gòu)硬件平臺基礎(chǔ)上,實(shí)現(xiàn)了嵌入式圖像采集系統(tǒng)。該系統(tǒng)體積小、攜帶方便,有著廣闊的應(yīng)用前景。下一階段的工作可以完善圖像采集系統(tǒng)功能,比如圖像數(shù)據(jù)的處理與壓縮,人工智能等算法。
[1] 屈執(zhí)勤,呂楊.基于 ARM Lniux的圖像采集與藍(lán)牙傳輸[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2007(08):28-30.
[2] 陳峰,郭爽,趙欣.基于QT和嵌入式的視頻監(jiān)控系統(tǒng)[J].通信技術(shù),2011,44(10):109-111.
[3] 劉地軍,鐘宏.基于ARM架構(gòu)的視頻服務(wù)器設(shè)置[J].信息安全與通信保密,2006(12):97-99.
[4] 張簡,孔翠香.嵌入式無線視頻小車的設(shè)計(jì)與實(shí)現(xiàn)[J].通信技術(shù),2011,44(11):113-115.
[5] 王培珍,徐俊生.基于ARM9的嵌入式 Linux圖像采集系統(tǒng)設(shè)計(jì)[J].智能控制、檢測技術(shù)及應(yīng)用,2007(10):85-88.
[6] 唐六華,唐建明,向紅權(quán).嵌入式Linux下OLED顯示功能模塊實(shí)現(xiàn)[J].信息安全與通信保密,2009(06):55-57.
[7] 王海珍,藤艷平.嵌入式 Linux 實(shí)時(shí)調(diào)度算法及應(yīng)用[J].計(jì)算機(jī)工程與設(shè)計(jì),2010(21):4592-4597.
[8] 吳繁.基于 ARM嵌入式平臺的目標(biāo)跟蹤系統(tǒng)的研究[D].武漢:武漢科技大學(xué),2009.