基于ARM的嵌入式USB圖像采集與顯示
?。?)讀設(shè)備信息。
int my_v4l_get_capability (my_v4l_struct*) 函數(shù)的功能是讀取設(shè)備基本信息, 它利用ioctl(vd_fd,VIDIOCGCAP,(vd- >capability) 來讀取有關(guān)攝像頭的信息。該函數(shù)成功返回后將這些信息從內(nèi)核空間拷貝到用戶程序空間capability 各成員分量中,使用printf 函數(shù)就可得到各成員分量信息。具體如下:
int my_v4l_get_capability(my_v4l_struct*){
if(ioctl(vd- >fd,VIDIOCGPICT,(vd- >capability))0){
printf(“error:v4l_get_capabilityn”);
exit(1);}
return 0;}
本文通過mmap 方式來采集視頻圖像信息。為了獲得映射的幀緩沖信息,my_v4l_mmap_init(my_v4l_struct*)函數(shù)需先初始化緩沖區(qū),并進行內(nèi)存與緩沖區(qū)的綁定,其中函數(shù)mmap 用于將文件fd與video_mbuf 綁定實現(xiàn)映射,函數(shù)mmap()返回值是系統(tǒng)實際分配的起始地址。函數(shù)my_v4l_mmap_init()的部分代碼實現(xiàn)如下:
void my_v4l_mmap_init(my_v4l_struct*vd){
……
ioctl(vd- >fd,VIDIOCGMBUF,(vd- >mbuf));// 初始化video_mbuf 以得到所映射的buffer的信息
vd- >pframebuffer= (unsigned char*)mmap (0,
vd- >videombuf.size,
PROT_READ|PROT_WRITE,MAP_SHARED,vd- >fd,0);
/* 把文件fd 與video_mbuf 綁定,實現(xiàn)映射*/
vd- >mmapsize=vd- >videombuf.size;
vd- >vmmap.height=vd- >hdrheight;
vd- >vmmap.width=vd- >hdrwidth;
vd- >vmmap.format=vd- >formaTIn;
vd- >vmmap.frame=0;
……}
然后利用驅(qū)動程序的ioctl () 函數(shù)的VIDIOCMCCAPTURE 和VIDIOCSYNC 命令來獲取圖像。其中ioctl (vd- >fd,VIDIOCMCAPTURE,(vd- >mmap)) 開始一幀圖像的采集,是非阻塞的;ioctl(vd- >fd,VIDIOCSYNC,frame)用于判斷一幀圖像采集過程結(jié)束與否,frame 是當前采集的幀的序號。
采集工作結(jié)束后調(diào)用munmap 取消文件fd 與video_mbuf 的綁定。
munmap(vd- >map,vd- >mbuf.size);
?。?)關(guān)閉設(shè)備在視頻采集完成后,必需關(guān)閉視頻設(shè)備。
close(vd- >fd);
基于嵌入式Linux 常見的GUI 系統(tǒng)有MiniGUI、MicroWindows、OpenGUI和基于Framebuffer[5]的Qt/Embedded[4].Qt 是諾基亞開發(fā)的一個跨平臺的C++ 圖形用戶界面應用程序框架,它提供給應用程序開發(fā)者建立藝術(shù)級的圖形用戶界面所需的功能,并且是完全面向?qū)ο蟮模苋菀讛U展,允許真正的組件編程。正是基于以上優(yōu)點,本文采用Qt/Embedded 開發(fā)平臺,并將基于Qt 的圖形界面Qtopia 移入我們的文件系統(tǒng)中。
為了避免由于圖像數(shù)據(jù)量大而在目標板上顯示閃爍的問題,本文采用雙緩沖技術(shù)實現(xiàn)采集圖像顯示,采用的是QPixmap 對象。QPixmap 是Qt 為圖像處理提供的類,主要用于圖像的繪制。實現(xiàn)雙緩沖時,先把要顯示的內(nèi)容繪制在這個QPixmap pixmap 對象上,然后再用一步操作把pixmap 繪制在屏幕上。基于Qt 圖像顯示及輔助框線繪制的部分代碼段如下:
QPixmap pix (width (),height ());// 定義一個QPixmap 用于在上面繪制圖像及框線
QPainter p(pix);// 定義繪制工具
QPainterQPen pen (yellow,3,DotLine);// 定義一個畫筆的屬性,如顏色、粗細、線條樣式
p.drawImage (0,0,img);// 把攝像頭采集到的圖像繪制到QPixmap 上
p.setPen(pen);// 設(shè)置畫筆屬性
p.moveTo(50,330);// 設(shè)置畫筆筆尖起始位置
p.lineTo(150,50);// 開始繪制框線
p.lineTo(490,50);
…略
p.end();// 在QPixmap 上的所有繪制任務結(jié)束
p.begin(this );// 準備把QPixmap 繪制到屏幕上
p.drawPixmap (0,0,pix);// 繪制QPixmap 到屏幕操作,圖像顯示到LCD 上
圖像數(shù)據(jù)的連續(xù)采集和顯示是通過定時器實現(xiàn)的,QTimer 類提供了定時器信號和單觸發(fā)定時器。設(shè)置定時啟動觸發(fā)周期,每當定時器時間到就觸發(fā)一個定時器事件,在事件中調(diào)用VIDIOCMCAPTURE 函數(shù)完成對圖像的采集,并通過QPixmap 類將圖像顯示到LCD上。至此就可以通過基于Qt 編寫的圖形界面程序,將USB 攝像頭采集的視頻圖像在LCD 上實時顯示。
4 結(jié)論
本文基于ARM9 處理器和嵌入式Linux 操作系統(tǒng),詳細介紹了一種USB 攝像頭圖像采集與顯示的通用方法。Linux 代碼完全開源,系統(tǒng)具有良好的移植性,可方便地進行各種擴展,采用Qt 進行人機界面的設(shè)計能夠極大地節(jié)省開發(fā)成本和周期。本方案經(jīng)推廣可用于工業(yè)控制、智能交通、小區(qū)監(jiān)控等領(lǐng)域。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評論