當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式教程
[導(dǎo)讀]基于ARM920T處理器核的圖像采集系統(tǒng)設(shè)計(jì)

引言

  隨著微電子技術(shù)和軟件技術(shù)的發(fā)展,嵌入式技術(shù)也有了長(zhǎng)足的進(jìn)步。因此,基于嵌入式技術(shù)的圖像數(shù)據(jù)采集與存儲(chǔ)監(jiān)控系統(tǒng)以其直觀、方便、信息內(nèi)容豐富的特點(diǎn),廣泛應(yīng)用于許多場(chǎng)合。

  處理器性能的提高,接口傳輸數(shù)據(jù)能力的增強(qiáng),特別是未來(lái)高容量存儲(chǔ)器的出現(xiàn),圖像監(jiān)控系統(tǒng)的小型化、多功能化是易于實(shí)現(xiàn)的,嵌入式技術(shù)引入圖像監(jiān)控系統(tǒng)后,兩個(gè)問(wèn)題需要解決,一是靈活的圖像監(jiān)控系統(tǒng)結(jié)構(gòu)調(diào)整,二是適合監(jiān)控規(guī)范、集圖像和信號(hào)檢測(cè)與控制一體的交互式軟件的設(shè)計(jì)。
 

  1 系統(tǒng)平臺(tái)的搭建

  1.1 硬件平臺(tái)的搭建

  ARM(AdvancedRISCMachines),既可以認(rèn)為是一個(gè)公司的名字,也可以認(rèn)為是對(duì)一類(lèi)微處理器的統(tǒng)稱(chēng),還可以認(rèn)為是一種技術(shù)的名字。

  S3C2410處理器是Samsung公司基于ARM公司的ARM920T處理器核,采用0.18um制造工藝的32位微控制器。該處理器擁有:獨(dú)立的16KB指令Cache和16KB數(shù)據(jù)Cache,MMU,支持TFT的LCD控制器,NAND閃存控制器,3路UART,4路DMA,4路帶PWM的Timer,I/O口,RTC,8路10位ADC,TouchScreen接口,IIC-BUS接口,IIS-BUS接口,2個(gè)USB主機(jī),1個(gè)USB設(shè)備,SD主機(jī)和MMC接口,2路SPI。S3C2410處理器最高可運(yùn)行在203MHz。

  由S3C2410為核心的圖像采集系統(tǒng)的硬件結(jié)構(gòu)如圖1所示。因?yàn)镾3C2410內(nèi)部只有很小的存儲(chǔ)空間,所以我必須外擴(kuò)系統(tǒng)的存儲(chǔ)器,作為32位的微處理器,S3C2410支持8位,16位和32位尋址方式,有16M×32位的尋址能力,可方便地構(gòu)建較大地存儲(chǔ)空間,系統(tǒng)的存儲(chǔ)器由FLASH和SDRAM構(gòu)成。數(shù)碼攝像頭通過(guò)USB接口與S3C2410芯片連接,通過(guò)S3C2410芯片來(lái)控制數(shù)碼攝像頭對(duì)圖像進(jìn)行采集,并存儲(chǔ)在存儲(chǔ)器中。

  

 

  1.2 軟件平臺(tái)的搭建

  嵌入式Linux(EmbeddedLinux)是指對(duì)Linux經(jīng)過(guò)裁剪小型化后,可固化在存儲(chǔ)器或單片機(jī)中,應(yīng)用于特定嵌入式場(chǎng)合的專(zhuān)用Linux操作系統(tǒng)。具體的搭建流程如圖2所示。

  

 

  2 USB攝像頭設(shè)備驅(qū)動(dòng)的開(kāi)發(fā)

  在Linuxkernel源碼目錄中driver/usb/usb_skeleton.c提供了一個(gè)最基礎(chǔ)的USB驅(qū)動(dòng)程序,我們稱(chēng)為USB骨架。通過(guò)他僅需要修改極少的部分,就可以完成一個(gè)USB設(shè)備的驅(qū)動(dòng)。我們的USB驅(qū)動(dòng)開(kāi)發(fā)也是從它開(kāi)始的。USB驅(qū)動(dòng)程序結(jié)構(gòu)如下:

  

 

  該結(jié)構(gòu)指明了USB設(shè)備驅(qū)動(dòng)所要做的工作,具體內(nèi)容如下:

  (1)在驅(qū)動(dòng)模塊加載的時(shí)候,向USB核心子系統(tǒng)注冊(cè),并告訴子系統(tǒng)需要支持的設(shè)備。

  (2)在卸載USB設(shè)備驅(qū)動(dòng)程序向USB核心子系統(tǒng)注銷(xiāo)。

  (3)當(dāng)獲支持的設(shè)備插入或者拔出的時(shí)候,調(diào)用哪些功能。

  在初始化函數(shù)中,USB設(shè)備驅(qū)動(dòng)調(diào)用usb_register函數(shù)進(jìn)行注冊(cè)。

  

 

  以上介紹了簡(jiǎn)單USB設(shè)備驅(qū)動(dòng)程序的框架。但是我們要進(jìn)行的攝像頭驅(qū)動(dòng)開(kāi)發(fā)比上述驅(qū)動(dòng)稍微復(fù)雜些。除了之前講到的USB驅(qū)動(dòng)還包括圖像采集部分的設(shè)備驅(qū)動(dòng)。

  首先,我們需要定義一個(gè)數(shù)據(jù)結(jié)構(gòu),其中一個(gè)包括圖片信息、采集模式、解碼方式。具體定義如下。

  

 

  

 

  LinuxUSB驅(qū)動(dòng)程序需要做的第一件事情就是在LinuxUSB子系統(tǒng)里注冊(cè),并提供一些相關(guān)信息,例如這個(gè)驅(qū)動(dòng)程序支持哪種設(shè)備,當(dāng)被支持的設(shè)備從系統(tǒng)插入或拔出時(shí),會(huì)有哪些動(dòng)作。所有這些信息都將傳送到USB子系統(tǒng)中。以下代碼完成USB攝像頭的注冊(cè)功能:

  

 

  以上定義的數(shù)據(jù)含義如下ZC301是客戶(hù)端驅(qū)動(dòng)程序的名稱(chēng),用于避免驅(qū)動(dòng)程序的重復(fù)安裝和卸載。

  zc301_probe則指向USB驅(qū)動(dòng)程序的探測(cè)函數(shù)指針,提供給USB內(nèi)核的函數(shù),用于判斷驅(qū)動(dòng)程序是否能對(duì)設(shè)備的某個(gè)接口進(jìn)行驅(qū)動(dòng)。

  zc301_disconnect指向USB驅(qū)動(dòng)程序中的斷開(kāi)函數(shù)的指針,當(dāng)從系統(tǒng)中被移除或者驅(qū)動(dòng)程序正在從USB核心中卸載時(shí),USB核心將調(diào)用該函數(shù)。

  zc301_table列表包含了一系列該驅(qū)動(dòng)程序可以支持的所有不同類(lèi)型的USB設(shè)備,如沒(méi)有設(shè)置該列表,則該驅(qū)動(dòng)程序中的探測(cè)回調(diào)函數(shù)不會(huì)被調(diào)用。

  系統(tǒng)啟動(dòng)時(shí),首先需要加載各種驅(qū)動(dòng)模塊,然后向系統(tǒng)注冊(cè)了生產(chǎn)廠商號(hào)碼(VendorID)和產(chǎn)品號(hào)(Pro-ductID)。當(dāng)USB設(shè)備連接到主機(jī)上,系統(tǒng)會(huì)檢測(cè)它的VendorID和ProductID,如果與驅(qū)動(dòng)模塊的注冊(cè)內(nèi)容匹配,則將該驅(qū)動(dòng)程序與設(shè)備掛接起來(lái)[5]。當(dāng)插入攝像頭時(shí),系統(tǒng)會(huì)調(diào)用zc301_probe函數(shù)。參數(shù)dev指定了設(shè)備信息,probe函數(shù)驗(yàn)證所有可選配置的有效性,并調(diào)用usbvideo模塊的sbvideo_Regis-terVideoDevice()函數(shù)向videodev系統(tǒng)注冊(cè)。

  當(dāng)系統(tǒng)完成驅(qū)動(dòng)注冊(cè)后,調(diào)用staticintzc301_init(structusb_zc301*zc301)和staticvoidzc301_start(structusb_301*zc301)函數(shù)完成對(duì)設(shè)備的初始化過(guò)程:填寫(xiě)各個(gè)寄存器值、啟動(dòng)攝像頭。系統(tǒng)運(yùn)行到這一步,基本完成了對(duì)攝像頭驅(qū)動(dòng)加載及設(shè)備初始化。接下來(lái)需要通過(guò)讀取用戶(hù)設(shè)定的圖像規(guī)格,其中包括:圖像格式、分辨率、顏色深度、對(duì)比度和亮度等參數(shù)。這些數(shù)值的讀取都是通過(guò)以下函數(shù)實(shí)現(xiàn)的:

  

 

  在得到這些參數(shù)值后,再調(diào)用一套函數(shù),實(shí)現(xiàn)參數(shù)的設(shè)置。每個(gè)參數(shù)設(shè)置函數(shù)和之前的參數(shù)取值函數(shù)是一一對(duì)應(yīng)的。具體函數(shù)如下:

  

 

  通過(guò)調(diào)用上面的函數(shù),我們基本得到了所需的參數(shù)值,這樣我們就可以啟動(dòng)攝像頭了。[!--empirenews.page--]當(dāng)然我們還需要staticvoidzc301_shutdown(structusb_zc301*zc301)來(lái)關(guān)閉攝像頭。

 

  至此,攝像頭驅(qū)動(dòng)的驅(qū)動(dòng)基本完成。通過(guò)這些函數(shù)的設(shè)置我們可以把具體的硬件電路抽象化為數(shù)據(jù)結(jié)構(gòu)中的參數(shù)值。接下來(lái)我們可以通過(guò)V4L驅(qū)動(dòng)來(lái)調(diào)用這些函數(shù),實(shí)現(xiàn)對(duì)參數(shù)的賦值、打開(kāi)設(shè)備、采集圖像和關(guān)閉設(shè)備等一系列的過(guò)程。

  重新編譯、運(yùn)行內(nèi)核時(shí),在串口反饋信息中會(huì)顯示USB攝像頭驅(qū)動(dòng)程序成功加載。如圖3所示。

  

 

  圖3串口反饋信息3Video4Linux下的圖像采集編程:

  Video4Linux,簡(jiǎn)稱(chēng)V4L,是Linux中關(guān)于視頻設(shè)備的內(nèi)核驅(qū)動(dòng),它為針對(duì)視頻設(shè)備的應(yīng)用程序編程提供一系列半標(biāo)準(zhǔn)的接口。V4L利用這個(gè)接口,增加一些額外的功能,同時(shí)向外提供了一個(gè)屬于自己的API。我們可以通過(guò)調(diào)用V4L的API來(lái)實(shí)現(xiàn)各種功能。在Linux下,視頻采集設(shè)備的正常使用依賴(lài)于對(duì)Video4Linux標(biāo)準(zhǔn)的支持。目前的V4L涵蓋了視、音頻流捕捉及處理等內(nèi)容,USB攝像頭也屬于它支持的范疇。

  V4L中定義的主要數(shù)據(jù)結(jié)構(gòu):

  

 

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

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

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

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

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

  系統(tǒng)在采集圖像之前,需要初始化這些數(shù)據(jù)結(jié)構(gòu)中的參數(shù)值,系統(tǒng)才能夠按照要求采集圖像數(shù)據(jù)。

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

  V4L圖像采集編程流程:

  (1)打開(kāi)視頻設(shè)備;

  (2)讀取設(shè)備信息;

  (3)更改設(shè)備當(dāng)前設(shè)置;

  (4)視頻采集得到圖像信息;

  (5)對(duì)采集到的圖像進(jìn)行處理;

  (6)關(guān)閉視頻設(shè)備。

  本文編寫(xiě)采集程序是在安裝Linux操作系統(tǒng)的宿主機(jī)PC機(jī)上進(jìn)行的,之后再移植到開(kāi)發(fā)板上。下面是具體論述。

  之前我們講到了在V4L中定義的主要數(shù)據(jù)結(jié)構(gòu)及其功能。對(duì)應(yīng)著這些內(nèi)容,我們需要對(duì)這些數(shù)據(jù)結(jié)構(gòu)進(jìn)行定義,以抽象化一個(gè)視頻設(shè)備。以下是具體的定義內(nèi)容:

  

 

  攝像頭、采集圖像和關(guān)閉攝像頭的操作。采集程序中定義了如下的函數(shù),以實(shí)現(xiàn)前面講到的功能。

  intinit_videoIn(structvdIn*vd,char*device,intwidth,intheight,intgrabmethod);初始化攝像頭設(shè)備。*vd包含了之前定義的數(shù)據(jù)結(jié)構(gòu)中的基本信息。另外還要對(duì)攝像頭采集圖像的大小、采集模式等參數(shù)進(jìn)行賦值。

  intv4lGrab(structvdIn*vd,char*filename);采集圖像主程序。*filename為圖像的文件名,我們可以通過(guò)對(duì)文件名的設(shè)置來(lái)確定圖像保存的位置。

  intclose_v4l(structvdIn*vd);關(guān)閉攝像頭intget_jpegsize(unsignedchar*buf,intinsize);采集圖像的大小。

  因?yàn)槲覀兪峭ㄟ^(guò)調(diào)用采集主函數(shù)intv4lGrab(structvdIn*vd,char*filename)來(lái)實(shí)現(xiàn)圖像的采集和保存的,所以需要詳細(xì)的講解一下該函數(shù)的構(gòu)成。以下是該函數(shù)的具體內(nèi)容:

  

 

  首先,我們需要定義幾個(gè)參數(shù),如下:

  FILE*fp;定義一個(gè)文件類(lèi)型指針,指向我們采集到的圖像文件intlen;

  定義一個(gè)整型變量,記錄從內(nèi)存中讀取的數(shù)據(jù)量intsize;

  定義一個(gè)整型變量,指明一幀圖像的數(shù)據(jù)量interreur=0;定義一個(gè)整型變量,指明運(yùn)行時(shí)的錯(cuò)誤返回值intjpegsize;定義一個(gè)整型變量,指明我們需要的圖像大小。

  接著我們調(diào)用read(vd->fd,vd->pFramebuffer,size)函數(shù),把存放于圖像緩沖區(qū)的數(shù)據(jù)讀入到指定的臨時(shí)文件中。之后根據(jù)我們對(duì)圖像的大小、亮度、對(duì)比度等要求轉(zhuǎn)化之前采集到的圖像數(shù)據(jù),最后我們打開(kāi)一個(gè)文件,把圖像數(shù)據(jù)寫(xiě)入到該文件中并保存。

  4 結(jié)論

  本文設(shè)計(jì)了一種嵌入式視頻采集系統(tǒng),該系統(tǒng)小巧,并且在保證當(dāng)前信息完整的情況下,盡可能少的占用存儲(chǔ)容量,實(shí)現(xiàn)了該系統(tǒng)的圖像采集、存儲(chǔ)和重現(xiàn)功能。在硬件規(guī)劃上,采用實(shí)用簡(jiǎn)單的USB接口通信。且系統(tǒng)中預(yù)留了豐富的外設(shè)接口,便于今后的擴(kuò)展升級(jí)。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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