<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于嵌入式Linux與S3C2410平臺的視頻采集

基于嵌入式Linux與S3C2410平臺的視頻采集

作者: 時(shí)間:2005-04-12 來(lái)源:網(wǎng)絡(luò ) 收藏

摘要:首先簡(jiǎn)介系統的和在上進(jìn)行開(kāi)發(fā)所需的軟件環(huán)境,接著(zhù)詳細論述在該上如何實(shí)現這一應用,并對程序的實(shí)現進(jìn)行具體的介紹,最后完成應用程序向目標平臺的移植。

關(guān)鍵詞: Video4 內存映射

隨著(zhù)多媒體技術(shù)、網(wǎng)絡(luò )技術(shù)的迅猛發(fā)展和后PC機時(shí)代的到來(lái),利用系統實(shí)現遠程監控、可視電話(huà)和視頻會(huì )議等應用已成為可能。為了實(shí)現這些應用,實(shí)時(shí)獲得視頻數據是一個(gè)重要環(huán)節。針對這一點(diǎn),本文在嵌入式Linux系統平臺上,利用Video4Linux內核應用編程接口函數,實(shí)現了單幀圖像和視頻連續幀的,并保存成文件的形式供進(jìn)一步視頻處理和網(wǎng)絡(luò )傳輸用。

1 系統平臺上的硬件系統

本文使用的系統平臺硬件功能框圖如圖1所示。該平臺采用Samsung公司的處理器。該處理器內部集成了ARM公司ARM920T處理器核的32位微控制器,資源豐富,帶獨立的16KB的指令Cache和16KB數據Cache、LCD控制器、RAM控制器、NAND閃存控制器、3路UART、4路DMA、4路帶PWM的Timer、并行I/O口、8路10位ADC、Touch Screen接口、I2C接口、I2S接口、2個(gè)USB接口控制器、2路SPI,主頻最高可達203MHz。在處理器豐富資源的基礎上,還進(jìn)行了相關(guān)的配置和擴展,平臺配置了16MB 16位的Flash和64MB 32位的SDRAM。通過(guò)以太網(wǎng)控制器芯片DM9000E擴展了一個(gè)網(wǎng)口,另外引出了一個(gè)HOST USB接口。通過(guò)在USB接口上外接一個(gè)帶USB口的攝像頭,將采集到的視頻圖像數據放入輸入緩沖區中。然后,或者保存成文件的形式,或者運行移植到平臺上的圖像處理程序,對緩沖的圖像數據直接進(jìn)行相關(guān)處理,再保存并打成UDP包。最后,通過(guò)網(wǎng)絡(luò )接口將圖像發(fā)送到Internet上。本文只討論其中視頻采集部分的具體實(shí)現。

2 系統平臺中的軟件系統

2.1 Linux與嵌入式系統

Linux具有內核小,效率高,源代碼開(kāi)放,內核直接提供網(wǎng)絡(luò )支持等優(yōu)點(diǎn)。但嵌入式系統的硬件資源畢竟有限,因此不能直接把Linux作為操作系統,需要針對具體的應用通過(guò)配置內核、裁減shell和嵌入式C庫對系統定制,使整個(gè)系統能夠存放到容量較小的Flash中。Linux的動(dòng)態(tài)模塊加載,使Linux的裁減極為方便 ,高度模塊化的部件使添加非常容易。正因為L(cháng)inux的上述優(yōu)點(diǎn),在本文實(shí)現的平臺上,使用的操作系統是對Linux進(jìn)行了定制的armlinux。它啟用了MMU(內存管理單元),是針對支持MMU的處理器設計的。

2.2 開(kāi)發(fā)環(huán)境的建立

絕大多數Linux的軟件開(kāi)發(fā)都以native方式進(jìn)行,即本機開(kāi)發(fā)、調試,本機運行的方式。這種方式通常不適于嵌入式系統的軟件開(kāi)發(fā),因為對于嵌入式系統的開(kāi)發(fā),它沒(méi)有足夠的資源在本機(即嵌入式系統平臺)運行開(kāi)發(fā)工具和調試工具。通常的嵌入式系統軟件開(kāi)發(fā)采用交叉編譯調試的方式。交叉編譯調試環(huán)境建立在宿主機(即圖1所示通過(guò)串口連接的宿主機PC)上,對應的開(kāi)發(fā)板叫做目標板(即嵌入式ARM2410系統)。

通常宿主機和目標板上的處理器不同,宿主機通常為Intel處理器,而目標板如圖1所示為SAMSUNG S3C2410,所以程序需要使用針對處理器特點(diǎn)的編譯器才能生成在相應平臺上可運行的代碼。GNU編譯器提供這樣的功能,在編譯時(shí),可以選擇開(kāi)發(fā)所需的宿主機和目標機,從而建立開(kāi)發(fā)環(huán)境。在進(jìn)行嵌入式開(kāi)發(fā)前的第一步工作就是把一臺PC機作為宿主機開(kāi)發(fā)機,并在其上安裝指定的操作系統。對于嵌入式Linux,宿主機PC上應安裝Linux系統。之后,在宿主機上建立交叉編譯調試的開(kāi)發(fā)環(huán)境,開(kāi)發(fā)環(huán)境的具體建立這里不細談。本文采用移植性很強的C語(yǔ)言在宿主機上編寫(xiě)視頻采集程序,再利用交叉編譯調試工具編譯鏈接生成可執行代碼,最后向目標平臺移植。

3 視頻采集的具體實(shí)現

上面提到系統平臺上運行的是armlinux。在啟動(dòng)后,啟用了MMU,系統進(jìn)入保護模式,所以應用程序就不能直接讀寫(xiě)外設的I/O區域(包括I/O端口和I/O內存),這時(shí)一般就要借助于該外設的驅動(dòng)來(lái)進(jìn)入內核完成這個(gè)工作。本系統中的視頻采集分兩步實(shí)現:一是為USB口數碼攝像頭在內核中寫(xiě)入驅動(dòng),二是要再寫(xiě)入上層應用程序獲取視頻數據。本文著(zhù)重討論后一步。

3.1 USB口數碼攝像頭的驅動(dòng)實(shí)現

在Linux下,設備驅動(dòng)程序可以看成Linux內核與外部設備之間的接口。設備驅動(dòng)程序向應用程序屏蔽了硬件實(shí)現了的細節,使得應用程序可以像操作普通文件一樣來(lái)操作外部設備,可以使用和操作文件中相同的、標準的系統調用接口函數來(lái)完成對硬件設備的打開(kāi)、關(guān)閉、讀寫(xiě)和I/O控制操作,而驅動(dòng)程序的主要任務(wù)也就是要實(shí)現這些系統調用函數。本系統平臺使用的嵌入式armLinux系統在內核主要功能上與Linux操作系統沒(méi)本質(zhì)區別,所以驅動(dòng)程序要實(shí)現的任務(wù)也一樣,只要編譯時(shí)使用的編譯器、部分頭文件和庫文件等要涉及到具體處理器體系結構,這些都可以在Makefile文件中具體指定。

Video4Linux(簡(jiǎn)V4L)是Linux中關(guān)于視頻設備的內核驅動(dòng),它為針對視頻設備的應用程序編程提供一系列接口函數,這些視頻設備包括現今市場(chǎng)上流行的TV卡、視頻捕捉卡和USB攝像頭等。對于USB口攝像頭,其驅動(dòng)程序中需要提供基本的I/O操作接口函數open、read、write、close的實(shí)現。對中斷的處理實(shí)現,內存映射功能以及對I/O通道的控制接口函數ioct1的實(shí)現等,并把它們定義在struct file_operations中。這樣當應用程序對設備文件進(jìn)行諸如open、close、read、write等系統調用操作時(shí),Linux內核將通過(guò)file_operations結構訪(fǎng)問(wèn)驅動(dòng)程序提供的函數。例如,當應用程序對設備文件執行讀操作時(shí),內核將調用file_operations結構中的read函數。在系統平臺上對USB口數碼攝像頭驅動(dòng),首先把USB控制器驅動(dòng)模塊靜態(tài)編譯進(jìn)內核,使平臺中支持USB接口,再在需要使用攝像頭采集時(shí),使用insmode動(dòng)態(tài)加載其驅動(dòng)模塊,這樣攝像頭就可正常工作了,接著(zhù)進(jìn)行了下一步對視頻流的采集編程。

3.2 Video4Linux下的攝像頭采集編程

在USB攝像頭被驅動(dòng)后,只需要再編寫(xiě)一個(gè)對視頻流采集的應用程序就可以了。根據嵌入式系統開(kāi)發(fā)特征,先在宿主機上編寫(xiě)應用程序,再使用交叉編譯器進(jìn)行編譯鏈接,生成在目標平臺的可執行文件。宿主機與目標板通信采用打印終端的方式進(jìn)行交叉調試,成功后移植到目標平臺。本文編寫(xiě)采集程序是在安裝Linux操作系統的宿主機PC機上進(jìn)行的,下面是具體論述。

(1)程序中定義的數據結構

struct voide_capability grab_cap;

struct voide_picture grab_pic;

struct voide_mmap grab_buf;

struct voide_mbuf grab_vm;

這些數據結構都是由Video4Linux支持的,它們的用途如下:

*video_capability包含攝像頭的基本信息,例如設備名稱(chēng)、支持的最大最小分辨率、信號源信息等,分別對應著(zhù)結構體中成員變量name[32]、maxwidth、maxheight、minwidth、minheight、channels(信號源個(gè)數)、type等;

*voide_picture包含設備采集圖像的各種屬性,如brightness(亮度)、hue(色調)、contrast(對比度)、whiteness(色度)、depth(深度)等;

*video_mmap用于內存映射;

*voido_mbuf利用mmap進(jìn)行映射的幀信息,實(shí)際上是輸入到攝像頭存儲器緩沖中的幀信息,包括size(幀的大?。?、frames(最多支持的幀數)、offsets(每幀相對基址的偏移)。

程序中用到的主要系統調用函數有:open("/dev/voideo0",int flags)、close(fd)、mmap(void *start,size_t length,int prot,int flags,int fd,off_t offset)、munmap(void *start,size_tlength)和ioctl(int fd,int cmd,…)。

前面提到Linux系統中把設備看成設備文件,在用戶(hù)空間可以通過(guò)標準的I/O系統調用函數操作設備文件,從而達到與設備通信交互的目的。當然,在設備驅動(dòng)中要提供對這些函數的相應支持。這里說(shuō)明一下ioctl(int fd,int cmd,…)函數,它在用戶(hù)程序中用來(lái)控制I/O通道,其中,fd代表設備文件描述符,cmd代表用戶(hù)程序對設備的控制命令,省略號一般是一個(gè)表示類(lèi)型長(cháng)度的參數,也可沒(méi)有。

(2)采集程序實(shí)現過(guò)程

首先打開(kāi)視頻設備,攝像頭在系統中對應的設備文件為/dev/video0,采用系統調用函數grab_fd=open("/dev/video0",O_RDWR),grab_fd是設備打開(kāi)后返回的文件描述符(打開(kāi)錯誤返回-1),以后的系統調用函數就可使用它來(lái)對設備文件進(jìn)行操作了。接著(zhù),利用ioct1(grab_fd,VIDIOCGCAP,grab_cap)函數讀取struct video_capability中有關(guān)攝像頭的信息。該函數成功返回后,這些信息從內核空間拷貝到用戶(hù)程序空間grab_cap各成員分量中,使用printf函數就可得到各成員分量信息,例如printf("maxheight=%d",grab_fd.maxheight)獲得最大垂直分辨率的大小。不規則用ioct1(grab_fd,VIDIOCGPICT,grab_pic)函數讀取攝像頭緩沖中voideo_picture信息。在用戶(hù)空間程序中可以改變這些信息,具體方法為先給分量賦新值,再調用VIDIOCSPICT ioct1函數,例如:

grab_fd.depth=3;

if(ioct1(grab_fd,VIDIOCSPICT,grab_pic)0)

{perror("VIDIOCSPICT");return -1;};

完成以上初始化設備工作后,就可以對視頻圖像截取了,有兩種方法:一種是read()直接讀??;另外一種mmap()內存映射。Read()通過(guò)內核緩沖區來(lái)讀取數據;而mmap()通過(guò)把設備文件映射到內存中,繞過(guò)了內核緩沖區,最快的磁盤(pán)訪(fǎng)問(wèn)往往還是慢于最慢的內存訪(fǎng)問(wèn),所以mmap()方式加速了I/O訪(fǎng)問(wèn)。另外,mmap()系統調用使得進(jìn)程之間通過(guò)映射同一文件實(shí)現共享內存,各進(jìn)程可以像訪(fǎng)問(wèn)普通內存一樣對文件進(jìn)行訪(fǎng)問(wèn),訪(fǎng)問(wèn)時(shí)只需要使用指針而不用調用文件操作函數。因為mmap()的以上優(yōu)點(diǎn),所以在程序實(shí)現中采用了內存映射方式,即mmap()方式。

利用mmap()方式視頻裁取具體進(jìn)行操作如下。

①先使用ioct1(grab_fd,VIDIOCGMBUF,grab_vm)函數獲得攝像頭存儲緩沖區的幀信息,之后修改voideo_mmap中的設置,例如重新設置圖像幀的垂直及水平分辨率、彩色顯示格式??衫萌缦抡Z(yǔ)句

grab_buf.height=240;

grab_buf.width=320;

grab_buf.format=VIDEO_PALETTE_RGB24;

②接著(zhù)把攝像頭對應的設備文件映射到內存區,具體使用grab_data=(unsigned char*)mmap(0,grab_vm.size,PROT_READ|PROT_WRITE,MAP_SHARED,grad_fd,0)操作。這樣設備文件的內容就映射到內存區,該映射內容區可讀可寫(xiě)并且不同進(jìn)程間可共享。該函數成功時(shí)返回映像內存區的指針,挫敗時(shí)返回值為-1。

下面對單幀采集和連續幀采集進(jìn)行說(shuō)明:

*單幀采集。在上面獲取的攝像頭存儲緩沖區幀信息中,最多可支持的幀數(frames的值)一般為兩幀。對于單幀采集只需設置grab_buf.frame=0,即采集其中的第一幀,使用ioctl(grab_fd,VIDIOCMCAPTURE,grab_buf)函數,若調用成功,則激活設備真正開(kāi)始一幀圖像的截取,是非阻塞的。接著(zhù)使用ioct1(grab_fd,VIDIOCSYNC,frame)函數判斷該幀圖像是否截取完畢,成功返回表示截取完畢,之后就可把圖像數據保存成文件的形式。

*連續幀采集。在單幀的基礎上,利用grab_fd.frames值確定采集完畢攝像頭幀緩沖區幀數據進(jìn)行循環(huán)的次數。在循環(huán)語(yǔ)句中,也是使用VIDIOCMCCAPTURE ioct1和VIDIOCSYNC ioctl函數完成每幀截取,但要給采集到的每幀圖像賦地址,利用語(yǔ)句buf=grab_data+grab_vm.offsets[frame],然后保存文件的形式。若要繼續采集可再加一個(gè)外循環(huán),在外循環(huán)語(yǔ)句只要給原來(lái)的內循環(huán)再賦frame=0即可。

4 小結

筆者最后在宿主機PC上使用交叉編譯器編譯鏈接連續幀采集程序(以雙幀采集為例并保存成bmp文件文件形式)使之生成可執行代碼,并完成了向目標平臺的移植。為了進(jìn)一步觀(guān)察采集的圖像效果,筆者在目標平臺帶網(wǎng)絡(luò )支持的基礎上,編寫(xiě)了一個(gè)簡(jiǎn)單的網(wǎng)絡(luò )通信程序,把采集到并保存為bmp的圖像文件通過(guò)網(wǎng)絡(luò )傳輸到PC機上進(jìn)行顯示,把采集到并保存為bmp的圖像文件通過(guò)網(wǎng)絡(luò )傳輸到PC機上進(jìn)行顯示,通過(guò)對效果的分析,再回到采集程序中重新設置video_picture中的信息,如亮度、對比度等和voide_mmap中的分辨率,重新移植以達到最好效果為準。

在圖1中的嵌入式系統平臺上,應用本文所述方法完成視頻采集工作,再加上相關(guān)的視頻處理并接入網(wǎng)絡(luò ),就構成了一個(gè)智能終端設備,可用于工廠(chǎng)、銀行及小區等場(chǎng)合全天候的智能監控,具有廣闊的市場(chǎng)和應用前景。

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>