?

基于Qt/Embedded視頻采集方案的設計與實現

2012-06-29 01:37張玉萍
電視技術 2012年23期
關鍵詞:開發板調用線程

張玉萍,鄒 澎

(鄭州大學信息工程學院,河南 鄭州 450001)

責任編輯:任健男

隨著信息技術的飛速發展,視頻采集系統廣泛應用于數碼攝像、安防監控、機器人視覺等眾多領域。Linux操作系統以其免費、開源等諸多優勢,成為嵌入式設備開發的研究熱點,同時Qt/Embedded是Trolltech開發商發布的嵌入式版本GUI開發工具,主要運行在Linux系統上,它包含完整的C++圖形界面開發工具包,并具有整套供應用程序開發的標準API函數,以其開源性、跨平臺性、界面藝術美觀性,適合高端應用性等特點,在嵌入式設備中得到廣泛的應用。因此采用基于Qt/Embedded視頻采集方案,性價比更高。

嵌入式設備視頻采集GUI設計的過程中,以往多采用QTimer定時器類實現圖像的連續性。該方案中時間的設定依賴于嵌入式平臺和攝像頭的類型,需要多次測試,過程較為繁瑣。本文調用V4L2提供的API接口函數以及在設計相同的Qt/Embedded圖像用戶界面基礎上,分別使用QThread類和QPainter類庫兩種方案,實現把USB攝像頭采集的圖像實時的顯示在GUI界面上。

1 V4L2圖像采集過程

V4L2是Linux系統中關于視頻設備的內核驅動,它為視頻設備的應用程序提供一系列接口函數[1-2]。本文Linux系統內核版本為2.6.29在內核定制過程中,已經加入了對V4L2模塊及USB攝像頭的支持,兩種方案中圖像的采集程序均調用V4L2模塊提供的主要編程接口函數獲取USB攝像頭中圖像數據,V4L2下視頻編程的流程如圖1所示。

圖1 視頻編程流程圖

下面對流程中用到的V4L2主要的API函數作簡要分析,并給出具體的參數設置。

1)打開設備操作

在Linux操作系統中任何設備都看作文件,對設備的操作就轉換成對設備文件的操作。打開視頻設備,調用函數 fd=open("/dev/video0",O_RDWR,0),其中/dev/video0就是USB攝像頭對應的設備文件,O_RDWR表明本文采用阻塞模式打開攝像頭設備。

2)視頻采集前初始化的設置

首先使用ioctl(fd,VIDIOC_QUERYCAP,&cap)獲取有關攝像頭的基本信息,查看是否支持視頻輸入或者音頻輸入輸出等。其次,在支持視頻輸入的基礎上,通過調用ioctl(fd,VIDIOC_S_FMT,&format)函數對當前驅動視頻捕獲格式進行設置。具體如下:

在上述步驟的基礎上,需要對V4L2中關鍵結構體v4l2_requestbuffers和v4l2_buffer進行設置,分別通過調用VIDIOC_REQBUFS及VIDIOC_QUERYBUF指令獲取緩存,實現內存映射。關鍵設置如下:

3)圖像采集與處理

內核采集到圖像的數據通過內存映射的方式,使得在用戶空間內可以對圖像數據進行各種處理操作。關鍵設置如下:

4)結束視頻采集

調用 ioctl(fd,VIDIOC_STREAMOFF,&format)函數停止視頻采集,之后取消內存映射,釋放內核中申請的緩存,分別通過函數 munmap(buffers[i].start,buffers[i].length)和free(buffers)實現,最后關閉視頻設備。

2 視頻采集方案設計

2.1 基于QThread類設計

該方案提出的基礎是已經編寫好獨立的視頻采集處理程序,為將其運行結果在后續開發的Qt/Emedded界面上,使用QT中的QThread線程庫,可以實現非GUI和GUI程序的通信,使得非GUI到GUI的移植過程較為簡單,以下將闡述其過程。

1)非GUI到GUI程序移植

通過調用V4L2中API接口和Linux系統函數編寫視頻采集程序,由于采用非QT類庫,視頻顯示的實現是直接對framebuffer進行一些列的操作。關鍵代碼如下:

首先打開 framebuffer,查看其參數設置,其次,將framebuffer的內存地址映射到內存空間,最后通過調用fb_pixel函數將緩存中的每一個像素繪制好framebuffer上。在此過程中需要考慮framebuffer支持圖像格式和深度,本文使用USB攝像頭采集圖片格式是MJPEG格式,framebuffer最高支持16位深度圖像,因此需要將圖片解壓并將解壓后RGB24格式轉換成RGB565格式,才能在framebuffer上清晰的顯示。

2)QThread類框體設計

在Qt/Embedded程序中,繼承QThread類的同時繼承QFrame類,類名為screen,該類具有線程和QFrame類窗體部件的雙重特性,線程中run函數是上一章節中的代碼,代碼中需要注意圖像顯示大小和screen窗體大小保持一致的同時,需要設置screen的寬度和高度必須是16的整數倍,這樣可以保證圖像正常顯示,當主窗口界面按下play按鈕時表明調用該線程時,開始執行run函數,點擊close按鈕表明結束該線程,并關閉界面。

3)QThread類庫的編譯配置

在QT程序編譯配置線程庫libqte-mt.so.3.1.0。本文使用的QT的版本為qtopia-2.2.0-FriendlyARM,此版本相對較低不支持線程庫,在編譯時會出現錯誤提示cannot find-lqt-mt,此時需要在配置編譯環境的參數中添加-thread,具體配置如下:

2.2 基于QPainter類設計

1)方案描述

由QWidget類繼承的 screen,并重新構 paintEvent(QPaintEvent*event)函數。同時,使用QPushButton類創建play和close兩個按鈕,通過Qt的信號與槽機制,與screen窗體通信分別用于視頻顯示的開啟和關閉。在圖像實時顯示的過程中,該方案沒有采用以往的QTimer類實現,而采用while循環,既保證了圖像采集的連續性,又使得程序簡化。每處理一幀圖像就會調用screen窗體部件的paintEvent函數[3-5],重新顯示 screen中的圖像,達到實時顯示的效果。

2)關鍵偽代碼解析

while中每當調用repaint(FALSE)進行更新時,程序會自動調用paintEvent函數。經調試表明如果使用update(),顯示效果會出現閃爍。使用repaint(FALSE)時自動保存screen窗體上一次的圖像信息,能很好地解決閃爍的問題。本系統申請兩幀圖像的緩沖區,每次顯示一幀圖像之后要初始化全局變量ptcur值為0,這可避免采集幀的混亂,導致圖像不正常顯示。

由上文可知圖像是以MJPEG格式存放在緩存中,所以V4L2視頻處理中,先計算經攝像頭采集的每一幀圖像大小,在然后保存到同一個文件infd中,不同幀保存的內容不同,當while循環中調用paintEvent(QPaintEvent*)函數顯示不同幀的圖像。代碼如下:

這里直接調用pix.load(QString&filename)實現,沒有使用QImage類來繪圖的原因在于以MJPEG格式采集的圖像需要先解壓縮成RGB888,然后使用QImage類創建圖像空間,最后使用drawImage(QPoint&,QImage&)繪圖,步驟較為繁瑣。而QPainter類支持壓縮格式圖像文件的繪制,使得繪圖過程較為簡單快捷。

3 嵌入式視頻采集方案的實現

不同平臺Qt/Embedded編譯環境配置的不同,但大體都需要以下4個步驟:

1)安裝交叉編譯工具。需要ARM9的Linux編譯器去編譯工程并產生ARM9處理器的目標代碼;

2)交叉編譯Qt/Embedded庫。要使Qt/Embedded程序能在嵌入式系統中運行,則應將其用到的函數庫進行交叉編譯;

3)交叉編譯Qt/Embedded程序。將交叉編譯后的可執行文件放入嵌入式文件系統中;

4)發布Qt/Embedded應用到指定開發板。

FriendlyARM開發板將前3個步驟編寫到build腳本中,只需要運行build腳本便可將Qt程序生成ARM版本的可執行文件[6-7]。上述兩種方案的發布流程相同,本文以第二種方案為例講述將視頻采集GUI發布到嵌入式FriendlyARM開發板上的簡單流程。

為了發布到QPE(Qt PDA應用環境的簡稱),需要準備兩個文件,其一是ARM版本視頻采集GUI的可執行文件videocapture和啟動器文件videocapture.desktop,啟動器需要開發板支持的圖像格式的圖標,本文采用png格式的video.png圖片,代碼如下:

使用串口分別將可執行文件videocapture和啟動器文件videocapture.desktop下載到開發板opt/Qtopia/bin/和opt/Qtopia/Applications/目錄下,同時需要把video.png下載到/opt/Qtopia/pics目錄。其程序中所需的二進制庫文件在運行build腳本時已將所需的ARM版本的庫文件拷貝到開發板中,使用chmod+x videocature命令后重啟開發板,點擊video圖標,便可看到視頻采集的圖像。視頻采集GUI發布到嵌入式設備上,如圖2所示。

圖2 嵌入式設備上的視頻采集GUI

4 小結

對比以上兩種方案,當QT4.0以上版本支持線程庫情況下,方案一更為簡單,反之當QT版本較低時編譯線程庫配置的過程較為繁瑣,方案二更具優勢。實驗結果表明,與以往視頻采集顯示方案相比,以上兩種方案不僅保證了圖像的連續性,而且避免了顯示過程中的復雜性。兩種方案簡便可行,適用于手持式或便攜移動式圖像處理設備,以及安防監控、交通路口抓拍等應用。

[1]SCHIMEK M H.Video for Linux two API specification revision 0.24[EB/OL].[2012-04-20].http://v4l2spec.bytesex.org/v4l2spec/v4l2.pdf.

[2]陳亮.基于Video4Linux2的圖像采集程序設計[J].微計算機信息,2009,25(3):65-67.

[4]BLANCHETTE G,SUMMERFIELD M.C++GUI Qt3 編程[M].齊亮,譯.北京:北京航空航天大學出版社,2006.

[5]倪繼利.Qt及Linux操作系統窗口設計[M].北京:電子工業出版社,2006.

[6]王黎明,陳雙橋,閆曉玲,等.ARM9嵌入式系統開發與實踐[M].北京:北京航空航天大學出版社,2008.

[7]任善全,呂強,錢培德,等.一個基Qt/Embedded的嵌入式Linux應用程序的實現[J].計算機應用與軟件,2006,23(2):105-107.

[8]梅寬勤.基于Qt/Embedded的圖像用戶界面移植[D].上海:復旦大學,2007.

猜你喜歡
開發板調用線程
基于C#線程實驗探究
基于國產化環境的線程池模型研究與實現
核電項目物項調用管理的應用研究
LabWindows/CVI下基于ActiveX技術的Excel調用
淺談linux多線程協作
淺析單片機開發板的設計與制作
基于系統調用的惡意軟件檢測技術研究
ARM宣布mbed Enabled Freescale FRDM—K64F開發板通過微軟認證
Mouser為您呈上開發關鍵之STMicroelectronics Nucleo開發板
Arduino和Atmel發布Arduino Zero開發板
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合