摘 要: 設計了基于S3C2440微處理器的視頻圖像采集系統(tǒng),詳細分析了該系統(tǒng)的啟動過程。在一塊裸板上搭建起整個視頻圖像采集系統(tǒng)。結合V4L2技術完成了支持YUV、MJPEG圖像格式的USB攝像頭和支持RGB圖像格式的CMOS攝像頭的多格式視頻圖像采集系統(tǒng)。測試結果表明,該系統(tǒng)可以在LCD顯示屏上動態(tài)顯示多格式攝像頭所采集到的視頻圖像,且視頻圖像具有清晰度高、流暢性好、穩(wěn)定性強等特點,具有進一步推廣使用的廣闊前景。
關鍵詞: u-boot與系統(tǒng)啟動;V4L2;多格式視頻圖像采集;video2lcd
0 引 言
當下隨著多媒體技術、集成電子技術、計算機技術的高速發(fā)展,視頻圖像采集技術也不斷發(fā)展,它的應用場合也更加廣泛。尤其近年來,隨著嵌入式技術的發(fā)展,ARM處理器運算的能力不斷地增強以及處理圖像的技術不斷地提高,使基于ARM的圖像采集廣泛地應用于各個領域[1-4]。視頻圖像采集更是成為了研究熱點。嵌入式這一技術的發(fā)展使得視頻采集系統(tǒng)具有了體積小、成本低、性能高等特點,能夠擴展到很多領域[5]?;谶@樣的背景,本文進行了一套有益研究。
本系統(tǒng)采用三星公司S3C2440微處理器搭建一個全新的視頻圖像采集系統(tǒng),包括分析改進u-boot源代碼,使之支持所用JZ2440開發(fā)板,支持開發(fā)板的串口、網卡功能,支持Nand啟動等,且大大簡化冗余代碼,編譯出簡潔高效的u-boot.bin文件,能夠實現快速燒寫和擦除,從而實現系統(tǒng)快速啟動。在搭建好開發(fā)環(huán)境之后,結合V4L2技術分析數據采集系統(tǒng)流程,編寫應用程序veido2lcd完成支持YUV、MJPEG圖像格式的USB攝像頭和支持RGB圖像格式的CMOS攝像頭的多格式視頻圖像采集系統(tǒng),最后對系統(tǒng)進行測試和分析。
1 開發(fā)環(huán)境搭建
1.1 系統(tǒng)軟硬件平臺
視頻圖像采集系統(tǒng)最終是要移植到嵌入式系統(tǒng)的,所以要搭建嵌入式平臺來完成交叉編譯等工作,文中采用支持V4L2的Linux系統(tǒng)。硬件平臺采用三星公司的ARM9開發(fā)板JZ2440,其硬件特性如下:
CPU處理器: 16/32 bit S3C2440A;
Flash存儲器: 512 MB NandFlash,64 MB NorFlash;
內存支持: 64 MB SDRAM,4 KB片內SRAM
USB總線與接口: 1個USB Host,1個USB Slave;
網卡支持: DM9000;
LCD顯示屏: 4.3英寸TFT LCD屏;
攝像頭支持: YUV格式的USB攝像頭,MJPEG格式的USB攝像頭,RGB格式的CMOS攝像頭。
1.2 系統(tǒng)交叉編譯工具的安裝
Linux開發(fā)所用的交叉編譯工具是arm-linux-gcc-4.3.2,設置環(huán)境變量:PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/arm/4.3.2/bin"完成安裝交叉編譯工具鏈。
它不能夠適應現有硬件環(huán)境,需要對其進行如下修改:
(1) 修改U-boot源代碼以支持S3C2440開發(fā)板
在單板相關的配置文件boards.cfg中添加:
ssmdk2440 arm arm920t - samsung s3c24x0
(2) 配置時鐘參數以適應于S3C2440
需要對CPU的MPLL進行設置,否則內存不能正常使用。在start.S里增加對MPLL的設置:
?、僭O置CPU為異步總線模式;
②設置分頻系數和MPLLCON寄存器將系統(tǒng)時鐘頻率設定為400 MHz。
(3) 支持S3C2440的硬件配置
在include/configs/smdk2440.h中去掉宏CONFIG_S3C2410,增加配置宏CONFIG_S3C2440以支持S3C2440的相關硬件配置,比如串口波特率正常。
(4) 支持Nand啟動
由于Nand啟動時只能復制最前面的4 KB代碼到SDRAM,這要求重定位之前的啟動代碼應該少于4 KB。原來的代碼在鏈接時加了"-pie"選項, 使得生成的u-boot.bin里多了"*(.rel*)"、 "*(.dynsym)"、導致編譯出來的u-boot非常大,不能支持Nand啟動,需修改代碼來減小u-boot。
①去掉 "-pie"選項
在arch/arm/config.mk:75:LDFLAGS_u-boot += -pie中去掉該行以減少代碼。
②修改include/configs/smdk2440.h中的連接地址:
#define CONFIG_SYS_TEXT_BASE 0x33f80000
將鏈接地址改為0x33f00000,這是因為SDRAM大小為64 MB,它的基地址是0x30000000,尾址是0x34000000,在0x33f00000~0x34000000之間1 MB空間足夠用來存放u-boot代碼。
?、坌薷膕tart.S,實現代碼的重定位,即上電后把NandFlash內前4 KB的代碼復制到片內SRAM,然后由這4 KB代碼實現將NandFlash上的u-boot代碼復制到SDRAM上鏈接地址以0x33f00000開始的地方。
(5) 支持DM9000網卡
在smdk2440.h中增加宏定義define CONFIG_DRIVER_DM9000完成S3C2440對網卡DM9000的支持。
將修改好的u-boot重新make,編譯通過,生成新的u-boot.bin文件。
以Nor方式啟動開發(fā)板,通過tftp工具將編譯好的u-boot.bin文件燒寫到開發(fā)板,然后關閉開發(fā)板,撥為Nand啟動方式重啟開發(fā)板,啟動后效果如圖1所示,這樣就完成了一個支持Nand啟動,支持DM9000網卡的u-boot的移植。
2 視頻圖像采集系統(tǒng)設計
2.1 Linux內核下的V4L2驅動框架
在Linux系統(tǒng)下,通過VideoforLinux實現對Linux視頻采集設備的支持通常將其稱為V4L[6]。它是Linux內核中有關視頻設備的驅動程序。Linux內核提供Video4Linux2 應用程序接口,在程序開發(fā)時首先是基于Video4Linux2 API函數來設計程序[7]。
視頻圖像的采集流程如圖2所示。
首先使用open函數打開攝像頭設備,以獲取該攝像設備的文件描述符,接著調用攝像頭設備的接口函數vidioc_querycap()來獲取設備的參數信息,從而確定接入的是圖像捕捉設備。由于V4L2所支持的視頻格式有多種,而所接入攝像頭設備支持YUV、MJPEG、RGB三種格式中的哪一種也是事先未知的,所以V4L2中包含對格式的一系列的操作,包括枚舉、獲得、測試、設置等接口函數,完成對攝像頭設備所支持圖像格式的獲取、測試和設置工作。比如確定了攝像頭為MJPEG格式之后,V4L2就要為視頻流數據申請緩沖區(qū)并查詢緩沖區(qū)信息。為了加快對I/O的訪問速度,使用mmap()函數將攝像頭相應的設備文件映射到內存區(qū)并且把獲得的緩沖區(qū)通過函數vidioc_qbuf()放入隊列中。準備工作完成之后通過執(zhí)行vidioc_streamon()啟動視頻流數據的采集。這里使用poll機制等待數據的到來,有了數據之后就可以執(zhí)行vidioc_dqbuf()函數從緩沖區(qū)隊列中獲取一幀視頻流數據,當不再采集的時候就可以調用vidioc_streamoff()停止視頻流的采集。
2.2 應用程序video2lcd骨架
要使視頻數據顯示到LCD顯示屏上,需要將攝像頭采集到的視頻數據經過格式轉換、縮放、合并、顯示等操作才能最終顯示到LCD顯示屏上。整個過程的流程圖如圖3所示。
?、艛祿袷降霓D換:由于LCD顯示屏只能支持RGB一種格式,而攝像頭采集到的數據有YUV、MJPEG、 RGB三種格式,故需要進行數據格式的轉換(RGB格式不需要進行轉換的)。函數static int Yuv2RgbConvert(PT_VideoBuf ptVideoBufIn, PT_VideoBuf ptVideoBufOut)用來把內存里的YUV圖像轉換為RGB圖像。函數static int Mjpeg2RgbConvert(PT_VideoBuf ptVideoBufIn, PT_VideoBuf ptVideoBufOut)用來將內存里的MJPEG圖像轉換為RGB圖像。
?、茍D像的縮放:由于攝像頭采集到的圖像分辨率與LCD的分辨率并不吻合,為了得到清晰流暢的視頻圖像,需要進行圖像大小的縮放。函數int picZoom(PT_PixelDatas ptOriginPic, PT_PixelDatas ptZoomPic) 用來實現這一功能。
?、菆D像轉入緩存:即將縮放后的圖像轉入FrameBuffer,使用函數intPicMerge(iTopLeftX, iTopLeftY, &ptVideoBufCur->tPixelDatas, PT_PixelDatas ->ptFrameBuffer)來完成。緩存Framebuffer中的數據就可以直接在LCD屏幕上顯示。
當完成以上工作后,video2lcd應用程序就編寫完成,它能夠將攝像頭采集到的視頻圖像數據清晰流暢地顯示在LCD屏幕上,同時支持YUV、MJPEG、RGB三種格式的視頻圖像的采集,支持多款USB攝像頭的同時也支持CMOS攝像頭。將交叉編譯通過后的video2lcd傳輸到開發(fā)板的文件系統(tǒng)。
3 應用測試與分析
以Nand方式啟動開發(fā)板,首先將支持YUV格式的USB攝像頭插到開發(fā)板的USB接口,這在串口界面執(zhí)行命令:./video2lcd /dev/video0,回車之后就可以看到LCD顯示屏上有視頻圖像了,晃動攝像頭可見視頻圖像清晰流暢,以同樣的操作分別將支持MJPEG格式的USB攝像頭和支持RGB格式的CMOS攝像頭接到開發(fā)板上,觀察視頻圖像。圖4即為USB攝像頭采集到的MJPEG格式的視頻圖像以及CMOS攝像頭采集到的RGB格式視頻圖像在4.3英寸LCD屏幕上的顯示效果圖,通過與筆記本上圖像的對比可見,視頻圖像非常清晰且視頻流暢。
4 結束語
基于S3C2440微處理器和ov7740視頻處理芯片搭建了嵌入式視頻圖像采集平臺,為開發(fā)實現多格式視頻圖像的實時采集與傳輸提供了可行方案。采用嵌入式技術,使系統(tǒng)具有體積小、成本低、普適性高等特點。該方案具有廣泛的應用價值。
參考文獻
[1] 劉攀,王紅亮,孟令軍. 基于 FPGA 的數字圖像采集存儲系統(tǒng)的設計[J]. 電視技術, 2010,34(6) :32-34.
[2] 劉珂含,何培宇,關勝平,等. 基于TMS320VC5509A的圖像采集與識別系統(tǒng)[J]. 四川大學學報:自然科學版, 2008,45(1):48-52.
[3] 嚴新忠,陳雨. 基于嵌入式ARM的圖像采集與傳輸設計[J].研究與開發(fā), 2009,28(11) :57-59.
[4] 劉紅喜,李長江,孫俊喜. 基于DSP的圖像采集及處理系統(tǒng)的設計與實現[J]. 電子技術應用,2009,35(2) :22-26.
[5] 劉志華. 基于ARM和Linux的視頻圖像采集系統(tǒng)[J]. 微型機與應用, 2014,33(3):12-14,17.
[6] 鄒意然,王永威,趙龍. 嵌入式系統(tǒng)中USB攝像頭的圖像采集[J]. 微計算機信息, 2010,26(12-2):24-26.
[7] COX A. Video 4 Linux programming [EB/OL]. [2014-08-04]http://www.redhat.com.