日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式軟件
[導(dǎo)讀]基于S3C2410的的圖像采集系統(tǒng)

引言

圖像采集與存儲功能構(gòu)成的嵌入式監(jiān)控系統(tǒng)是安全防范技術(shù)體系中不可缺少的重要組成部分,隨著微電子技術(shù)和軟件技術(shù)的發(fā)展,嵌入式技術(shù)也有了長足的進步。因此,基于嵌入式技術(shù)的圖像數(shù)據(jù)采集與存儲監(jiān)控系統(tǒng)以其直觀、方便、信息內(nèi)容豐富的特點,廣泛應(yīng)用于許多場合。

監(jiān)控系統(tǒng)工作于特定的環(huán)境下,具有很特殊的環(huán)境和結(jié)構(gòu)要求,這對監(jiān)控系統(tǒng)的軟硬件平臺提出了很高的要求。處理器性能的提高,接口傳輸數(shù)據(jù)能力的增強,特別是未來高容量存儲器的出現(xiàn),圖像監(jiān)控系統(tǒng)的小型化、多功能化是易于實現(xiàn)的,嵌入式技術(shù)引入圖像監(jiān)控系統(tǒng)后,兩個問題需要解決,一是靈活的圖像監(jiān)控系統(tǒng)結(jié)構(gòu)調(diào)整,二是適合監(jiān)控規(guī)范、集圖像和信號檢測與控制一體的交互式軟件的設(shè)計。

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

1.1 硬件平臺的搭建

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

S3C2410處理器是Samsung公司基于ARM公司的ARM920T處理器核,采用0.18um制造工藝的32位微控制器。該處理器擁有:獨立的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個USB主機,1個USB設(shè)備,SD主機和MMC接口,2路SPI。S3C2410處理器最高可運行在203MHz。

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

1.2 軟件平臺的搭建

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

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

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

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

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

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

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

在初始化函數(shù)中,USB設(shè)備驅(qū)動調(diào)用usb_regiSTer函數(shù)進行注冊。

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

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

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

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

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

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

zc301_table列表包含了一系列該驅(qū)動程序可以支持的所有不同類型的USB設(shè)備,如沒有設(shè)置該列表,則該驅(qū)動程序中的探測回調(diào)函數(shù)不會被調(diào)用。[!--empirenews.page--]

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

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

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

通過調(diào)用上面的函數(shù),我們基本得到了所需的參數(shù)值,這樣我們就可以啟動攝像頭了。

當(dāng)然我們還需要staticvoidzc301_shutdown(structusb_zc301*zc301)來關(guān)閉攝像頭。

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

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

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

Video4Linux,簡稱V4L,是Linux中關(guān)于視頻設(shè)備的內(nèi)核驅(qū)動,它為針對視頻設(shè)備的應(yīng)用程序編程提供一系列半標(biāo)準(zhǔn)的接口。V4L利用這個接口,增加一些額外的功能,同時向外提供了一個屬于自己的API。我們可以通過調(diào)用V4L的API來實現(xiàn)各種功能。在Linux下,視頻采集設(shè)備的正常使用依賴于對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è)備名稱、支持的最大最小分辨率、信號源信息等,分別對應(yīng)著結(jié)構(gòu)體中成員變量name、maxwidth、maxheight、minwidth、minheight、channels(信號源個數(shù))、type等;

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

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

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

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

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

V4L圖像采集編程流程:

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

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

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

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

[!--empirenews.page--]

(5)對采集到的圖像進行處理;

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

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

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

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

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

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

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

因為我們是通過調(diào)用采集主函數(shù)intv4lGrab(structvdIn*vd,char*filename)來實現(xiàn)圖像的采集和保存的,所以需要詳細的講解一下該函數(shù)的構(gòu)成。以下是該函數(shù)的具體內(nèi)容:

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

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

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

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

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

4 結(jié)論

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

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

