新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于ARM的嵌入式USB圖像采集與顯示

        基于ARM的嵌入式USB圖像采集與顯示

        作者: 時間:2011-11-14 來源:網絡 收藏

          (2)讀設備信息。

          int my_v4l_get_capability (my_v4l_struct*) 函數的功能是讀取設備基本信息, 它利用ioctl(vd_fd,VIDIOCGCAP,(vd- >capability) 來讀取有關攝像頭的信息。該函數成功返回后將這些信息從內核空間拷貝到用戶程序空間capability 各成員分量中,使用printf 函數就可得到各成員分量信息。具體如下:

          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;}

          (3)視頻

          本文通過mmap 方式來視頻信息。為了獲得映射的幀緩沖信息,my_v4l_mmap_init(my_v4l_struct*)函數需先初始化緩沖區,并進行內存與緩沖區的綁定,其中函數mmap 用于將文件fd與video_mbuf 綁定實現映射,函數mmap()返回值是系統實際分配的起始地址。函數my_v4l_mmap_init()的部分代碼實現如下:

          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 綁定,實現映射*/

          vd- >mmapsize=vd- >videombuf.size;

          vd- >vmmap.height=vd- >hdrheight;

          vd- >vmmap.width=vd- >hdrwidth;

          vd- >vmmap.format=vd- >formaTIn;

          vd- >vmmap.frame=0;

          ……}

          然后利用驅動程序的ioctl () 函數的VIDIOCMCCAPTURE 和VIDIOCSYNC 命令來獲取。其中ioctl (vd- >fd,VIDIOCMCAPTURE,(vd- >mmap)) 開始一幀圖像的,是非阻塞的;ioctl(vd- >fd,VIDIOCSYNC,frame)用于判斷一幀圖像采集過程結束與否,frame 是當前采集的幀的序號。

          采集工作結束后調用munmap 取消文件fd 與video_mbuf 的綁定。

          munmap(vd- >map,vd- >mbuf.size);

          (4)關閉設備在視頻采集完成后,必需關閉視頻設備。

          close(vd- >fd);

          3 Qt/Embedded 圖像程序的編寫

          Linux 常見的GUI 系統有MiniGUI、MicroWindows、OpenGUI和Framebuffer[5]的Qt/Embedded[4].Qt 是諾基亞開發的一個跨平臺的C++ 圖形用戶界面應用程序框架,它提供給應用程序開發者建立藝術級的圖形用戶界面所需的功能,并且是完全面向對象的,很容易擴展,允許真正的組件編程。正是基于以上優點,本文采用Qt/Embedded 開發平臺,并將基于Qt 的圖形界面Qtopia 移入我們的文件系統中。

          為了避免由于圖像數據量大而在目標板上閃爍的問題,本文采用雙緩沖技術實現采集圖像,采用的是QPixmap 對象。QPixmap 是Qt 為圖像處理提供的類,主要用于圖像的繪制。實現雙緩沖時,先把要顯示的內容繪制在這個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);// 設置畫筆屬性

          p.moveTo(50,330);// 設置畫筆筆尖起始位置

          p.lineTo(150,50);// 開始繪制框線

          p.lineTo(490,50);

          …略

          p.end();// 在QPixmap 上的所有繪制任務結束

          p.begin(this );// 準備把QPixmap 繪制到屏幕上

          p.drawPixmap (0,0,pix);// 繪制QPixmap 到屏幕操作,圖像顯示到LCD 上

          圖像數據的連續采集和顯示是通過定時器實現的,QTimer 類提供了定時器信號和單觸發定時器。設置定時啟動觸發周期,每當定時器時間到就觸發一個定時器事件,在事件中調用VIDIOCMCAPTURE 函數完成對圖像的采集,并通過QPixmap 類將圖像顯示到LCD上。至此就可以通過基于Qt 編寫的圖形界面程序,將 攝像頭采集的視頻圖像在LCD 上實時顯示。

          4 結論

          本文基于9 處理器和Linux 操作系統,詳細介紹了一種 攝像頭圖像采集與顯示的通用方法。Linux 代碼完全開源,系統具有良好的移植性,可方便地進行各種擴展,采用Qt 進行人機界面的設計能夠極大地節省開發成本和周期。本方案經推廣可用于工業控制、智能交通、小區監控等領域。

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 嘉峪关市| 晋中市| 通辽市| 萍乡市| 巴里| 兴化市| 渑池县| 长宁县| 衡阳县| 沂水县| 克什克腾旗| 海林市| 西林县| 洱源县| 张家川| 成武县| 赫章县| 班玛县| 汉阴县| 民丰县| 和静县| 长子县| 西畴县| 龙里县| 广东省| 太康县| 庄河市| 丹凤县| 彭泽县| 新源县| 昌乐县| 凉城县| 灌阳县| 沧源| 泗阳县| 邵东县| 余庆县| 宁强县| 玉屏| 台东县| 洮南市|