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

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