999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于ARM的嵌入式視頻采集系統的設計與實現

2016-04-12 00:00:00衛建華鄧云兵高燚楊晉芳宋佳明
現代電子技術 2016年3期

摘 要: 針對USB攝像頭的廣泛應用,提出一種以S3C6410微處理器為核心的嵌入式視頻圖像采集系統設計方案,可將攝像頭采集的視頻圖像在LCD屏幕上實時顯示。該系統利用了嵌入式Linux內核下UVC驅動模型,通過LCD驅動移植,并采用Libjpeg庫對采集的數據進行轉換,最終在此基礎上完成了對軟件系統框架的設計。實驗結果表明,該系統可以實現視頻圖像的數據采集并可在LCD顯示屏上實時顯示,可以方便地應用到各種嵌入式USB攝像頭設備中,且實時性良好。

關鍵詞: S3C6410; 攝像頭; 嵌入式Linux; LCD驅動

中圖分類號: TN919?34; TP316 文獻標識碼: A 文章編號: 1004?373X(2016)03?0030?05

Design and implementation of embedded video acquisition system based on ARM

WEI Jianhua1, DENG Yunbing1, GAO Yi1, YANG Jinfang1, SONG Jiaming2

(1. College of Electronics and Information, Xi’an Polytechnic University, Xi’an 710048, China;

2. Maintenance Company, Ningxia Electronic Power Company of State Grid , Yinchuan 750001, China)

Abstract: For the widespread use of USB camera, a design scheme for the embedded video image acquisition system taking the microprocessor S3C6410 as the core is proposed, which can display the collected video image from camera on LCD screen in real?time. The UVC driven model under the embedded Linux kernel is utilized by the system, and the collected data is converted by LCD driving transplantation and Libjpeg library. Based on this, the design of the USB camera software system framework was completed. The experimental results show that the system can realize the data acquisition of the video image and real?time display on LCD screen. This system can be easily applied to various embedded USB camera devices, and has good real?time performance.

Keywords: S3C6410; camera; embedded Linux; LCD driving

0 引 言

嵌入式Linux相對于大多數商業化嵌入式操作系統具有無可比擬的優越性,由于其具有開源、多任務多進程、高度模塊化、支持多平臺、性能穩定等諸多優點[1?2], 現已廣泛應用于嵌入式領域。隨著計算機通信技術的不斷發展和視頻監控系統應用場所的日益多樣化[3],對視頻監控的不同技術要求和相應的解決方案也日益增多[4],不同的應用場所需要不同的系統設計及硬件支持。

USB攝像頭具有性能好、價格低、使用方便、易于集成到嵌入式系統等特點,在視頻監控、網絡視頻會議等領域具有廣泛的應用[5?6]。目前攝像頭驅動程序大部分都是基于Windows平臺下,而嵌入式系統大都采用Linux系統,因此需要開發在嵌入式Linux平臺下[7?9]的基于驅動框架下的數據采集系統。現存的嵌入式USB攝像頭大部分都是基于ARM9體系架構。因此,本文設計了一種在ARM11平臺下,基于USB攝像頭的嵌入式圖像采集系統。

1 系統的硬件組成

硬件開發平臺是整個系統的基礎,有著至關重要的作用,硬件選擇的成功與否直接決定著系統性能的優劣。本系統使用了國內比較流行的主流ARM芯片S3C6410,該芯片是基于三星公司ARM11內核的處理器。S3C6410具有諸多優點[10],包括體積小、低功耗、低成本、高性能;支持Thumb(16位)/ARM(32位)雙指令集,能很好的兼容8位/16位器件;大量使用寄存器,指令執行速度更快;大多數數據操作都在寄存器中完成;尋址方式靈活簡單,執行效率高; 指令長度固定。

S3C6410擁有強大的內部資源和視頻處理能力,可穩定運行在667 MHz主頻以上,支持Mobile DDR和多種NAND FLASH。本系統所使用的OK6410開發板上集成了多種高端接口,如復合視頻信號、攝像頭、USB、SD卡、WiFi、LCD液晶屏、以太網,并配備溫度傳感器和紅外接收頭等。本系統所需要的主要硬件組成,如圖1所示。

2 系統硬件平臺的搭建

2.1 UVC驅動模型

UVC(Usb Video Class)是Microsoft與另外幾家設備廠商聯合推出的為USB視頻捕獲設備定義的協議標準,目前已成為USB協議標準之一。 在如今的主流操作系統中都已提供了UVC設備驅動,如Windows XP,Window 7,Linux 2.4.6 and later等操作系統。Video Class(VC)把整個系統抽象成“單元(Uint)”和“終端(Terminal)”兩個概念。VC里含有多個Unit/Terminal等功能模塊,可以通過訪問這些模塊進行攝像頭控制,比如調節攝像頭亮度,讀視頻數據等。UVC設備驅動將視頻設備抽象為幾個主要的硬件功能模塊,如圖2所示。其中CT(Camera Terminal)為camera端點,IT(Input Terminal)為輸入端點,SU(Selector Unit)為選擇單元,PU(Processing Unit)為處理單元,OT(Output Terminal)為輸出端點。VC就是USB接口視頻設備的一個統一的數據交換規范,有了USB在視頻接口數據的統一交換規范后,任何支持UVC規范的USB攝像設備都可以在不裝設備驅動的基礎上正常使用,去除了人工手動安裝硬件驅動的步驟,且硬件在各個程序之間彼此運行會更加流暢。

本系統所使用的操作系統是Linux?3.0.1內核,內核中幾乎所有的設備驅動都在driver目錄中,其中UVC攝像頭驅動都在drivers/media/video/uvc/的目錄下。UVC驅動的核心是該目錄下uvc_v4l2(video for linux two)文件中uvc_fops的操作函數集:

const struct v4l2_file_operations uvc_fops = {

.owner = THIS_MODULE,

.open = uvc_v4l2_open,

.release = uvc_v4l2_release,

.ioctl = uvc_v4l2_ioctl,

.read = uvc_v4l2_read,

.mmap = uvc_v4l2_mmap,

.poll = uvc_v4l2_poll,

};

當應用程序打開攝像頭設備時就會調用uvc_fops函數集里的uvc_v4l2_open函數,應用程序執行ioctl時就會調用uvc_fops函數集里的uvc_v4l2_ioctl函數,該函數經過一系列初始化后會調用執行return video_usercopy(file,cmd,arg,uvc_v4l2_do_ioctl);最終調用uvc_v4l2_do_ioctl函數集里的函數查詢設備的描述符,獲得攝像頭支持的格式,分配設備的緩存、入隊列、出隊列等。

系統選用的Linux?3.0.1版本內核已經包含了UVC驅動,采集系統選用攝像頭的型號是宇宙通QC288攝像頭,符合UVC標準。因此,只要在編譯內核時將UVC驅動編譯到內核中,進入到內核的根目錄執行make menuconfig,選中UVC的驅動即可。配置如圖3所示。

將編譯好的內核通過NFS網絡系統下載到開發板中啟動內核,該嵌入式Linux內核就能支持符合UVC規范USB攝像頭的視頻采集。當攝像頭連到OK6410上,Linux會在/dev目錄下建立設備文件videox,說明嵌入式Linux的UVC驅動已經可以正常的工作了。

2.2 LCD驅動的移植

OK6410的標準配置LCD型號是WXCAT43,配有4.3英寸電阻觸摸屏,分辨率為480×272。WXCAT43型號屬于TFT,即薄膜晶體管。LCD驅動移植所依賴的文件有:

arch/arm/mach?s3c64xx/mach?smdk6410.c,

drivers/video/samsung/s3cfb.c,

drivers/video/samsung/s3cfb_spi.c,

drivers/video/samsung/WXCAT43.c,

arch/arm/mach?s3c64xx/include/mach/regs?lcd.h。

2.2.1 修改arch/arm/mach?s3c64xx/mach?smdk64?10.c文件

注釋掉smdk6410_machine_init(void)中的下面兩行:

//gpio_request(S3C64XX_GPN(5), \"LCD power\");

//gpio_request(S3C64XX_GPF(13), \"LCD power\");

在sruct map_desc smdk6410_iodesc[]中添加 LCD支持:

static struct map_desc smdk6410_iodesc[] = {

{ /* LCD support */

.virtual = (unsigned long)S3C_VA_LCD,

.pfn = __phys_to_pfn(S3C_PA_FB),

.length = SZ_16K,

.type = MT_DEVICE,

},

};

2.2.2 添加 drivers/video/samsung目錄

從www.linux.org下載的內核中沒有WXCAT43型號的LCD驅動,所以需要添加samsung目錄,添加對應型號的驅動程序,主要有Makefile,Kconfig,s3cfb.c,s3cfb_spi.c,WXCAT43.c文件。

2.2.3 修改drivers/video目錄下的Makefile和Kconfig文件

在Makefile 的最后一行添加:

obj?$(CONFIG_FB_S3C_EXT)+= samsung/

在drivers/video/Kconfig的目錄下添加:

source “drivers/video/samsung/Kconfig”

這樣做的主要目的是為了將LCD驅動加載進make menuconfig的配置菜單中,以便內核編譯時,將LCD驅動編譯進內核。

修改完成后進入到內核的根目錄下執行make menuconfig,按照下面內核配置選項依次選中:

Device Drivers ?> Graphics support ?>

<*> Support for frame buffer devices ?>

<*> S3C Frambuffer Support (eXended)

Select LCD Type ( 4.3 inch 480*272 TFT LCD) ?>

<*> Advanced options for S3C Frambuffer

Select Bpp(Bits Per Pixel ) ( 16 BPP ) ?>

(4) Number of Framebufers

[ * ] Enable Virtural Screen

[ * ] Enable Double Buffering

保存配置退出,執行make uImage。如果上述修改及內核配置全部正確,生成的內核鏡像文件就可以支持LCD屏幕的正常工作。

3 系統的軟件設計

3.1 系統框架設計的整體說明

整個系統框架借鑒于Linux內核設計分層的思想[11],把功能相對穩定的代碼放到一個文件里,以C++面對對象的設計思想模塊化編寫整個程序,把具有相關聯性的數據和對數據的操作函數放在一起,作為一個相互依存、不可分割的整體來處理。先考慮整體、共性的因素,再考慮個性、個別的因素,有利于問題的簡單化。編程時先單獨實現每個功能模塊的文件,將功能相近的模塊放在一個文件夾下,把對外封閉的接口函數定義為靜態函數,只留下有限的函數接口供外部調用。文件通過向上層接口“注冊”自己,告訴整個系統自己是“存在”的。當需求改變時,維護也只需在局部模塊修改,所以維護起來非常方便,成本也相對較低。這樣不僅提高了代碼的重復利用率,也提高了各自功能模塊文件內部數據的安全性[12]。

本系統框架主要實現了攝像頭數據采集、攝像頭數據轉換、LCD顯示以及圖片的渲染四大功能模塊,每個功能模塊根據各自的共性都抽象出一個結構體來封裝自己的數據和操作函數。攝像頭數據采集模塊主要負責采集現實中的圖像數據,攝像頭數據轉換功能模塊主要負責將采集到的數據轉換為LCD可以顯示的RGB數據,LCD顯示模塊主要負責攝像頭采集的數據實時顯示,圖片的渲染模塊主要是對采集到的數據進行放大縮小等處理。具體的系統軟件框架模塊設計如圖4所示。

程序執行時,其入口是Main函數,首先進行四大功能模塊的“注冊”及初始化所需用到的模塊,一切就緒后調用v4l2里的攝像頭的啟動函數開始采集數據,最后進入到死循環中執行:讀入攝像頭數據,將攝像頭數據轉換為LCD可以顯示的RGB數據,如果圖像分辨率大于LCD分辨率,進行數據的縮放,最后合并進LCD的framebuffer進行圖像的顯示。整個執行過程如圖5所示。

3.2 視頻數據的處理

以面向對象的思想設計整個系統框架,這里將所有關于攝像頭的操作放到v4l2.c文件里,把所有對攝像頭的操作函數抽象并封裝在一個結構體中,里面包含了攝像頭的初始化,啟動/關閉攝像頭,獲得/釋放攝像頭采集的數據等。其構造的結構體定義如下:

static T_VideoOpr g_tV4l2VideoOpr = {

.name = \"v4l2\",

.InitDevice = V4l2InitDevice,

.ExitDevice = V4l2ExitDevice,

.GetFrame = V4l2GetFrame,

.PutFrame = V4l2PutFrame,

.StartDevice = V4l2StartDevice,

.StopDevice = V4l2StopDevice,

};

其中:V4l2InitDevice負責攝像頭的初始化;V4l2ExitDevice負責攝像頭退出時釋放緩存;V4l2StartDevice負責啟動攝像頭;V4l2StopDevice關閉攝像頭;V4l2GetFrame負責獲取攝像頭數據;V4l2PutFrame負責將讀取完的數據緩存放入隊列。存儲攝像頭讀取的數據也抽象為一個ptVideoBuf結構體,里面包含了數據格式,一幀數據的寬度,一幀數據的高度等。當程序調用V4l2StartDevice,攝像頭就開始工作,之后進入死循環中不斷地采集數據,實時在LCD屏幕上顯示。系統調用V4l2GetFrame函數采集獲取攝像頭數據,把數據從等待隊列中取出,放入之前設置好的ptVideoBuf數據結構中。當這一幀數據在LCD顯示完時,程序調用V4l2PutFrame函數將之前的數據結構重新放入等待隊列,供攝像頭下次采集存放新的數據。

3.3 視頻數據的轉換

LCD只能顯示RGB格式的數據,而攝像頭采集的數據不是RGB格式,所以采集的數據不能直接送到LCD的Framebuffer進行圖像顯示,需要進行數據格式的轉換。通常攝像頭采集有V4L2_PIX_FMT_YUYV,V4L2_PIX_FMT_MJPEG,V4L2_PIX_FMT_RGB565等格式的數據。需要把它轉換為RGB格式的數據才能在屏幕上正常顯示。為了方便管理多種格式的數據轉換,把轉換的操作抽象為一個VideoConvert結構體,里面包含了數據轉換的所有操作。其構造的結構體定義如下:

struct VideoConvert {

char *name;

int (*isSupport)();

int (*Convert)();

int (*ConvertExit)();

struct VideoConvert *ptNext; //方便系統注冊管理

};

本系統使用宇宙通QC288攝像頭采集的數據是V4L2_PIX_FMT_MJPEG格式,因而需要用到底層mjpeg2rgb.c文件中的Mjpeg2RgbConvert進行數據轉換。

3.4 LCD圖像的實時顯示

驅動作為內核與硬件之間的橋梁,負責對外設的訪問。前面在Linux內核中移植了自己的LCD驅動,硬件上已經可以實現畫面的顯示功能,軟件上需要做的就是把轉換好的數據放到LCD的Framebuffer(緩存)里就可以實現圖像的實時顯示。內核中采用了分層次的設計方法,把上層應用程序的接口與底層對硬件的操作分離,在上層接口fbmem.c文件中只提供了FrameBuffer(即幀緩沖技術)設備驅動的通用文件操作接口,這樣編寫應用程序時就不用過多關心底層硬件操作的細節[13]。應用程序操作LCD時,只需要打開設備,用ioctl操作獲取屏幕參數,映射FrameBuffer到用戶空間,最后直接讀寫映射到用戶空間的緩沖區就可以實現圖片或畫面的顯示。本文對LCD顯示的底層操作在fb.c文件中,Main函數最終會調用到fb.c中的顯示操作,其實現過程就是把攝像頭轉換好的RGB數據放入到用戶空間映射好的緩存里。Main函數里圖像實時顯示的主要核心代碼如下:

/* 讀入攝像頭數據 */

ptOPr?>GetFrame(tVideoDevice, tVideoBuf);

/* 轉換為RGB 數據*/

ptVideoConvert?>Convert(tVideoBuf,tConvertBuf);

/* 圖像實時顯示 */

FlushPixelDatasToDev(tFrameBuf.tPixelDatas);

/* 釋放緩存 */

ptOPr?>PutFrame(tVideoDevice,tVideoBuf);

當打開攝像頭運行應用程序時,攝像頭所采集的數據可以在LCD上實時顯示,沒有出現延時或圖像模糊等問題,實時顯示效果良好。實際的顯示效果如圖6所示。

4 結 語

本文在分析UVC驅動模型框架的基礎上敘述了嵌入式Linux中的UVC驅動以及在Linux?3.0.1內核的基礎上移植LCD驅動,并設計了系統的軟件框架。實際測試表明,該系統框架設計在硬件的平臺上運行良好,可以滿足任何符合UVC規范攝像頭數據的采集顯示。對編寫嵌入式Linux系統下的USB攝像頭驅動及應用程序具有一定的參考價值。

參考文獻

[1] 王劍非,孟彥杰,趙勇.基于Linux操作系統的視頻采集卡驅動程序設計[J].微計算機信息,2007(2):94?96.

[2] 姚婭川.嵌入式圖像實時采集系統設計[J].半導體技術,2010,35(7):719?722.

[3] 趙冰,霍春寶,李巖松.基于嵌入式Linux的3G無線視頻監控系統[J].單片機與嵌入式系統應用,2013,13(3):56?58.

[4] 許剛.基于ARM 11的嵌人式視頻采集系統設計[J].測控技術,2013,32(12):37?40.

[5] 王曉華,賈繼洋.基于ARM的遠程實時視頻監控系統的研制[J].西安工程大學學報,2014,28(5):579?582.

[6] 王溢琴,秦振吉,蘆彩林.基于Arm?Linux的隧道視頻監控系統設計[J].計算機測量與控制,2014,22(4):1090?1095.

[7] 暢衛功.嵌入式Linux中USB攝像頭驅動的研究[J].微計算機信息,2008(24):54?56.

[8] 劉衡,趙元龍,褚燕偉.Linux下USB攝像頭驅動的實現[J].軟件導刊,2012(9):18?20.

[9] 宋麗華,高珂.嵌入式Linux下USB攝像頭驅動實現[J].計算機工程,2010,36(9):282?284.

[10] Samsung. S3C6410x datasheet [EB/OL]. [2009?08?25]. http://www.datasheetarchive.com/samsung%20S3C6410?datasheet.html.

[11] LIU Yonglin, CHENG Yaoyu, LIANG Ying, et al. Design and implementation of image acquisition system based on ARM and Linux [C]// Proceedings of 2011 IEEE International Conference Electronics and Optoelectronics. [S.l.]: IEEE, 2011: 49?52.

[12] 王溢琴,秦振吉,蘆彩林.基于嵌入式的智能家居之視頻監控系統設計[J].計算機測量與控制,2014,22(11):3623?3626.

[13] HWANG J N, LIU Q. On realtime remote display of a digital video recording system [C]// Proceedings of 2004 IEEE International Conference on Acoustics. [S.l.]: IEEE, 2004: 861?864.

主站蜘蛛池模板: 亚洲精品免费网站| 国产福利在线免费| 国产特一级毛片| 亚洲最猛黑人xxxx黑人猛交 | 亚洲人成网7777777国产| 国产成人成人一区二区| 国产亚洲欧美日韩在线观看一区二区| 久久夜色精品| 一级毛片免费观看不卡视频| 欧美a在线视频| 国内精自视频品线一二区| 色135综合网| 欧美成人午夜视频免看| 中文字幕在线欧美| 国产三级精品三级在线观看| 精品91视频| 97se亚洲综合在线天天| 久久亚洲日本不卡一区二区| 制服丝袜一区| 欧美精品1区2区| 亚洲免费毛片| 91在线视频福利| 91黄视频在线观看| 精品国产电影久久九九| 亚洲无码高清免费视频亚洲| 老色鬼欧美精品| 国产日韩丝袜一二三区| 亚洲中久无码永久在线观看软件| 国产精品一区二区国产主播| 蝌蚪国产精品视频第一页| 自慰高潮喷白浆在线观看| 在线看国产精品| 国产日韩欧美视频| 中文无码毛片又爽又刺激| 国产正在播放| 麻豆精品国产自产在线| 在线视频亚洲色图| 日本精品视频一区二区| 综合成人国产| 99精品在线看| 成人福利在线看| av在线无码浏览| 亚洲天堂精品在线| 日本不卡在线视频| 日韩一二三区视频精品| 特级精品毛片免费观看| 另类重口100页在线播放| 狼友视频一区二区三区| 亚洲αv毛片| 69国产精品视频免费| 亚洲国产成人麻豆精品| 亚洲av色吊丝无码| 在线欧美日韩国产| 国产一区二区三区夜色 | 久久国产乱子伦视频无卡顿| 欧美国产综合色视频| 亚洲色图综合在线| 亚洲欧洲日产国码无码av喷潮| 中文字幕久久亚洲一区| 亚洲成人动漫在线| 国产91精品调教在线播放| 欧美日韩精品一区二区视频| 国产乱人伦精品一区二区| 国产91麻豆免费观看| 欧洲极品无码一区二区三区| www.亚洲一区| 亚洲天堂区| 婷婷六月综合网| 一级片免费网站| 在线免费亚洲无码视频| 91在线免费公开视频| 色偷偷一区| 国产色网站| 毛片大全免费观看| 国产精品密蕾丝视频| 国产真实二区一区在线亚洲| 国产视频a| 欧美激情视频二区三区| 在线观看国产精美视频| 国产91精品久久| 视频二区国产精品职场同事| 国产免费一级精品视频 |