&
4 基于FrameBuffer的圖象顯示
當(dāng)Video4Linux使用mmap方式采集圖像時(shí),他總是盡最大努力將圖像直接顯示在屏幕上,但并不一定能夠完成,因此一個(gè)完整的設(shè)備應(yīng)該具有圖像顯示的功能,一般來講,嵌入式Linux下顯示一幅圖像總共有以下幾種方法:
(1)在利用Video4Linux采集圖像時(shí),將采集到的圖象數(shù)據(jù)直接放到FrameBuffer的內(nèi)存映射區(qū)中,而Video4Linux也支持這種 功能,利用VIDIOCSFBUF和VIDIOCGFBUF這兩個(gè)ioct1函數(shù),可設(shè)置和獲得struct video_buffer。但該方法并不是每個(gè)圖像采集設(shè)備都支持。
(2)進(jìn)圖像數(shù)據(jù)存成各種格式(例如bmp),在各種GUI軟件中,均會(huì)直接顯示不同格式的圖像的函數(shù),如MiniGui中的FillBoxWithBitmap函數(shù)。
(3)直接將圖像數(shù)據(jù)寫入FrameBuffer中。
在這里主要介紹第3種。FrameBuffer設(shè)備是運(yùn)行在Linux控制臺(tái)上的一個(gè)優(yōu)秀的圖形接口,他幾乎支持所有的硬件,提供了統(tǒng)一的API接口,很 好地實(shí)現(xiàn)了硬件無關(guān)性,他可以直接操作顯存,而且還留有提供圖形加速功能的接口,運(yùn)行時(shí)不需要root權(quán)限;FrameBuffer的設(shè)備節(jié)點(diǎn)是 /dev/fb*,用戶若要使用他,需要在編譯內(nèi)核時(shí)選中FrameBuffer,其簡(jiǎn)單的使用程序如下:
從vinfo和finfo中取得顯存起始地址、分辨率、色深等信息,然后根據(jù)這些計(jì)算出需映射顯存的大小。
由此便可直接操作大小為screensize,起始地址為fbp的內(nèi)存區(qū)域,在LCD上直接顯示圖像、圖形、文字等,例如執(zhí)行memset(fbp,0,screensize)將進(jìn)行清屏操作。
需要注意的是,對(duì)于色深為8位或8位以下的設(shè)備,在進(jìn)行繪圖操作前還需要設(shè)置合適的調(diào)色板,操作調(diào)色板要用到fb_camp結(jié)構(gòu),執(zhí)行ioctl(fd,F(xiàn)BIOGETCMAP,&old_cmap)將保存調(diào)色板信息,執(zhí)行ioctl(fd,F(xiàn)BIO-PUTCMAP,&new_cmap)將設(shè)置新的調(diào)色板。以下介紹如何顯示一個(gè)象素,這里假設(shè)LCD為24位色的。

由此便可逐一顯示每個(gè)象素,進(jìn)而顯示整幅圖像。
5 結(jié)語(yǔ)
由于Linux的驅(qū)動(dòng)模型支持模塊堆疊技術(shù),內(nèi)核開發(fā)者已提供了一些通用模塊,因此,雖然文中是以USB攝像頭為例,但只要針對(duì)自己的圖像采集設(shè)備編寫基于Video4 Linux的驅(qū)動(dòng)程序, 針對(duì)自己的LCD編寫基于FrameBuffer的驅(qū)動(dòng)程序,以上的程序便可成為通用的圖像采集與顯示程序。應(yīng)用本文所述方法完成圖像采集與顯示工作,再 加上相關(guān)的處理并接入網(wǎng)絡(luò),就構(gòu)成了一個(gè)智能終端設(shè)備,可用于工廠、銀行等場(chǎng)合全天候的智能監(jiān)控,圖像的網(wǎng)絡(luò)通信等,具有廣闊的是市場(chǎng)和應(yīng)用前景。
from:
http://article.ednchina.com/Embeded/2006-10/200610101046022.htm