1)是的,这是可能的.我有两种方法来做到这一点.

使用QAbstractVideoFilter与QVideoFilterRunnable类(仅限QT 5.5),这是很好的.它们是专门针对这种情况开发的,并且非常易于使用.

网络上有几个很好的例子使用它:

这种方法的缺点就是说here就是说,在Android设备上,QVideoFrame指针没有原始的像素数据,而是具有需要读回的OpenGL纹理(我发布的第二个例子解决了这个),从而使这种方法对于IMHO实时目的不是很好.

我最终用来解决这个问题的是QVideoProbe课.

首先你必须命名你的QML相机的实例:

Camera {

id: camera

objectName: "qrCameraQML"

}

那么你从C方获得这个实例,就像:

QObject *qmlCamera = engine.rootObjects().at(0).findChild("qrCameraQML");

QML相机实例实际上具有一个QVariant元素,只能通过C进行访问,可以将其转换为QCamera *:

camera_ = qvariant_cast(qmlCamera->property("mediaObject"));

那么您所要做的就是将探头连接到实际处理QVideoFrames的插槽,然后将探头的源设置为QCamera * beforelly cast:

connect(&probe_,SIGNAL(videoFrameProbed(QVideoFrame)),this,SLOT(handleFrame(QVideoFrame)));

probe_.setSource(camera_);

在我的例子camera_和probe_只是:

QCamera *camera_;

QVideoProbe probe_;

对于我的经验,这种方法比使用qt视频过滤器类更快(对于Android平台),但它的缺点是您基本上只读取qml的视频输出,而AFAIK您将无法将后处理的视频帧发回QML.

如果您真的需要将已处理的图像发送回qml,我建议您尝试第一种方法,看看会发生什么.

2)不用Qt AFAIK,也许与OpenCv或其他一些lib.

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