基于ARMLINUX 視頻采集系統(tǒng)項目<B>總結(jié)報告<╲╱B>_第1頁
基于ARMLINUX 視頻采集系統(tǒng)項目<B>總結(jié)報告<╲╱B>_第2頁
基于ARMLINUX 視頻采集系統(tǒng)項目<B>總結(jié)報告<╲╱B>_第3頁
基于ARMLINUX 視頻采集系統(tǒng)項目<B>總結(jié)報告<╲╱B>_第4頁
基于ARMLINUX 視頻采集系統(tǒng)項目<B>總結(jié)報告<╲╱B>_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、 基于ARMLinux 視頻采集系統(tǒng) 項 目 總 結(jié) 報 告 目錄1 項目的基本情況及市場需求.32 項目的實現(xiàn) .3 2.1 硬件的體系結(jié)構(gòu) .3 2.2 嵌入式系統(tǒng)軟件平臺 .4 2.3 圖像采集和顯示設計 .103 項目測試 .22 3.1 測試環(huán)境 .22 3.2 測試范圍 .22 3.3 測試內(nèi)容 .22 3.4 測試用例 .234 實驗結(jié)果 .235 項目總結(jié) .23一、項目的基本情況及市場需求 視頻采集系統(tǒng)是當前應用十分廣泛的一種視頻采集設備,隨著信息技術的迅速發(fā)展,計算機產(chǎn)業(yè)的發(fā)展已經(jīng)到了所謂的后PC 時代。在傳統(tǒng)的視頻采集中,系統(tǒng)一般由CCD 攝像頭,采集卡組成,功能齊全,但

2、價格高,體積大。嵌入式系統(tǒng)在各行業(yè)的應用,特別是工業(yè)現(xiàn)場、信息家電、機頂盒等方面的廣泛使用,使嵌入式系統(tǒng)的研究開發(fā)成為計算機領域的一個熱點。嵌入式圖像采集則彌補了上述的缺點,并且可以復雜環(huán)境下的圖像采集嵌入式Linux 操作系統(tǒng)是從Linux 衍生出來的一種操作系統(tǒng),它支持眾多嵌入式處理器,并具有Unix 的很多優(yōu)點,而成為當前主流的嵌入式操作系統(tǒng)。本項目選擇三星系的嵌入式處理器S3C2440,高速清晰攝像頭和LCD 組成,軟件則用嵌入式Linux 為操作系統(tǒng),在嵌入式開發(fā)板上先進行Linux 的移植后完成,其次對攝像頭在ARM 下的驅(qū)動進行修改和更新使其適應所采用的ARM 開發(fā)板,再者完成驅(qū)

3、動的加載和交叉編譯應用程序來完成對圖像的采集,最后從濾波算法和優(yōu)化所采集的圖片,使圖片完成各種場合實驗的要求。本系統(tǒng)體積小,占用內(nèi)存低,模塊化的系統(tǒng)通過協(xié)調(diào)的工作,形成了一套完整的圖像采集系統(tǒng),本系統(tǒng)所用的ARM9 系列的實驗箱完全是從底層開發(fā)開始,成本低,加上Linux 并不是商業(yè)的軟件,使得嵌入式視頻采集系統(tǒng)有很好的擴展空間和廣泛的前景。二 項目的實現(xiàn)2.1硬件的體系結(jié)構(gòu) 本系統(tǒng)從硬件方面來看具體實現(xiàn)框圖如2.1 所示。該系統(tǒng)平臺采用SAMSUNG公司的處理器S3C2410。 圖2.1 該處理器是內(nèi)部集成ARM 公司的ARM920T 處理器核32 位微控制器,資源豐富,帶獨立的16KB 指

4、令Cache 和16KB 數(shù)據(jù)Cache,LCD 控制器,RAM 控制器,NAND 閃存控制器,3 路UART,4 路DMA,4 路帶PWM的Timer,并行I/O 口,8 路10 位ADC,TouchScreen 接口,112C 接口,IIS 接口,2 個USB 接口控制器,2 路SPI,主頻最高可達203MHz。 在處理器豐富資源的基礎上進行了相關的配置和擴展,平臺配置了一片32Mxl6 位的FLASH 和兩16Mxl6 位的SDRAM,通過以太網(wǎng)控制器芯片DM9000 擴展了一個網(wǎng)口,另外引出一個串行接口和一個HOSTUSB 接口。通過在USB 接口上外接一個帶USB 口的網(wǎng)絡攝像頭,將

