<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 嵌入式Linux的圖像采集與顯示

          嵌入式Linux的圖像采集與顯示

          ——
          作者:郭劍,趙建 時間:2007-01-26 來源:《現(xiàn)代電子技術(shù)》 收藏


          1 系統(tǒng)平臺的硬件結(jié)構(gòu)

          本文引用地址:http://www.ex-cimer.com/article/21127.htm

          本文使用的系統(tǒng)平臺硬件功能框圖如圖1所示,該平臺采用samsung公司的處理器s3c2410。該處理器內(nèi)部集成了arm公司arm920t處理器核的32b微控制器,資源豐富,帶獨立的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個usb接口控制器、2路spi,主頻最高可達203mhz。在處理器豐富資源的基礎(chǔ)上,還進行了相關(guān)的配置和擴展,平臺配置了16mb 16b的flash和64mb 32位的sdram,通過以太網(wǎng)控制器芯片ax88796擴展了一個網(wǎng)口,另外引出了一個host usb接口。在usb接口上外接一個帶usb口的攝像頭。另外,還配有分辨率為320×240,256色的lcd。

          2 嵌入式linux簡介

          linux操作系統(tǒng)具有相當多的優(yōu)點,他的內(nèi)核穩(wěn)定、功能強大、支持多種硬件平臺、源代碼完全開放,可裁減和低成本的特性非常適合于嵌入式應(yīng)用,并且linux本身直接提供完整的tcp/ip協(xié)議,可非常方便地進行網(wǎng)絡(luò)應(yīng)用。但linux內(nèi)核本身不具備強實時性,且內(nèi)核體積較大,而且嵌入式系統(tǒng)的硬件資源有限,因此把linux用于嵌入式系統(tǒng),必須對linux進行實時化和嵌入式化,即通過配置內(nèi)核,裁減shell和嵌入式c庫對系統(tǒng)定制,使整個系統(tǒng)能夠存放到容量較小的flash中,linux的動態(tài)模塊加載,使linux的裁減極為方便,高度模塊化的部件使添加非常容易。

          整個系統(tǒng)軟件是在嵌入式linux的基礎(chǔ)上構(gòu)建的。s3c2410平臺使用的linux內(nèi)核是在linux-2.4.18內(nèi)核打上patch-2.4.18-s3c2410這個補丁后編譯而成。s3c2410平臺使用的文件系統(tǒng)是yaffs,文件系統(tǒng)包括應(yīng)用程序、模塊、配置文件和庫等,圖像的采集和顯示是建立在嵌入式linux內(nèi)核之上的,整個軟件系統(tǒng)如圖2所示。

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

          3 基于video4linux的圖像采集

          video4linux是linux中關(guān)于視頻設(shè)備的內(nèi)核驅(qū)動,他為針對視頻設(shè)備的應(yīng)用程序編程提供一系列接口函數(shù),在linux下,視頻采集設(shè)備的正常使用依賴于對video4 linux標準的支持。如果使用video4linux,在編譯內(nèi)核時,一定要選中multimedia devices下的video for linux選項,本文針對的設(shè)備文件是/dev/video,使用的器件是基于ov511的usb攝像頭。在運行程序前,一定要先加載usb及ov511設(shè)備驅(qū)動模塊,同時加載video4linux模塊,分別使用命令:modprobe usbcore,modprobe usbohci,modprobe videodev和modprobe ov511,以確保生成設(shè)備文件/dev/video,若使用的linux操作系統(tǒng)不支持modprobe命令,也可使用insmod命令。一般來講,基于video4linux的圖像采集的程序流程如圖3所示。

          以下簡單介紹程序的編寫,在這里只給出關(guān)鍵部分的實現(xiàn)代碼。

          首先,必須聲明包含2個頭文件:

          在獲取圖像信息后,還可根據(jù)需要改變這些信息,例如對比度、亮度、調(diào)色板等,具體做法是先給video_picture中相應(yīng)變量賦新值,再利用vidiocspict ioct1函數(shù)。

          第2部分,使用mmap方式的單幀圖象采集:

          然后調(diào)用ioct1(grab_fd,vidiocsync,&frame)函數(shù),該函數(shù)成功返回則表示采集完畢,采集到的圖像數(shù)據(jù)放到以data為起始地址,長度為240×320×3的內(nèi)存區(qū)域中,讀取該內(nèi)存中的數(shù)據(jù)便可得到圖像數(shù)據(jù)。

          在此基礎(chǔ)上同樣可實現(xiàn)連續(xù)幀的采集,即一次采集連續(xù)多幀圖像的數(shù)據(jù),video4linux最多支持一次采集32幀,此時首先要設(shè)置grab_buf.frame為要采集的幀數(shù),而每一幀的數(shù)據(jù)在內(nèi)存中的位置為data+grab_vm.offsets[frame],其中g(shù)rab_vm為video_mbuf結(jié)構(gòu)體變量的一個聲明,利用ioct1(fd,vidiocgmbuf,&grab_vm)便可獲得grab_vm的信息。

          4 基于framebuffer的圖象顯示

          當video4linux使用mmap方式采集圖像時,他總是盡最大努力將圖像直接顯示在屏幕上,但并不一定能夠完成,因此一個完整的設(shè)備應(yīng)該具有圖像顯示的功能,一般來講,嵌入式linux下顯示一幅圖像總共有以下幾種方法:

          (1)在利用video4linux采集圖像時,將采集到的圖象數(shù)據(jù)直接放到framebuffer的內(nèi)存映射區(qū)中,而video4linux也支持這種功能,利用vidiocsfbuf和vidiocgfbuf這兩個ioct1函數(shù),可設(shè)置和獲得struct video_buffer。但該方法并不是每個圖像采集設(shè)備都支持。

          (2)進圖像數(shù)據(jù)存成各種格式(例如bmp),在各種gui軟件中,均會直接顯示不同格式的圖像的函數(shù),如minigui中的fillboxwithbitmap函數(shù)。

          (3)直接將圖像數(shù)據(jù)寫入framebuffer中。

          在這里主要介紹第3種。framebuffer設(shè)備是運行在linux控制臺上的一個優(yōu)秀的圖形接口,他幾乎支持所有的硬件,提供了統(tǒng)一的api接口,很好地實現(xiàn)了硬件無關(guān)性,他可以直接操作顯存,而且還留有提供圖形加速功能的接口,運行時不需要root權(quán)限;framebuffer的設(shè)備節(jié)點是/dev/fb*,用戶若要使用他,需要在編譯內(nèi)核時選中framebuffer,其簡單的使用程序如下:

          從vinfo和finfo中取得顯存起始地址、分辨率、色深等信息,然后根據(jù)這些計算出需映射顯存的大小。

          由此便可直接操作大小為screensize,起始地址為fbp的內(nèi)存區(qū)域,在lcd上直接顯示圖像、圖形、文字等,例如執(zhí)行memset(fbp,0,screensize)將進行清屏操作。

          需要注意的是,對于色深為8位或8位以下的設(shè)備,在進行繪圖操作前還需要設(shè)置合適的調(diào)色板,操作調(diào)色板要用到fb_camp結(jié)構(gòu),執(zhí)行ioctl(fd,fbiogetcmap,&old_cmap)將保存調(diào)色板信息,執(zhí)行ioctl(fd,fbio-putcmap,&new_cmap)將設(shè)置新的調(diào)色板。

          以下介紹如何顯示一個象素,這里假設(shè)lcd為24位色的。

          由此便可逐一顯示每個象素,進而顯示整幅圖像。

          5 結(jié)語

          由于linux的驅(qū)動模型支持模塊堆疊技術(shù),內(nèi)核開發(fā)者已提供了一些通用模塊,因此,雖然文中是以usb攝像頭為例,但只要針對自己的圖像采集設(shè)備編寫基于video4 linux的驅(qū)動程序,針對自己的lcd編寫基于framebuffer的驅(qū)動程序,以上的程序便可成為通用的圖像采集與顯示程序。應(yīng)用本文所述方法完成圖像采集與顯示工作,再加上相關(guān)的處理并接入網(wǎng)絡(luò),就構(gòu)成了一個智能終端設(shè)備,可用于工廠、銀行等場合全天候的智能監(jiān)控,圖像的網(wǎng)絡(luò)通信等,具有廣闊的是市場和應(yīng)用前景。



          關(guān)鍵詞:

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();