Qml视频创建从C++的图像流



经过10天的努力,我又回到了就任务提出一个基本问题的地步。

我有一个三层结构。

T1.一个名为"MPC"的ROS项目,它连续发布主题"video_image"帧(例如每秒30帧视频图像)。

T2.C++程序是作为Qt5.5项目开发的——有点像中间工人。

T3.Qml UI上的图像类型对象(Qt5.5 Quick)。

我想在T3 UI上显示MPC(T1)的帧中的视频剪辑。到目前为止,我肯定可以做的是从T1的帧中创建QImages,并且我可以在PWD上创建一个临时图像文件(例如,currentFrame.jpg)。

我应该怎么做才能将帧流作为源提供给UI视频播放器(也就是说,到目前为止,我仍然认为图像类型是视频播放器UI候选。)

我是否遵循了一种可能的解决方案?从这些图片帧流创建视频查看器提要的可行方法是什么?

这可以通过使用QQuickPaintedItem来完成。

在C++Qt部分中,您需要有一个继承QQuickPaintedItem:的类

//imagewriter.h

class imagewriter : public QQuickPaintedItem
{
    Q_OBJECT
public:
    imagewriter(QQuickItem *parent = 0);
    void paint(QPainter *painter);
    //the paint method is already implemented in QQuickPaintedItem
    //you just override it
    QImage image; //your image
};

//imagewriter.cpp

imagewriter::imagewriter(QQuickItem *parent): QQuickPaintedItem(parent)
{
}
void imagewriter::paint(QPainter *painter)
{
    painter->drawImage(QPoint(0,0),this->image);
    //this will simply draw the image in your qml UI !
}

现在,您只需要注册这个对象,就可以在qml文件中使用它:

//在主.cpp中:

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    qmlRegisterType<imagewriter>("mr.jb",1,0,"my_video_image");
    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    return app.exec();
}

//main.qml:

import mr.jb 1.0
ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

my_video_image {
            id : my_img_strm1
            anchors.centerin : parent
        }
}

my_video_image对象应该能够显示您的qimage,您所需要做的就是不断将该图像更新为您从ROS流中获得的最后一个图像,并且每次调用预定义的update()方法,以便自动重新触发负责在qml世界中绘制图像的绘制方法。我想你对T1部分没有问题。

在T2(C++类)中接收和构建图像可以通过多种方式完成(例如QUdp)。

最后一部分(T3)在上面的代码中进行了描述。

相关内容

  • 没有找到相关文章

最新更新