QT6 使用 QVideoSink 和 QCamera 来处理每一帧

问题描述 投票:0回答:2

我正在挖掘示例 qt6 6.2.2 camera.pro 并找到下一行代码:

m_captureSession.setVideoOutput(ui->viewfinder);

这就是outoutframe到ui的方式。

我知道

QVideoSinc
用于抓取每一帧并处理它。

我已将此行替换为

m_captureSession.setVideoSink(&videoSink);

其中 videoSinc 定义为我的类:

class MyVideoSinc : public QVideoSink
{
    Q_OBJECT
public:
    bool videoframeReady=false;
    MyVideoSinc()
    {
        connect(this, &QVideoSink::videoFrameChanged, this, &MyVideoSinc::hvideoFrameChanged);
    }
public Q_SLOTS:

    void hvideoFrameChanged(const QVideoFrame &frame)
    {
        videoframeReady=true;
    }
};

hvideoFrameChanged 在 Windows 构建中为每个帧引发,但在 Android 应用程序中仅引发一次。

这里出了什么问题。如何在QT6中从QCamera抓取并处理帧?我不想显示带有

ui->viewfinder
的框架。 我需要自己处理帧。

camera frames qt6
2个回答
1
投票

我制作了一个小型存储库来展示如何在 Qt6 中使用

QVideoSink
处理帧。 看看吧。

我在自己的应用程序中使用了这种方法,我在 Android 9 上进行了测试,一切都非常有效。

但要小心,在 Linux 上,从启动到启动 FPS 可能相差很大,有时 FPS 是正常的,但很多时候 FPS 非常非常低 - 只有 1 FPS。这是 Qt6 的一个 bug,6.2.3 仍然受影响。 看看这个错误。


0
投票

我的Qt6示例存储库处理相机帧以进行条形码检测。接收帧:

  1. 创建一个

    FrameProcessor
    课程。

    FrameProcessor.h

    #include <QObject>
    #include <QVideoSink>
    #include <QVideoFrame>
    class FrameProcessor : public QObject
    {
        Q_OBJECT
        Q_PROPERTY(QVideoSink *videoSink READ videoSink WRITE setVideoSink NOTIFY videoSinkChanged)
    
        pulic:
           QVideoSink *videoSink() const;
           void setVideoSink(QVideoSink *sink);
    
        signals:
            void videoSinkChanged();
    
        private slots:
            void processFrame(const QVideoFrame &frame);
    
        private:
            QVideoSink *m_videoSink;
    }
    

    帧处理器.cpp

    #include "FrameProcessor.h"
    
    QVideoSink *FrameProcessor::videoSink() const
    {
        return m_videoSink;
    }
    
    void FrameProcessor::setVideoSink(QVideoSink *sink)
    {
        if (m_videoSink != sink)
        {
            m_videoSink = sink;
            connect(m_videoSink, &QVideoSink::videoFrameChanged, this, &FrameProcessor::processFrame);
        }
    }
    
    void FrameProcessor::processFrame(const QVideoFrame &frame)
    {
            // image processing
    }
    

    使用

    connect
    videoFrameChanged
    事件与
    processFrame
    绑定以接收
    QVideoFrame

  2. Main.qml
    文件中,添加以下代码来启动摄像头并设置videoSink:

    import QtQuick
    import QtMultimedia
    
    Window {
        width: 640
        height: 480
        visible: true
        title: qsTr("Hello World")
    
        FrameProcessor {
            id: frameProcessor
            videoSink: viewfinder.videoSink
        }
    
        CaptureSession {
            id: captureSession
            camera: Camera {
                id: camera
            }
            videoOutput: viewfinder
        }
    
        VideoOutput {
            id: viewfinder
            visible: true
            anchors.fill: parent
        }
    
        Component.onCompleted: camera.start()
    }
    
    
© www.soinside.com 2019 - 2024. All rights reserved.