《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 基于ARM和Linux的視頻圖像采集系統
基于ARM和Linux的視頻圖像采集系統
來源:微型機與應用2014年第3期
劉志華
(中南民族大學 電子信息工程學院,湖北 武漢 430074)
摘要: 提出了一種基于S3C2440 ARM處理器、USB攝像頭硬件平臺和嵌入式Linux操作系統的視頻采集系統方案。研究了USB攝像頭在Linux中的驅動開發,對系統總體結構、基于V4L2的視頻采集以及視頻動態顯示應用程序等功能模塊設計做了具體介紹。試驗結果表明,本系統實現了在LCD顯示器上動態顯示USB攝像頭采集的圖像,且視頻采集穩定,圖像幀過渡平穩,提供了一種成本低、體積小、功耗低的圖像采集方案,能夠很好地應用在視頻監控等系統中。
Abstract:
Key words :

摘  要: 提出了一種基于S3C2440 ARM處理器、USB攝像頭硬件平臺和嵌入式Linux操作系統的視頻采集系統方案。研究了USB攝像頭在Linux中的驅動開發,對系統總體結構、基于V4L2的視頻采集以及視頻動態顯示應用程序等功能模塊設計做了具體介紹。試驗結果表明,本系統實現了在LCD顯示器上動態顯示USB攝像頭采集的圖像,且視頻采集穩定,圖像幀過渡平穩,提供了一種成本低、體積小、功耗低的圖像采集方案,能夠很好地應用在視頻監控等系統中。
關鍵詞: 視頻采集;S3C2440;Linux;V4L2;Qtopia

 隨著嵌入式系統、網絡和圖像信息技術的滲透,以及對設備體積和無線的要求越來越多,以嵌入式體系為核心的圖像采集系統已成為研究熱點。其中,嵌入式系統具有功耗低、體積小和集成接口豐富等優點[1];嵌入式Linux系統具有源代碼開放、內核穩定、可裁減性、支持硬件廣泛及驅動豐富等特點,成為嵌入式系統領域不可或缺的操作系統之一;USB攝像頭具有性能好、價格低、使用方便、易于集成到嵌入式系統等特點,在視頻監控和網絡視頻會議等領域有廣泛應用[2]。
 本文以開發成本低、體積小、功耗低的嵌入式圖像采集系統為目標,采用ARM9處理器S3C2440和USB接口的攝像頭組成硬件體系,采用嵌入式Linux OS和Qtopia文件系統構建應用系統,通過編寫USB攝像頭驅動和Qt視頻顯示程序實現視頻采集和視頻顯示程序,很好地完成了圖像采集的功能。由于本系統成本低、擴展簡單、體積小,能夠很好地擴展到和視頻相關的很多領域[3]。
1 系統硬件設計
 系統硬件總體結構如圖1所示,嵌入式處理器采用三星公司的基于ARM920T內核的16/32位RISC嵌入式微處理器S3C2440,其主頻高達400 MHz,內置豐富的外設資源,包括存儲器、LCD控制器、串口、I2C、I2S和USB等接口控制電路,主要面向高性價比、低功耗的應用,適合于圖像和視頻處理。Flash存儲器采用64 MB NAND存儲器用于存放Linux操作系統啟動引導程序Bootloader、Linux系統內核、Qt文件系統及系統掉電后要保存的數據。SDRAM中用于存放Linux系統運行時的一些臨時數據。LCD顯示器大小為4.3英寸,480×272分辨率,并帶有觸摸屏[4]。

 目前用于攝像頭的控制芯片組主要有中芯微公司的ZC0301P和美國OV公司的OV511+芯片。國內市場上的USB攝像頭基本上采用的是ZC0301P,并且中芯微公司的主流控制芯片都帶有硬件JPEG編碼模塊,利用這個特性可以直接從攝像頭得到經過壓縮的圖片格式,可以簡化應用軟件的設計,因此本設計采用ZC0301P芯片的130萬像素的USB攝像頭。
 在硬件系統中,通過USB接口將攝像頭與S3C2440相接。利用USB接口進行通信只需要在Linux內核中增加USB驅動支持和加載ZC0301P硬件驅動模塊。這樣的驅動設計充分地利用了Linux模塊化的設計特點,同時也有利于軟件的設計和調試。
2 嵌入式Linux系統設計
2.1 宿主機開發環境的建立

 通常嵌入式系統的軟件編譯和運行是在兩個不同平臺上進行的,編譯是在宿主機上,通常是PC;運行是在目標板上,即S3C2440平臺。一般是在宿主機上通過跨平臺交叉編譯器把源文件編譯成可在目標平臺上執行的文件,再通過串口等方式下載到目標平臺上的NAND或NOR存儲器上,然后由目標機來運行此軟件。本系統采用的交叉編譯器為arm-linux-gcc-4.3.3。
 在宿主機上首先要安裝Linux操作系統,本文使用的是Fedora10。此外,在系統中建立了交叉編譯環境。這樣,嵌入式Linux的開發環境就搭建完成了[5]。
2.2 搭建嵌入式Linux系統平臺
 在目標平臺上構建一個完整的嵌入式Linux系統一般需要Bootloader引導程序、Linux內核以及根文件系統3個內容。
2.2.1 Bootloader引導程序
 Bootloader引導程序是嵌入式開發很重要的組成部分。Boofloader引導程序最基本的功能是對硬件系統的初始化和內核啟動參數設置并啟動內核。在嵌入式系統開發過程中,Bootloader還與主機通信,不斷檢測從主機傳來的控制信息和數據信息,完成相應的操作。本系統中使用的是U-Boot引導程序。下載U-Boot源碼后,在宿主機交叉編譯器中編譯出啟動代碼的可執行文件,下載到開發板中即可。
2.2.2 Linux操作系統的移植
 下載linux-2.6.30內核,并解壓Linux內核到linux-2.6.30目錄。然后修改此目錄下的Makefile文件,需改的主要內容是目標代碼的類型和為編譯內核指定一個編譯器。注釋掉以下內容:
#ARCH?=$(SUBARCH)
#CROSS-COMPILE?=
增加如下內容:
ARCH=arm
CROSS-COMPILE=arm-inux-
 做完以上修改以后,內核編譯以后就可在硬件板上運行了。
2.2.3 建立根文件系統
 根文件系統一直以來是所有UNIX類操作系統的一個核心組成部分,在內核啟動的最后階段,所執行的操作之一就是掛載根文件系統。Linux的根文件系統包含內核所需的文件和可執行文件,還有用于系統管理的可執行文件。在網上下載YAFFS文件系統代碼,并修改配置文件使之適用于本目標平臺。配置Linux內核,使內核支持MTD(Memory Technology Devices)和YAFFS。重新編譯內核并將內核下載到開發板的Flash中,然后把編譯好的文件系統下載到開發板中。啟動內核,就可以看到在LCD中顯示Qt界面,這樣一個完整的Linux系統平臺就建立好了。
3 視頻采集的實現
3.1 攝像頭驅動及V4L2簡介

 在Linux下,設備驅動程序可以看成Linux內核與外部設備之間的接口。設備驅動程序向應用程序屏蔽硬件實現的細節,使得應用程序可以像操作普通文件一樣來操作外部設備,可以使用和操作文件中相同的、標準的系統調用接口函數來完成對硬件設備的打開、關閉、讀寫和I/O控制操作,而驅動程序的主要任務也就是要實現這些系統調用函數。
 對于USB口攝像頭,其驅動程序中提供了基本的I/O操作接口函數open、read、write、close的實現以及對I/O通道的控制接口函數ioctl的實現等,并定義在struct file_operations中。
 Video4Linux2(V4L2)是Linux中關于視頻設備的內核驅動,它為針對視頻設備的應用程序編程提供一系列接口函數,這些視頻設備包括現今市場上流行的TV卡、視頻捕捉卡和USB攝像頭等。Linux內核提供Video4Linux2應用程序接口,在程序開發時首先是基于Video4Linux2 API函數來設計程序[6]。
