【问题标题】:Display QML rectangles on video stream based on object recognition基于对象识别在视频流上显示 QML 矩形
【发布时间】:2022-01-01 08:38:24
【问题描述】:

我有一个视频流,如 Qt Video Overview 中所述,使用 MyVideoProducer 机制。分析了源图像,我有一个连接组件列表(x、y、宽度、高度),我想要在视频上叠加矩形。

我可以通过向 QML 发送一个矩形坐标列表并让它放置矩形来做到这一点,还是我需要创建自己的叠加图像?

我查看了 QtQuick 粒子系统,但它似乎不适合。其他问题有由 Qt/Qml 管理的矩形布局,但我需要根据视觉管道在 C++ 中确定并发送到 QML 前端的坐标来放置矩形。它们将过时/与视频帧相关。

an example,但叠加层与视频无关。我想我需要一个与onNewVideoContentReceived() 同步的覆盖。 QML 将无法确定如何轻松地使任何矩形列表与视频保持同步。

【问题讨论】:

  • 最好考虑 Qt3D。 doc.qt.io/qt-5/qt3drender-geometry.html 但是这个主题不适合这里的几行文字来描述和适用于您的问题。
  • 听起来你可以在 C++ 端生成模型,然后在 QML 端使用中继器或其他东西来生成矩形。
  • @artlessnoise 无论如何,经过一些预处理后它最终会出现在 GPU 中。场景的确切变换是什么以及您的形状是否有任何高度只是一个细节。除此之外,您可以考虑doc.qt.io/qt-5/qquickwindow.html#afterRendering 和类似的信号用于与图形输出同步。我确实使用 after 和 beforeRendering 插槽渲染我自己的编程绘图,以便在正确的时间将其插入那里。

标签: qt computer-vision qml qt5


【解决方案1】:

我刚刚修改了原始缓冲区的创建,从相机去拜耳,以自己绘制 RGBA 格式的矩形。它避免了视频帧与对象位置数据的同步问题。我没有使用 alpha 而只是替换像素。对于我的内容,框的数量与视频区域的对比并不大。对于 alpha 矩形和大量对象,使用 GPU 可能更有效。事实上,您可以使用固定大小的正方形而不是 CCL 有界区域,使用 GPU 可能会明显更快。

QML 解决方案会更优雅,但此解决方案有效。


可选的选项是QVideoFrame::setMetaData,这可以将CCL QRect列表绑定到框架,这样关联就清晰了,绑定到框架了。 MyVideoProducer 的方法 onNewVideoContentReceived() 可以从 C++ 渲染矩形。

另一个选项是QAbstractVideoFilter,它将修改原始缓冲区以向呈现的图像添加额外的数据。这很容易通过 QML 前端启用/禁用。

所有解决方案都依赖于 C++,因此在 QML 中更改颜色等并不容易。例如,如果对象具有可识别的属性,例如“男性”、“女性”、“猫”、“车辆”等,QML 可以适当地更新突出显示并维护对象类型的统计。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    相关资源
    最近更新 更多