我正在挖掘示例 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
的框架。
我需要自己处理帧。
我的Qt6示例存储库处理相机帧以进行条形码检测。接收帧:
创建一个
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
。
在
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()
}