QT中VideoProbe的簡介和實現


一、遇到問題
       在Android機上使用QT進行圖像處理程序設計的時候,遇到的一個比較明顯的問題就是圖片采集的問題----攝像頭獲得是實時的視頻,如果我們想從中動態地截獲圖片,並且轉換成Mat的格式,那么僅僅是靜態的imagecapturee就無法完成,必須要依靠 VideoProbe機制。
二、基本情況
我們參考QT的相關文檔:
QVideoProbe class允許你監控正在播放或者記錄的視頻
它的頭文件
# include  <QVideoProbe >
qmake :    QT  += multimedia
Inherits :    QObject
成員函數
Public Functions
    QVideoProbe(QObject  *parent  = Q_NULLPTR)
     ~QVideoProbe()
bool     isActive()  const
bool     setSource(QMediaObject  *source)
bool     setSource(QMediaRecorder  *mediaRecorder)

可以發出兩個信號,其中比較重要的是后面一個videoFrameProbed
void     flush()
void     videoFrameProbed( const QVideoFrame  &frame)

  基本例子,比如打開視頻:

QMediaPlayer  *player  =  new QMediaPlayer();
QVideoProbe  *probe  =  new QVideoProbe;
connect(probe, SIGNAL(videoFrameProbed(QVideoFrame)),  this, SLOT(processFrame(QVideoFrame)));
probe - >setSource(player);  // Returns true, hopefully.
player - >setVideoOutput(myVideoSurface);
player - >setMedia(QUrl : :fromLocalFile( "observation.mp4"));
player - >play();  // Start receiving frames as they get presented to myVideoSurface

同樣可以打開QCamera

三、編寫代碼
它的主要結構(流程)是這樣的,我們創建QMl的代碼:
在qml中生成camera和probe對象。這個probe對象是對原始QVideoProbe的重新封裝,原始的QVideoProbe在
看的更清楚一些

probe對象中,首先通過調用攝像頭,將videoframeprobed信號和processframe槽對應起來。這樣一旦有視頻probed則自動觸發processframe。
注意在這行代碼中
_camera  = qvariant_cast <QCamera * >(_qmlCamera - >property( "mediaObject"));
是c++調用qml對象的方法,是將qmlcamera強轉為qcamera的一句
videoFrameProbed是自動觸發的信號,其結果將被 processFrame截獲並處理。信號和槽的方式是可以直接帶變量傳遞的。
在process中,最主要的步驟就是QVideoFrame格式和Mat格式的轉換。這個目前還沒有非常好的方法,只能在NoHandle模式下進行灰度處理。但是對於圖像處理來說已經能夠解決一些問題。需要注意的是,最后采集的結果,通過
也就是
的模式將其直接推送到qml這里

四、小結
probe這種模式還是比較簡單的,而且經過封裝后能夠很好地和OpenCV結合起來,用於圖像采集處理。






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM