當(dāng)前位置:首頁 > 嵌入式 > 嵌入式軟件
[導(dǎo)讀]基于嵌入式Linux與S3C2410平臺的視頻采集

    摘要:首先簡介基于嵌入式Linux系統(tǒng)的S3C2410平臺和在平臺上進(jìn)行開發(fā)所需的軟件環(huán)境,接著詳細(xì)論述在該平臺上如何實(shí)現(xiàn)視頻采集這一應(yīng)用,并對視頻采集程序的實(shí)現(xiàn)進(jìn)行具體的介紹,最后完成應(yīng)用程序向目標(biāo)平臺的移植。

    關(guān)鍵詞:嵌入式Linux Video4Linux S3C2410 內(nèi)存映射

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

1 系統(tǒng)平臺上的硬件系統(tǒng)

本文使用的系統(tǒng)平臺硬件功能框圖如圖1所示。該平臺采用Samsung公司的處理器S3C2410。該處理器內(nèi)部集成了ARM公司ARM920T處理器核的32位微控制器,資源豐富,帶獨(dú)立的16KB的指令Cache和16KB數(shù)據(jù)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,主頻最高可達(dá)203MHz。在處理器豐富資源的基礎(chǔ)上,還進(jìn)行了相關(guān)的配置和擴(kuò)展,平臺配置了16MB 16位的Flash和64MB 32位的SDRAM。通過以太網(wǎng)控制器芯片DM9000E擴(kuò)展了一個(gè)網(wǎng)口,另外引出了一個(gè)HOST USB接口。通過在USB接口上外接一個(gè)帶USB口的攝像頭,將采集到的視頻圖像數(shù)據(jù)放入輸入緩沖區(qū)中。然后,或者保存成文件的形式,或者運(yùn)行移植到平臺上的圖像處理程序,對緩沖的圖像數(shù)據(jù)直接進(jìn)行相關(guān)處理,再保存并打成UDP包。最后,通過網(wǎng)絡(luò)接口將圖像發(fā)送到Internet上。本文只討論其中視頻采集部分的具體實(shí)現(xiàn)。

2 系統(tǒng)平臺中的軟件系統(tǒng)

2.1 Linux與嵌入式系統(tǒng)

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

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

絕大多數(shù)Linux的軟件開發(fā)都以native方式進(jìn)行,即本機(jī)開發(fā)、調(diào)試,本機(jī)運(yùn)行的方式。這種方式通常不適于嵌入式系統(tǒng)的軟件開發(fā),因?yàn)閷τ谇度胧较到y(tǒng)的開發(fā),它沒有足夠的資源在本機(jī)(即嵌入式系統(tǒng)平臺)運(yùn)行開發(fā)工具和調(diào)試工具。通常的嵌入式系統(tǒng)軟件開發(fā)采用交叉編譯調(diào)試的方式。交叉編譯調(diào)試環(huán)境建立在宿主機(jī)(即圖1所示通過串口連接的宿主機(jī)PC)上,對應(yīng)的開發(fā)板叫做目標(biāo)板(即嵌入式ARM2410系統(tǒng))。

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

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

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

3.1 USB口數(shù)碼攝像頭的驅(qū)動實(shí)現(xiàn)

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

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

3.2 Video4Linux下的攝像頭采集編程

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

(1)程序中定義的數(shù)據(jù)結(jié)構(gòu)

struct voide_capability grab_cap;

struct voide_picture grab_pic;

struct voide_mmap grab_buf;

struct voide_mbuf grab_vm;

這些數(shù)據(jù)結(jié)構(gòu)都是由Video4Linux支持的,它們的用途如下:

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

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

*video_mmap用于內(nèi)存映射;

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

程序中用到的主要系統(tǒng)調(diào)用函數(shù)有: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系統(tǒng)中把設(shè)備看成設(shè)備文件,在用戶空間可以通過標(biāo)準(zhǔn)的I/O系統(tǒng)調(diào)用函數(shù)操作設(shè)備文件,從而達(dá)到與設(shè)備通信交互的目的。當(dāng)然,在設(shè)備驅(qū)動中要提供對這些函數(shù)的相應(yīng)支持。這里說明一下ioctl(int fd,int cmd,…)函數(shù),它在用戶程序中用來控制I/O通道,其中,fd代表設(shè)備文件描述符,cmd代表用戶程序?qū)υO(shè)備的控制命令,省略號一般是一個(gè)表示類型長度的參數(shù),也可沒有。

(2)采集程序?qū)崿F(xiàn)過程

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

grab_fd.depth=3;

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

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

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

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

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

grab_buf.height=240;

grab_buf.width=320;

grab_buf.format=VIDEO_PALETTE_RGB24;

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

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

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

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

4 小結(jié)

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

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

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