您的位置:首页 > 编程语言 > Qt开发

Qt--windows平台上如何获取qml中Camera的数据

2016-09-20 15:54 351 查看
曾经写了一个博客:

我们为什么不习惯使用qml? 最后有一个悬念,到底如何在C++代码中获取qml中camera的数据呢?

QAbstractVideoFilter

The QAbstractVideoFilter class represents a filter that is applied to the video frames received by a VideoOutput type.

https://doc-snapshots.qt.io/qt5-dev/qabstractvideofilter.html#details

QVideoFilterRunnable

The QVideoFilterRunnable class represents the implementation of a filter that owns all graphics and computational resources, and performs the actual filtering or calculations.

上面两个类自己去看官方文档吧,翻译不好。

开始撸代码!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

写一个自己的类叫CameraFilter吧:

camerafilter.h

#ifndef CAMERAFILTER
#define CAMERAFILTER
#include <QVideoFilterRunnable>

class CameraFilter : public QAbstractVideoFilter
{
Q_OBJECT
public:
CameraFilter();
~CameraFilter();
QVideoFilterRunnable *createFilterRunnable();
private:
signals:
void finished(QObject *result);
void cameraFrameSignal(QVideoFrame);
public slots:

};

class CameraFilterRunnable : public QVideoFilterRunnable
{
public:
CameraFilterRunnable(CameraFilter* filter = NULL);
~CameraFilterRunnable();
QVideoFrame run(QVideoFrame *input, const QVideoSurfaceFormat &surfaceFormat, RunFlags flags);

private:
CameraFilter *m_filter;
};

#endif // CAMERAFILTER


camerafilter.cc

#include "camerafilter.h"
#include "qdebug.h"

CameraFilter::CameraFilter()
{

}

CameraFilter::~CameraFilter()
{

}

QVideoFilterRunnable *CameraFilter::createFilterRunnable()
{
return new CameraFilterRunnable(this);
}

CameraFilterRunnable::CameraFilterRunnable(CameraFilter* filter)
{
m_filter = filter;
}

CameraFilterRunnable::~CameraFilterRunnable()
{

}

QVideoFrame CameraFilterRunnable::run(QVideoFrame *input, const QVideoSurfaceFormat &surfaceFormat, RunFlags flags)
{
QVideoFrame cloneFrame(*input);

emit m_filter->cameraFrameSignal(cloneFrame);

return cloneFrame;
}


不要骂娘,上面的代码很简单的,其实官方的文档中也有类似的代码片段,不懂的自己看奥。

是通过:

emit m_filter->cameraFrameSignal(cloneFrame);


我们自己写一个slot,然后对Frame进行相应的处理!

接下来才是高潮!!!!

第一步、让qml中理解我们自己的类CameraFilter(Defining QML Types from C++) :

在C++中注册:

qmlRegisterType<CameraFilter>("CameraFilter", 1, 0, "CameraFilter");


在qml中导入:

import CameraFilter 1.0


第二步、在qml中干点大事儿:

Camera {
objectName: "CameraObject"
id: camera
imageProcessing.whiteBalanceMode: CameraImageProcessing.WhiteBalanceFlash
exposure {
exposureCompensation: -1.0
exposureMode: Camera.ExposurePortrait
}
captureMode: Camera.CaptureVideo
flash.mode: Camera.FlashRedEyeReduction
}

VideoOutput {
width: 160
height: 90
id: video_output
objectName: "VidelOutputObject"
source: camera
anchors.fill: parent
focus : visible // to receive focus and capture key events when visible
visible: false
filters: [filter]
fillMode: VideoOutput.PreserveAspectFit
}

CameraFilter {
objectName: "cameraFilterObject"
id: filter
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: