在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結合起來,用於圖像采集處理。