5、采集到的視頻圖像數(shù)據(jù)放入存儲器緩沖區(qū)中,接著或者保存成文件的形式,并且利用avilib 庫來實現(xiàn)對已經(jīng)壓縮的peg 格式的圖片進行avi 格式的組織來保存在U 盤里。2.2 嵌入式系統(tǒng)軟件平臺2.2.1交叉編譯環(huán)境 通常嵌入式系統(tǒng)的軟件編譯和執(zhí)行是在兩個不同平臺上進行的。編譯是在宿主機,一般為桌面主機;執(zhí)行是在目標機,即嵌入式系統(tǒng)的硬件平臺。一般是在宿主機上通過跨平臺交叉編譯器把源文件編譯成目標平臺上可執(zhí)行的文件,再通過串口、并口或者網(wǎng)絡下載至目標平臺上的FLASH 或者其它存儲介質(zhì),然后由目標機來運行這些軟件。這里所說的跨平臺編譯器和一般的編譯器功能類似,都是把源代碼通過編譯器編譯成目標文件

6、,然后通過鏈接器、可重定位器程序和定位器把目標文件重新定位成可執(zhí)行文件。和通用的編譯器之間最大的差別就在于跨平臺編譯器編譯出來的可執(zhí)行程序通常只能在特定CPU 所屬平臺上運行。所以一般來說每種CPU 都對應有不同的跨平臺編譯器。本系統(tǒng)采用基于ARM 920T 的是S3C2410X,可以使用常用的ARM 交叉編譯器。要成功構(gòu)建完整的交叉編譯環(huán)境,需要在宿主機上創(chuàng)建一系列的工具,包括C/C+編譯器、匯編器、鏈接器、嵌入式系統(tǒng)的標準C 庫和GDB 代碼級調(diào)試器。成功建立好開發(fā)環(huán)境后便可以運用這些工具進行嵌入式系統(tǒng)開發(fā)了。交叉編譯環(huán)境的安裝步驟,如圖3.1 所示: 2.2.2 嵌入式Linux 系統(tǒng)移

7、植 在一個嵌入式Linux 系統(tǒng)中,從軟件的角度般一般可以粗略的分為引導加載程序、Linux 內(nèi)核、文件系統(tǒng)和用戶應用程序等3 個層次,如圖3.2(1)第一部分是引導加載程序,它包括固化在固件內(nèi)的boot 代碼和Bootloader 代碼兩個部分。許多CPU 在運行Bootloader 之前會先運行一段被稱之為固件的程序,例如x86 結(jié)構(gòu)的CPU 就是先運行BIOS 中的固件,然后再運行硬盤主引導記錄MBR(Master Boot Record)d?的Bootloader。在系統(tǒng)中本沒有固件程序,Bootloader 是上電后執(zhí)行的第一個程序。(2)第二部分是Linux 內(nèi)核。這一般是為特定于

8、某種體系結(jié)構(gòu)的嵌入式板子定制的內(nèi)核和內(nèi)核的啟動參數(shù)。一般而言,內(nèi)核的啟動參數(shù)是內(nèi)核默認的,或是由Bootloader 傳遞給它的。(3)第三部分文件系統(tǒng)。里面包含了Linux 系統(tǒng)能夠運行所必需的應用程序、庫等,例如給用戶提供操作控制界面的shell 程序,動態(tài)連接程序運行時所需要的glibe 或uClibc 庫等,本設計中我們使用的文件系統(tǒng)是yaffs 文件系統(tǒng)。a)BootLoader BootLoader 是系統(tǒng)加電后運行的第一段代碼。一般只是在啟動時運行很短的時間,然而對一個嵌入式系統(tǒng)來說,這一部分卻是整個系統(tǒng)的一個無比重要的組成部分,不可缺少。在一般嵌入式系統(tǒng)中,系統(tǒng)復位或者加電后通

9、常從地址ox00000000 處開始執(zhí)行,而這個地址一般正是存放的BootLoader 啟動代碼。通過這段程序,可以初始化硬件設備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),以便為最終加載操作系統(tǒng)內(nèi)核準備好正確的環(huán)境。一般BootLoader 都包含兩種不同的操作模式:“啟動加載”模式和“下載”模式,這種區(qū)別僅對于開發(fā)人員才有意義。從最終用戶的角度看,BootLoader 的作用就是用來加載操作系統(tǒng),而并不存在所謂的啟動加載模式與下載模式的區(qū)別。 (1)啟動加載(Boot loading)模式:這種模式也稱為“自主”(Autonomous)模式,即BootLoader 從

10、目標機上的某個固態(tài)存儲設備上將操作系統(tǒng)加載到RAM 中運行,整個過程并沒有用戶的介入。這種模式是BootLoader 的正常工作模式,因此在嵌入式產(chǎn)品發(fā)布的時候,BootLoader 顯然必須工作在這種模式下。 (2)下載(Downloading)模式:在這種模式下,目標機上的BootLoader 將通過串口連接或者網(wǎng)絡連接等通信手段從主機(HOST)下載文件,比如下載內(nèi)核映像和根文件系統(tǒng)映像等。從主機下載的文件通常首先被BootLoader 保存到目標機的AM 中,然后再被BootLoader 寫到目標機上的FLASH 類固態(tài)存儲設備中。BootLoader 的這種模式通常在第一次安裝內(nèi)核與

11、根文件系統(tǒng)時被使用,此外,以后的系統(tǒng)更新也會使用BootLoader 的這種工作模式。工作于這種模式下的BootLoader 通常都會向它的終端用戶提供一個簡單的命令行接口。BootLoader 的實現(xiàn)依賴于CPU 的體系結(jié)構(gòu),一般來說啟動過程分為兩個階段。第一階段依賴于CPU 體系結(jié)構(gòu)的代碼,比如設備初始化代碼等,通常都放在第一階段中,而且通常都用匯編語言來實現(xiàn),運行效率比較高。這個階段完成的任務一般如下: (1)硬件設備初始化(屏蔽所有的中斷、關閉處理器內(nèi)部的指令數(shù)據(jù)cache); (2)為第二階段準備RAM 空間; (3)復制BootLoader 的第二階段代碼到RAM 空間中; (4)

12、設置好堆棧并跳轉(zhuǎn)到第二階段的C 程序入口點。而第二階段則通常用C 語言來實現(xiàn),這樣可以實現(xiàn)復雜的功能,而且代碼會具有更好的可讀性和可移植性。這個階段主要任務有: (1)初始化本階段要使用的硬件設備; (2)檢測系統(tǒng)內(nèi)存映射; (3)將內(nèi)核映像和根文件系統(tǒng)從FLASH 讀到RAM 中; (4)為內(nèi)核設置啟動參數(shù); (5)調(diào)用內(nèi)核文件運行。b) Linux 內(nèi)核移植 本系統(tǒng)選用嵌入式Linux 作為目標機操作系統(tǒng),一方面由于Linux 是一款免費的操作系統(tǒng),能很好的降低成本,同時Linux 的開發(fā)應用現(xiàn)在已經(jīng)成為熱門,有大量的資源可用于學習與重復應用,并且Linux 系統(tǒng)具有良好的可移植性和可裁剪

13、性,能自動支持多任務管理。一般常用的GUI 如QT/E,MiniGUI 等都支持Linux。Linux 的開發(fā)工具也都可以很方便的免費獲得。在Linux 系統(tǒng)內(nèi)核代碼中有arch 目錄,其中包括了不同平臺的代碼,與體系結(jié)構(gòu)相關的代碼都存放在arch 下面相應的目錄中,本系統(tǒng)采用ARM 開發(fā)平臺,所以依賴ARM 硬件平臺的代碼都在archarm 下面。根目錄下面只需要修改Makefile文件,該文件主要任務是產(chǎn)生vmlinux 文件和內(nèi)核模塊。對該文件的修改主要是設置目標平臺和制定交叉編譯器,代碼如下:ARCH=armCROSS_COMPILE=arm-linux-接下來的工作便是修改arm 目

14、錄下面的相應文件,具體的工作主要就是在內(nèi)核文件中添加S3C2410 處理器信息,在arm 目錄下面的Makefile 文件添加:ifeq($(CONFIG_ARCH_S3C2410),y)TEXTADDR=0Xc0008000MACHINE=s3c241 0Endif配置文件config.in 也需要添加處理器信息,這樣在后面makemenuconifig 命令時可以看到S3C2410 的選項。具體為添加代碼:If“$CONFIG_ARCH_S3C241 0”=”y”;thencommentS3C2410 Implementationdep_boolSMDK(MERI TECH BOARD)C

15、ONFIG_S3C24 10_SMDK/CONFIG_ARCH_S3C241 0fi編譯出來的內(nèi)核存放在arm 目錄下的boot 目錄里面,該目錄下面的Makefile 文件也需要添加代碼:ifeq($(CONFIG_ARCH_S3C241 O),y)ZTEXTADDR=Ox30008000ZRELADDR=Ox30008000endif其它還有一些小的修改,基本上都是添加處理器的信息。更改完成之后需要對內(nèi)核進行配置和編譯。配置命令可以選用make config,make oldconfig,make menuconfig 或makexconfig 其中一個。編譯內(nèi)核需要創(chuàng)建內(nèi)核依賴關系、創(chuàng)建

16、內(nèi)核鏡像文件和創(chuàng)建內(nèi)核模塊。首先執(zhí)行make dep 命令,讀取配置過程生成的配置文件,來創(chuàng)建對應于配置的依賴關系樹,從而決定哪些需要編譯而哪些不需要;接著需要make clean 刪除前面步驟留下的文件,以避免出現(xiàn)一些錯誤;然后便可以生成所需要的內(nèi)核文件了,用makezlmage 來實現(xiàn)得到可移植的內(nèi)核。內(nèi)核文件傳至開發(fā)板便可以通過BootLoader 加載運行。C) 嵌入式文件系統(tǒng) 理論上嵌入式系統(tǒng)也可以使用硬盤和光盤,但是這與嵌入式系統(tǒng)的便攜性相違背,所以一般采用FLASH 作為存儲介質(zhì)。FLASH 具有獨特的物理特性,所以必須使用專門的嵌入式文件系統(tǒng)。嵌入式系統(tǒng)對文件的操作是通過層次結(jié)

17、構(gòu)實現(xiàn)的。對于用戶程序來說,文件是有結(jié)構(gòu)的文件,用戶程序通過對文件IO函數(shù)操作文件。嵌入式文件系統(tǒng)是嵌入式操作系統(tǒng)的一部分,它的任務是對邏輯文件進行管理,其工作包括提供對邏輯文件的操作(復制、刪除、修改等)接口,方便用戶操作文件和目錄。在文件系統(tǒng)內(nèi)部,根據(jù)存儲設備的特點,使用不同的文件組織模式來實現(xiàn)文件的邏輯結(jié)構(gòu)。此外,文件系統(tǒng)要對管理文件的安全性負責。文件系統(tǒng)不能直接控制物理設備,它是通過FLASH 驅(qū)動實現(xiàn)控制的。目前FLASH 支持的文件系統(tǒng)技術主要有JFFS2,YAFFS2,TrueFFS,F(xiàn)TLNTFL,RAMFS,CRAMFS 和ROMFS 等等。本系統(tǒng)采用的是CRAMFS 文件系

18、統(tǒng)和YAFFS文件系統(tǒng)并存,并采用RAMDISK 在內(nèi)存中模擬硬盤分區(qū)。CRAMFS 是針對Linux 內(nèi)核24 之后的版本所設計的一種新型文件系統(tǒng),是一個只讀壓縮的文件系統(tǒng),其主要優(yōu)點是將文件數(shù)據(jù)以壓縮形式存儲,在需要時進行解壓縮。一般嵌入式存儲器價格比較高,用CRAMFS 文件系統(tǒng)比較省空間,對于FLASH 這樣的小系統(tǒng),CRAMFS 是十分不錯的選擇。不過也J 下是由于文件形式是壓縮的格式,所以文件系統(tǒng)不能在FLASH 上直接運行。雖然可以節(jié)約不少FLASH 空間,但是文件系統(tǒng)運行時需要將大量的數(shù)據(jù)復制到RAM 中,因此消耗了RAM 空間。YAFFS 類似于JFFSJFFS2,是專門為N

19、AND 閃存設計的嵌入式文件系統(tǒng),根據(jù)NAND 閃存以頁面為單位存取的特點,將文件組織成固定大小的數(shù)據(jù)段。利用NAND 閃存提供的每個頁面16 字節(jié)的備用空間來存放ECC(ErrorCorrection Code)和文件系統(tǒng)的組織信息,不僅能夠?qū)崿F(xiàn)錯誤檢測和壞塊處理,也能夠提高文件系統(tǒng)的加載速度。YAFFS 采用一種多策略混合的垃圾回收算法,結(jié)合了貪心策略的高效性和隨機選擇的平均性,達到了兼顧損耗平均和系統(tǒng)開銷的目的。它是日志結(jié)構(gòu)的文件系統(tǒng),提供了損耗平衡和掉電保護,可以有效地避免意外掉電對文件系統(tǒng)一致性和完整性的影響。YAFFS 文件系統(tǒng)是按層次結(jié)構(gòu)設計的,分為文件系統(tǒng)管理層接口、YAFFS

20、 內(nèi)部實現(xiàn)層和NAND 接口層,這樣就簡化了其與系統(tǒng)的接口設計,可以方便地集成到系統(tǒng)中去。與JFFS 相比,它減少了一些功能,因此速度更快,占用內(nèi)存更少。綜合考慮,本系統(tǒng)采用兩種文件系統(tǒng)相結(jié)合的方法,使用CRAMFS 作為根文件系統(tǒng),并添加對YAFFS 文件系統(tǒng)的支持。RAMDISK 相當于一塊硬盤空間,可以理解為在內(nèi)存中虛擬出來一塊硬盤,所以上面有系統(tǒng)支持的各種文件系統(tǒng)。RAMDISK 的特點之一就是速度快,因為它是在RAM 中運行的。不過由于RAM 是掉電不保存的,所以系統(tǒng)在每次重啟時,前面的工作無法保存,所以需要在FLASH 中劃出一個RAMDISK 和另一個文件系統(tǒng)YAFFS,這樣,數(shù)