3.2 Video4Linux2下的攝像頭采集編程
 在USB攝像頭被驅動后,只需要再編寫一個對視頻采集的應用程序就可以了,根據嵌入式系統開發特征,先在宿主機上編寫應用程序,再使用交叉編譯器進行編譯鏈接,生成在目標平臺的可執行文件。宿主機與目標板通常采用打印終端的方式進行交叉調試,成功后移植到目標平臺。本文編寫的視頻采集程序是在安裝Linux操作系統的宿主機PC上進行的,下面是具體論述[7]。
 程序中定義的重要數據結構為:
 struct v4l2_capability cap;
 struct v4l2_fmtdesc fmtdesc;
 struct v4l2_format fmt;
 struct v4l2_requestbuffers req;
 struct v4l2_buffer buf;
 這些數據結構都是Video4Linux2支持的,它們的用途如下。
 (1)v4l2_capability包含攝像頭的基本信息,例如設備名稱、支持的最大及最小分辨率、信號源信息等,分別對應著結構體中成員變量name、maxwidth、maxheight、minwidth、minheight、channels、type等;
 (2)struct v4l2_fmtdesc獲取設備支持的視頻格式;
 (3)v4l2_format fmt設置視頻捕獲格式;
 (4)v4l2_requestbuffers用于請求分配內存;
 (5)v4l2_buffer代表驅動中的一幀。
 Linux下視頻圖像采集流程如圖2所示。

 (1)打開視頻設備,獲得文件描述符
 攝像頭在系統中對應的設備文件為/dev/video0,采用系統調用函數video_fd=open(“/dev/video0”, O_RDWR,0),video_fd為設備打開后返回的文件描述符,以后的系統調用函數就可以使用它來對設備文件進行操作了。接著用ioctl(video_fd,VIDIOC_QUERYCAP,&cap)函數讀取v4l2_capability中的有關攝像頭的信息。該函數成功返回后,這些信息從內核空間拷貝到用戶程序空間capability各成員分量中,使用printf函數就可以得到各成員分量信息。
 (2)設置圖片格式
 將圖片寬設為320,高設為240,其他參數保持默認。
 struct v4l2_format fmt;
 CLEAR(fmt);
 fmt.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
 fmt.fmt.pix.width=320;
 fmt.fmt.pix.height=240;
 fmt.fmt.pix.field=V4L2_FIELD_INTERLACED;
 fmt.fmt.pix.pixelformat=VIDEO_FORMAT;
 if(ioctl(video_fd,VIDIOC_S_FMT,&fmt)<0)
   {
     exit(1);
   }
 (3)分配緩沖區
 struct v4l2_requestbuffers req;
 CLEAR(req);
 req.count=4;
 req.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
 req.memory=V4L2_MEMORY_MMAP;
 if(ioctl(video_fd,VIDIOC_REQBUFS,&req)<0)
   {
      exit(1);
   }
 然后通過調用ioctl(video_fd,VIDIOC_QUERYBUF,&buf)獲得緩沖區的長度(buf.length)和偏移地址(fd,buf.m.offset),將這兩個參量作為參數傳給mmap函數:
buffers[num].start=mmap(NULL,buf.length,PROT_READ|PROT_WRITE,MAP_SHARED,fd,buf.m.offset);
緩沖區分配好之后,驅動并不會向里面寫入數據,還需要將每個緩沖區放入視頻采集隊列:
ioctl(video_fd,VIDIOC_QBUF,&buf);
 (4)啟動采集過程,讀取數據
 完成以上初始化設置工作后,就可以對視頻進行采集了,有直接讀取read()和內存映射mmap()兩種方法。read()通過內核緩沖區來讀取數據;而mmap()通過把設備文件映射到內存中,繞過了內核緩沖區,最快的磁盤訪問往往還是慢于最慢的內存訪問,因此mmap()方式加速了I/O訪問。另外,mmap()系統調用使得進程之間通過映射同一文件實現共享內存,各進程可以像訪問普通內存一樣對文件進行訪問,訪問時只需要使用指針而不用調用文件操作函數。因為mmap()的以上優點,所以在程序實現中采用內存映射方式。
 應用程序調用VIDIOC_STREAMON來啟動采集過程:
 enum v4l2_buf_type type=
 V4L2_BUF_TYPE_VIDEO_CAPTURE;
 ioctl(fd,VIDIOC_STREAMON,&type);
 采集過程開始以后,驅動會不停地將數據寫入分配的緩沖區內,當一個緩沖區的數據準備就緒后,驅動就會將其放入輸出隊列,等待應用程序的處理。當所有的緩沖區都進入輸出隊列后,驅動將停止采集,并等待緩沖區重新放入采集隊列。讀取數據時,首先需要將一個緩沖區出隊列:
 struct v4l2_buffer buf;
 ioctl(fd,VIDIOC_DQBUF,&buf);
 驅動會從輸出隊列取出一個緩沖區,并將其序號賦值給buf.index,應用程序可以通過buffers[buf.index].start來訪問緩沖區的數據。當處理完成后,需要將其重新放入采集隊列:
ioctl(fd,VIDIOC_QBUF,&buf);
 (5)停止采集
 首先停止采集過程ioctl(fd,VIDIOC_STREAMOFF,&type),然后使用munmap函數刪除映射,最后調用close(fd)函數關閉設備。
 視頻圖像顯示模塊使用GUI軟件提供的API函數的方法進行視頻圖像顯示。視頻顯示程序基于Qt庫來編寫,原理是將buf的內容轉為image再轉為pixmap,然后顯示出來。按照以上編寫流程編寫視頻顯示程序后,通過交叉編譯器編譯出目標平臺能夠執行的代碼,下載到開發板中,即可實現視頻的實時采集。
4 測試結果與分析
 在目標平臺上運行編寫的視頻采集程序,攝像頭所采集到的實時動態圖像的截圖如圖3所示。從圖中可以看出,該系統所提供的視頻畫面圖像質量較好,完全可以滿足實際應用中對畫面質量的要求。

 

 

 采用內嵌ARM9核的S3C2440嵌入式微控制器和ZC0301P視頻處理芯片,同時結合Linux的Video4Linux視頻接口技術和視頻流傳輸技術,實現了快速視頻采集的應用[8]。實踐表明,采用高性能的ARM9核的微控制器和嵌入式Linux操作系統,使視頻采集系統的視頻畫面清晰流暢,其性能優越、穩定而且構建成本低。該方案可以廣泛應用于視頻通信和現場監測等智能控制領域,具有廣闊的應用前景。
參考文獻
[1] SAMSUNG ELECTRONICS. S3C2440 user′s manual(Revision 1.2)[Z], 2003.
[2] 杜春雷.ARM體系結構與編程[M].北京:清華大學出版社,2003.
[3] 孫天澤,袁文菊,張海峰.嵌入式設計及Linux驅動開發指南[M].北京:電子工業出版社,2005.
[4] RUBINI A. L INUX設備驅動程序[M].魏永明,譯.北京:中國電力出版社,2002.
[5] 劉崢嶸,張智超,許振山.嵌入式Linux應用開發詳解[M].北京:機械工業出版社,2004.
[6] COX A. Video 4 Linux Programming[EB/OL]. www.redhat. com.
[7] 王艷,吳旭光,趙勛峰.基于ARM的嵌入式手持掃描設備的系統設計[J].電子測量技術,2007(3):47-49.
[8] 賈明,嚴世賢.Linux下的C編程[M].北京:人民郵電出版社,2001.

此內容為AET網站原創,未經授權禁止轉載。
主站蜘蛛池模板: 亚洲高清视频在线观看 | 亚洲精品区 | 一级毛片在播放免费 | 在线一区免费视频播放 | 久久一级毛片 | 成人在线视频一区 | 国产精选莉莉私人影院 | 欧美一级手机免费观看片 | 久久精品一区二区影院 | 在线成人免费观看国产精品 | 欧美偷拍小视频 | 在线播放高清国语自产拍免费 | 国产精品三级在线播放 | 九草在线免费观看 | 亚洲免费视频网 | 日本在线不卡免 | 性欧美videos精品 | 久久久久国产精品免费免费 | 99久久免费看精品国产一区 | 美女视频大全网站免费 | 久草在线看片 | 亚洲国产欧美自拍 | 成人女人a毛片在线看 | 免费一级肉体全黄毛片 | 国产亚洲精品片a77777 | 黄色三级视频网站 | 欧美高清一区二区三区欧美 | 在线精品亚洲欧洲第一页 | 特级a欧美做爰片毛片 | 91香蕉视 | 午夜影院在线免费 | 久草日韩 | 欧美私人网站 | 一级毛片免费观看不卡视频 | 欧美一级在线观看播放 | 国产美女视频做爰 | 美女双腿打开让男人桶爽网站 | 亚洲人成网站在线在线 | 99久久精品国产一区二区三区 | 国产手机在线小视频免费观看 | 国产a一级毛片含羞草传媒 国产a自拍 |