基于S3C2410的嵌入式視頻采集系統設計(二)
當然我們還需要staticvoidzc301_shutdown(structusb_zc301*zc301)來(lái)關(guān)閉攝像頭。
至此,攝像頭驅動(dòng)的驅動(dòng)基本完成。通過(guò)這些函數的設置我們可以把具體的硬件電路抽象化為數據結構中的參數值。接下來(lái)我們可以通過(guò)V4L驅動(dòng)來(lái)調用這些函數,實(shí)現對參數的賦值、打開(kāi)設備、采集圖像和關(guān)閉設備等一系列的過(guò)程。
重新編譯、運行內核時(shí),在串口反饋信息中會(huì )顯示USB攝像頭驅動(dòng)程序成功加載。如圖3所示。
圖3串口反饋信息3Video4Linux下的圖像采集編程:
Video4Linux,簡(jiǎn)稱(chēng)V4L,是Linux中關(guān)于視頻設備的內核驅動(dòng),它為針對視頻設備的應用程序編程提供一系列半標準的接口。V4L利用這個(gè)接口,增加一些額外的功能,同時(shí)向外提供了一個(gè)屬于自己的API。我們可以通過(guò)調用V4L的API來(lái)實(shí)現各種功能。在Linux下,視頻采集設備的正常使用依賴(lài)于對Video4Linux標準的支持。目前的V4L涵蓋了視、音頻流捕捉及處理等內容,USB攝像頭也屬于它支持的范疇。
V4L中定義的主要數據結構:
這些數據結構都是由Video4Linux支持的,它們的用途如下:
?。?)video_capability包含攝像頭的基本信息,例如設備名稱(chēng)、支持的最大最小分辨率、信號源信息等,分別對應著(zhù)結構體中成員變量name、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(每幀相對基址的偏移)。
系統在采集圖像之前,需要初始化這些數據結構中的參數值,系統才能夠按照要求采集圖像數據。
在USB攝像頭被驅動(dòng)后,只需要再編寫(xiě)一個(gè)對視頻流采集的應用程序就可以了。根據嵌入式系統開(kāi)發(fā)特征,先在宿主機上編寫(xiě)應用程序,再使用交叉編譯器進(jìn)行編譯鏈接,生成在目標平臺的可執行文件。宿主機與目標板通信采用打印終端的方式進(jìn)行交叉調試,成功后移植到目標平臺。
V4L圖像采集編程流程:
?。?)打開(kāi)視頻設備;
?。?)讀取設備信息;
?。?)更改設備當前設置;
?。?)視頻采集得到圖像信息;
?。?)對采集到的圖像進(jìn)行處理;
?。?)關(guān)閉視頻設備。
本文編寫(xiě)采集程序是在安裝Linux操作系統的宿主機PC機上進(jìn)行的,之后再移植到開(kāi)發(fā)板上。下面是具體論述。
之前我們講到了在V4L中定義的主要數據結構及其功能。對應著(zhù)這些內容,我們需要對這些數據結構進(jìn)行定義,以抽象化一個(gè)視頻設備。以下是具體的定義內容:
攝像頭、采集圖像和關(guān)閉攝像頭的操作。采集程序中定義了如下的函數,以實(shí)現前面講到的功能。
intinit_videoIn(structvdIn*vd,char*device,intwidth,intheight,intgrabmethod);初始化攝像頭設備。*vd包含了之前定義的數據結構中的基本信息。另外還要對攝像頭采集圖像的大小、采集模式等參數進(jìn)行賦值。
intv4lGrab(structvdIn*vd,char*filename);采集圖像主程序。*filename為圖像的文件名,我們可以通過(guò)對文件名的設置來(lái)確定圖像保存的位置。
intclose_v4l(structvdIn*vd);關(guān)閉攝像頭intget_jpegsize(unsignedchar*buf,intinsize);采集圖像的大小。
因為我們是通過(guò)調用采集主函數intv4lGrab(structvdIn*vd,char*filename)來(lái)實(shí)現圖像的采集和保存的,所以需要詳細的講解一下該函數的構成。以下是該函數的具體內容:
首先,我們需要定義幾個(gè)參數,如下:
FILE*fp;定義一個(gè)文件類(lèi)型指針,指向我們采集到的圖像文件intlen;
定義一個(gè)整型變量,記錄從內存中讀取的數據量intsize;
定義一個(gè)整型變量,指明一幀圖像的數據量interreur=0;定義一個(gè)整型變量,指明運行時(shí)的錯誤返回值intjpegsize;定義一個(gè)整型變量,指明我們需要的圖像大小。
接著(zhù)我們調用read(vd-》fd,vd-》pFramebuffer,size)函數,把存放于圖像緩沖區的數據讀入到指定的臨時(shí)文件中。之后根據我們對圖像的大小、亮度、對比度等要求轉化之前采集到的圖像數據,最后我們打開(kāi)一個(gè)文件,把圖像數據寫(xiě)入到該文件中并保存。
4 結論
本文設計了一種嵌入式視頻采集系統,該系統小巧,并且在保證當前信息完整的情況下,盡可能少的占用存儲容量,實(shí)現了該系統的圖像采集、存儲和重現功能。在硬件規劃上,采用實(shí)用簡(jiǎn)單的USB接口通信。且系統中預留了豐富的外設接口,便于今后的擴展升級。
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)
評論