21、據(jù)文件可以保存在YAFFS 分區(qū)中。另外,本系統(tǒng)需要MTD(MemoryTechnology Devices,內(nèi)存技術設備)的支持。MTD 是對FLASH 操作的接口,提供了一系列的標準接口函數(shù),將硬件驅(qū)動和系統(tǒng)程序設計分開,硬件驅(qū)動人員不用了解存儲設備的組織方法,只需要提供標準的函數(shù)調(diào)用,比如讀、寫等等。2.3 圖像采集和顯示設計2.3.1 攝像頭驅(qū)動程序的移植和加載 Linux 本身自帶了采用ov511 芯片的攝像頭,而市場上應用最廣泛的是采用中芯微公司生產(chǎn)的zc301 芯片的攝像頭,下面我將針對這兩大系列的攝像頭分別做介紹。1、OV511 驅(qū)動的加載 1靜態(tài)加載 (1)在arm linu

22、x 的kernel 目錄下make menuconfig。 (2)首先(*)選擇Multimedia device->下的Video for linux。加載video41inux 模塊,為視頻采集設備提供了編程接口。 (3)然后在usb support->目錄下(*)選擇support for usb 和usb cameraov511 support。這使得在內(nèi)核中加入了對采用ov511 接口芯片的USB 數(shù)字攝像頭的驅(qū)動支持。 (4)保存配置退出。 (5)make dep;make zlmage 2動態(tài)加載 (1)在arm linux 的kernel 目錄下make menuc

23、onfig。 (2)首先<*>選擇Multimedia device->下的Video for linux。 (3)然后在usb support->目錄下<*>選擇support for usb 和<M>選擇usb camera ov51 1 support。 (4)保存退出。 (5)Make dep;make zlmage;make modules 然后就在/driver/usb 下生成ov511.ko,同時生成的zImage 自動放在/tftpboot 下。 (6)然后用新內(nèi)核啟動板子后insmod ov511.ko 就可以成功加載。動態(tài)方式

24、與靜態(tài)方式相比,測試時要簡單的多。不需要下載整個內(nèi)核,只需通過nfs,加載驅(qū)動即可測試。在測試成功后就可以編譯進內(nèi)核。模塊加載中出現(xiàn)的問題。 1insmod 和modprobe 間的一個區(qū)別是后者不會在當前目錄中查找模塊,它只在/lib/modules 下的缺省目錄下查找,這是因為該程序只是一個系統(tǒng)實用例程,不是一個交互工具。可以通過在/ere/ modules.conf 中指定自己的目錄,來把它們加到缺省目錄集中。 2如果插入模塊ov511.ko 時,出現(xiàn)以下信息:ov511.ko:unresolved symbol Video*之類的,說明還有其它模塊videodev.o 沒有加。 3出現(xiàn)

25、錯誤:ov511.ko:couldnt find the kernel version this moduleswas compiLCD for。這是試圖插入一個不是可裝入模塊的目標文件。因為在內(nèi)核配置階段,是把ov511 模塊靜態(tài)加到內(nèi)核中的,雖然看起來和可裝入模塊的文件名ov511.ko 完全一樣,但是不能用insmod 命令加入。 4如果出現(xiàn)ov511.ko:unresolved symbol video*,那就<M>選中videofor linux,用新生成的內(nèi)核啟動系統(tǒng),再insmod videodevo,insmod ov511.ko2、zc301 驅(qū)動加載 攝像頭的驅(qū)

26、動是從http:/mxhaard.free.fr/下的針對embeded 環(huán)境,有專門的patch,如usb-2.4.3 1 LE06.patch。 (1)把它放到kemel/driver/usb 下,解壓,打補丁。就會在此目錄下看到spca5xx 文件夾了。Patch 時會將修改方法寫到Makefile.rej 和eonfig.in.rej文件中,把這兩個文件里的內(nèi)容加到Makefile 和Kconfig 中就行了。 (2)編譯內(nèi)核,/kernel,make menuconfig。采用和上面介紹的ov511 驅(qū)動的方法一樣,動態(tài)加載。(M)選中SPCA5XX 這一項。 (3)make dep