本文將演示一種加速嵌入式系統(tǒng)設(shè)計原型階段的方法,說明如何將與硬件無關(guān)的驅(qū)動程序和傳感器結(jié)合使用,簡化整個嵌入式系統(tǒng)的器件選擇。同時還將介紹嵌入式系統(tǒng)的器件、典型軟件結(jié)構(gòu)以及驅(qū)動程序的實現(xiàn)。后續(xù)文章“利用與硬件無關(guān)的方法簡...

關(guān)鍵字: 嵌入式系統(tǒng) 驅(qū)動程序 傳感器

隨著科技的飛速發(fā)展,嵌入式系統(tǒng)已經(jīng)成為現(xiàn)代生活不可或缺的一部分,它們被廣泛應(yīng)用于從智能家居到自動駕駛汽車的各個領(lǐng)域。而在這些系統(tǒng)中,C語言由于其高效性、可移植性和對硬件的直接控制能力,成為了嵌入式系統(tǒng)開發(fā)的首選語言。

關(guān)鍵字: C語言 驅(qū)動程序

每個嵌入式軟件應(yīng)用程序都必須在某個時候訪問最低級別的固件并控制硬件。驅(qū)動程序的設(shè)計和實現(xiàn)對于確保系統(tǒng)能夠滿足其實時要求至關(guān)重要。

關(guān)鍵字: 嵌入式 驅(qū)動程序

在Linux內(nèi)核開發(fā)中,字符設(shè)備驅(qū)動程序是連接硬件設(shè)備與用戶空間應(yīng)用程序的重要橋梁。本文將詳細介紹如何編寫一個基本的字符設(shè)備驅(qū)動程序,從理論框架到實際代碼實現(xiàn),再到測試和部署。

關(guān)鍵字: Linux 字符設(shè)備 驅(qū)動程序

在本節(jié)中,我們將探究集成模式的數(shù)組,每個模式都是為了提供無縫集成解決方案而定制的。這些模式作為結(jié)構(gòu)化的框架,促進了不同系統(tǒng)之間的聯(lián)系和數(shù)據(jù)交換。它們大致分為三類:

關(guān)鍵字: 數(shù)據(jù)整合 數(shù)據(jù)結(jié)構(gòu)

學(xué)習(xí)C語言是程序員的入門教育,但是在學(xué)習(xí)過程中,常常會遇到一些常見的誤區(qū)。這些誤區(qū)可能會讓學(xué)習(xí)者的學(xué)習(xí)經(jīng)驗不佳,影響到他們掌握該語言的能力。

關(guān)鍵字: C語言 數(shù)據(jù)結(jié)構(gòu)

常用的數(shù)據(jù)結(jié)構(gòu)可根據(jù)數(shù)據(jù)訪問的特點分為線性結(jié)構(gòu)和非線性結(jié)構(gòu)。線性結(jié)構(gòu)包括常見的鏈表、棧、隊列等,非線性結(jié)構(gòu)包括樹、圖等。

關(guān)鍵字: 數(shù)據(jù)結(jié)構(gòu) 非線性結(jié)構(gòu)

堆(heap)和棧(stack)是在計算機中常用的兩種數(shù)據(jù)結(jié)構(gòu)。它們具有不同的特點和用途,對于程序員來說,了解堆和棧的區(qū)別是非常重要的。

關(guān)鍵字: 內(nèi)存 數(shù)據(jù)結(jié)構(gòu)

USB攝像頭是一種采用USB接口的視頻采集設(shè)備,其優(yōu)點在于即插即用、操作簡便,無需額外驅(qū)動程序,支持筆記本電腦,并且成本較低,可以支持遠程網(wǎng)絡(luò)觀看。

關(guān)鍵字: usb攝像頭 驅(qū)動程序

與兩相雙極步進電機的驅(qū)動電路相比,兩相單極步進電機的驅(qū)動電路在輸入段配置、內(nèi)部邏輯及控制電路和驅(qū)動電路使用雙通道方面基本相同,但是輸出段的配置不同。

關(guān)鍵字: 四相步進電機 驅(qū)動程序 程序電路
關(guān)閉