27、;make zlmage;make modules。就會在/kernel/drive r/usb/spca5xx 中生成spca5xx.ko,spcadecoder.ko,spca_core. Ko.這就是我們要的驅(qū)動。 (4)用新內(nèi)核啟動,insmod 這三個.ko 文件(可以不用加載spcadecoder.ko),攝像頭就加載成功。2.3.2 Video41inux 編程 Vide04Linux 是Linux 中關于視頻設備的內(nèi)核驅(qū)動,它為針對視頻設備的應用程序編程提供一系列接口函數(shù),這些視頻設備包括現(xiàn)今市場上流行的TV 卡、視頻對于USB 口攝像頭,其驅(qū)動程序中需要提供基本的IO 操作接

28、口函數(shù)open、read、write、close 的實現(xiàn)。對中斷的處理實現(xiàn),內(nèi)存映射功能以及對IO 通道的控制接口函數(shù)ioctl 的實現(xiàn)等,并把它們定義在struct file operations 中。這樣當應用程序?qū)υO備文件進行諸如open、close、read、write 等系統(tǒng)調(diào)用操作時,Linux 內(nèi)核將通過file operations 結(jié)構(gòu)訪問驅(qū)動程序提供的函數(shù)。例如,當應用程序?qū)υO備文件執(zhí)行讀操作時,內(nèi)核將調(diào)用file operations 結(jié)構(gòu)中的read 函數(shù)。在系統(tǒng)平臺上對USB 口數(shù)碼攝像頭驅(qū)動,首先把USB 控制器驅(qū)動模塊靜態(tài)編譯進內(nèi)核,使平臺中支持USB 接口,再在

29、需要使用攝像頭采集時,使用insmode 動態(tài)加載其驅(qū)動模塊,這樣攝像頭就可正常工作了,接著進行了下一步對視頻流的采集編程。在USB 攝像頭被驅(qū)動后,只需要再編寫一個對視頻流采集的應用程序就可以了。根據(jù)嵌入式系統(tǒng)開發(fā)特征,先在宿主機上編寫應用程序,再使用交叉編譯器進行編譯鏈接,生成在目標平臺的可執(zhí)行文件。宿主機與目標板通信采用打印終端的方式進行交叉調(diào)試,成功后移植到目標平臺。本文編寫采集程序是在安裝Linux操作系統(tǒng)的宿主機PC 機上進行的,下面是具體論述。1 視頻編程的流程 (1)打開視頻設備。 (2)讀取設備信息。 (3)更改設備當前設置(可以不做)。 (4)進行視頻采集,兩種方法: a內(nèi)

30、存映射。 b直接從設備讀取。 (5)對采集的視頻進行處理。 (6)關閉視頻設備。2定義的數(shù)據(jù)結(jié)構(gòu)及使用函數(shù)Struct_v41_structInt fd;struot video_capability capability;struct video_buffer buffer;struct video_Windows Windows;struct video_channel channel8;struet video_picture picture;struct video_mmap mmap;struct video_mbufmbuf;unsigned char*map;typedef st

31、ruct_v41_struct v41_device;extem int v41_open(char *,v41_device *);extem int v41_close(v41_device *);extern int v41_get_capability(v41_device *);extem int v41 set norm(v41_device*,int);extern int v41_get_picture(v41_device*);extem int v41_grab_init(v41_device*,int,int);extem int v41_grab_frame(v41_d

32、evice*,int);extem hat v41_grab_sync(v41_device*);extem hat v41_mmap_init(v41_device*);extern hat v41_get_mbuf(v41_device*);extem int v41_get_picture(v41_device*);extern int v41_grab_picture(v41_device*,unsigned int);extern int v41 set buffer(v41_device*);extern int v41_get_buffer(v41_device*);extern

33、 int v41_switch_channel(v41_device*,int);3Video41inux 支持的數(shù)據(jù)結(jié)構(gòu)及其用途(1)video_capability 包含設備的基本信息(設備名稱、支持的最大最小分辨率、信號源信息等)。name32設備名稱。maxwidthmaxheightMinwidthminheightChannels 信號源個數(shù)type 是否能capture,彩色還是黑白,是否能裁剪等等。其值如VID_TYPE_CAPTURE(2)video_picture 設備采集的圖像的各種屬性。Brightness 065535huecolourcontrastwhitenes

34、sdepth 8 16 24 32paleRe VIDEO_PALETTE_RGB24| VIDEO_PALETTE_RGB565|VIDEO_PALETTE_JPEGI|VIDEO_PALETTE_RGB32(3)video channel 關于各個信號源的屬性。Channel 信號源的編號nametunersType VIDEO_TYPE_TV|IDEO_TYPE_CAMERANorm 制式PAL|NSTC|SECAM|AUTO(4)video Windows 包含關于capture area 的信息。x xWindows 中的坐標。YYWindows 中的坐標。(5)video _mbu

35、f 利用mmap 進行映射的幀的信息。size 每幀大小。Frames 最多支持的幀數(shù)。Offsets 每幀相對基址的偏移。(6)video _mmap 用于mmap。5.3 編程中關鍵步驟介紹1. Usb hub 接到開發(fā)板的usb host 上。cat/proc/devices 可以知道videocapture device 的major 是81,再ls -1/dev 看到video0 的次設備號是0,mknod/dev/video1 c 81 1。(1)打開視頻:Int v41_open(char *dev,v41_device *vd)if(!dev)dev=”/dev/video0”

36、;if(vd->fd=open(dev,O_RDWR)<0)perror(“v41_open:”);return -1;if(v41_get_capability(vd)return -1;if(v41_get_picture(vd)retum-1;return 0;(2)讀video_capability 中信息int v41_get capability(v41 device *vd)if(ioctl(vd->fd,VIDIOCGCAP,&(vd->capability)<0)perror("v41_get_capability:"

37、);return-1;)return 0;成功后可讀取vd->capability 各分量。(3)讀video_picture 中信息int v41_get_picture(v41_device*vd)if(ioctl(vd->fd,VIDIOCGPICT,&(Vd->picture)<0)perror(“v41_get_picture:”);return-1;)return O;成功后可讀取圖像的屬性。(4)改變video_picture 中分量的值先為分量賦新值,再調(diào)用VIDIOCSPICTVd->picture.colour=65535;if(ioc

38、tl(vd->fd,VIDIOCSPICT,(Vd->picture)<o)perror(”VIDIOCSPICT”);return-1;(5)初始化channel必須先做得到vd->capability 中的信息int v41_getchannels(v41_device *vd)int i;for(i=O;i<vd->capability.channels;i+)vd->channelichannel=i;if(ioctl(vd->fd,VIDIOCGCHAN,&(Vd->channeli)<0)perror(“v41_g

39、et_channel: ”);return-1;)return 0;(6)關閉設備int v41_close(v41_device *vd)close(vd->fd);return 0;2.重點:截取圖像的方法,我們采用的是mmap(內(nèi)存映射)的方式截取視頻。mmap()系統(tǒng)調(diào)用使得進程之間通過映射同一個普通文件實現(xiàn)共享內(nèi)存。普通文件被映射到進程地址空間后,進程可以向訪問普通內(nèi)存一樣對文件進行訪問,不必再調(diào)用read(),write()等操作。兩個不同進程A、B 共享內(nèi)存的意思是,同一塊物理內(nèi)存被映射到進程A、B 各自的進程地址空間。進程A 可以即時看到進程B對共享內(nèi)存中數(shù)據(jù)的更新,反之

40、亦然。采用共享內(nèi)存通信的一個顯而易見的好處是效率高,因為進程可以直接讀寫內(nèi)存,而不需要任何數(shù)據(jù)的拷貝。(1)設置picture 的屬性。vd->mmapformat=VIDEO_PALETTE_RGB24(2)初始化video _mbuf,以得到所映射的buffer 的信息。ioctl(vd->fd,VIDIOCGMBUF,(vd->mbuf)(3)可以修改video _mmap 和幀狀態(tài)的當前設置。(4)將mmap 與video_ mbuf 綁定。Void *mmap(void*addr,size_t len,int prot,int flags,int fd,off_to

41、ffset)len:映射到調(diào)用進程地址空間的字節(jié)數(shù),它從被映射文件開頭offset 個字節(jié)開始算起;Prot:指定共享內(nèi)存的訪問權限PROT _READ(可讀),PROT _WRITE (可寫),PROT_ EXEC(可執(zhí)行)Flags:MAP_SHARED MAP_PRIVATE 中必選一個,MAP_FIXED 不推薦使用。Addr:共內(nèi)存享的起始地址,一般設0,表示由系統(tǒng)分配。Mmap()返回值是系統(tǒng)實際分配的起始地址。int v41_mmap_init(v41_deviee *vd)if(v41_get_mbuf(vd)<0)return-1;if(vd->map=mmap(

42、0,vd->mbuf.size,PROT_READ|PROT_WRITE,MAP_SHARED, vd->fd, 0)<0)perror(”v4 l_mmap_init:mmap”);return-1;return 0;(5)Mmap 方式下真正做視頻截取的VIDIOCMCAPTURE。ioctl(vd->fd,VIDIOCMCAPTURE,&(vd->rnmap);若調(diào)用成功,開始一幀的截取,是非阻塞的,是否截取完畢留給VIDIOCSYNC來判(6)調(diào)用VIDIOCSYNC 等待一幀截取結(jié)束。if(ioctl(vd->fd,VIDIOCSYNC,&

43、amp;frame)<0)perror(”v4 l_mmap_init:mmap”);return-1;return 0;(5)Mmap 方式下真正做視頻截取的VIDIOCMCAPTURE。ioctl(vd->fd,VIDIOCMCAPTURE,&(vd->rnmap);若調(diào)用成功,開始一幀的截取,是非阻塞的,是否截取完畢留給VIDIOCSYNC來判(6)調(diào)用VIDIOCSYNC 等待一幀截取結(jié)束。if(ioctl(vd->fd,VIDIOCSYNC,&frame)<O)perror(”v41_sync:VIDIOCSYNC”);return-1;

44、若成功,表明一幀截取已完成??梢蚤_始做下一次VIDIOCMCAPTURE。frame 是當前截取的幀的序號。關于雙緩沖Video_ bmuf bmuf.frames=2:一幀被處理時可以采集另一幀。int frame;當前采集的是哪一幀。int framestat2;幀的狀態(tài)沒開始采集I 等待采集結(jié)束,幀的地址由vd->map+vd->mbuf.offsetsvd->frame得到。采集工作結(jié)束后調(diào)用munmap 取消綁定。munmap(vd->map,vd->mbuf.size)在實際應用時還可以采用緩沖隊列等方式。2.3.3本系統(tǒng)中使用的采集和顯示方案 不管是

45、ov511 還是zc301 的攝像頭,它們采集的方式都是相同的,只不過采集到的數(shù)據(jù)有所差異,ov511 的就是rgb 的位流,而zc301 是jpeg 編碼的位流。 LCD 實時顯示從ov511 攝像頭上采集的圖像 由于lcd 液晶屏顯示的是16bits 的RGB 圖片,所以,ov511 輸出的圖片格式也應該是16bits 的RGB 圖片數(shù)據(jù),宏VIDEO_ PALETTE_ RGB565 定義的就是16bits的RGB 數(shù)據(jù)圖片。而linux 自帶的ov511 驅(qū)動中圖像采集是32 位的,這樣采集到的圖片顯示在lcd 上是雪花點。因此需要修改驅(qū)動。在kemetdriverusb

46、目錄下有ov51l 芯片的驅(qū)動ov511.e,驅(qū)動里的ov51x _set_ default_ params 函數(shù)是設置芯片默認的輸出圖片的格式,該函數(shù)中的for(i=O;i<OV511_NUMFRAMES;i+)ov51 1->framei.width=ov5 1 1->maxwidth;ov51 1->framei.height=ov5 1 1->maxheight;ov51 1->framei.bytesread=0;if(force_palette)ov511->framei.format=force_palette;elseov51 1-&g

47、t;framei.format=VIDEO_PALETTE_RGB24;ov51l->framei.depth=ov51l_get_depth(ov511->framei.format) ;部分語句是主要設置ov511 默認輸出圖片格式的,其中maxwidth 和maxheight設置了圖片的最大的寬度和高度。If-else 語句設置了圖片的格式,作如下的修改:for(i=O;i<OV511_NUMFRAMES;i+)ov511->framei.width=ov511->maxwidth;ov511->framei.height=ov511->maxh

48、eight;ov51 1->framei.bytes_read=0;ov51 1->framei.format=VIDEO_PALETTE_RGB565;ov511->framei.depth=ov51l_getdepth(ov511->framei.format) 如果需要,也可以改變圖片的默認輸出大小。本系統(tǒng)在采集的軟件設計上采用了雙緩沖,視頻采集必須用到VIDIOCMCAPTURE和VIDIOCSYNC 這兩個ioctl 函數(shù)。VIDIOCGMBUF 包含有所用緩沖器的設置與地址。VIDIOCMCAPTURE 用于開始采集; VIDIOCSYNC 用于等待捕捉完成

49、。為加快數(shù)據(jù)處理速度,本裝置采用了雙緩沖,即buffer0 采集數(shù)據(jù)時,buffer1 的數(shù)據(jù)用于顯示;buffer1 采集數(shù)據(jù),buffer0 的數(shù)據(jù)用于顯示。雙緩沖的含義是每次采集兩幀分別為0,1 幀,分別放在兩個幀緩沖區(qū)如下偽代碼:VIDIOCMCAPTURE(0) /開始采集第一幀;while(1)VIDIOCMCAPTURE(1) /開始采集第N 次第二幀VIDIOCSYNC(0) /第N 次第一幀是否完成,沒完成等待/在采集第N 次第二幀的時候開始顯示第N 第一幀;VIDIOCMCAPTURE(0) /又開始采集第N+1 次第一幀VIDIOCSYNC(1) /等待第N 次采集的第二幀;/在第N+1 次

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論