qt cpp结合VideoOutput显示摄像头数据

这篇具有很好参考价值的文章主要介绍了qt cpp结合VideoOutput显示摄像头数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

//mycamera.h
#ifndef MYCAMERA_H
#define MYCAMERA_H

#include <QObject>
#include <QAbstractVideoSurface>
#include <QVideoFrame>
#include <QVideoSurfaceFormat>
#include <QTimer>
#include <QDebug>

class MyCamera : public QObject
{
    Q_OBJECT

    Q_PROPERTY(QAbstractVideoSurface *videoSurface READ videoSurface WRITE setVideoSurface)

public:
    explicit MyCamera(QObject *parent = nullptr);

    QAbstractVideoSurface *videoSurface() const;
    /*!
     * \brief 可设置外部自定义QAbstractVideoSurface
     * \param surface
     */
    void setVideoSurface(QAbstractVideoSurface *surface);

    /*!
     * \brief 设置视频格式
     * \param width     视频宽
     * \param heigth    视频高
     * \param format    enum QVideoFrame::PixelFormat
     */
    void setFormat(int width, int heigth, QVideoFrame::PixelFormat format);

signals:
public slots:
    /*!
     * \brief 接收外部数据源,视频帧
     * \param frame
     */
    void onNewVideoContentReceived(const QVideoFrame &frame);
private:
    QAbstractVideoSurface *m_surface = nullptr;
    QVideoSurfaceFormat m_format;
};
#endif // MYCAMERA_H

#include "mycamera.h"

MyCamera::MyCamera(QObject *parent) : QObject(parent)
{
}

QAbstractVideoSurface *MyCamera::videoSurface() const
{
    return m_surface;
}

void MyCamera::setVideoSurface(QAbstractVideoSurface *surface)
{
    qDebug() << "setVideoSurface";
    if (m_surface && m_surface != surface  && m_surface->isActive()) {
        m_surface->stop();
    }

    m_surface = surface;

    if (m_surface && m_format.isValid())
    {
        m_format = m_surface->nearestFormat(m_format);
        m_surface->start(m_format);
    }
}

//设置当前帧的视频格式
void MyCamera::setFormat(int width, int heigth, QVideoFrame::PixelFormat format)
{
    QSize size(width, heigth);
    QVideoSurfaceFormat vsformat(size, format);
    m_format = vsformat;

    if (m_surface)
    {
        if (m_surface->isActive())
        {
            m_surface->stop();
        }
        m_format = m_surface->nearestFormat(m_format);
        m_surface->start(m_format);
    }
}

//添加已经封装好的视频帧
void MyCamera::onNewVideoContentReceived(const QVideoFrame &frame)
{
    //按照视频帧设置格式
    setFormat(frame.width(),frame.height(),QVideoFrame::Format_RGB32);//frame.pixelFormat()
    if (m_surface)
    {
        m_surface->present(frame);
    }
}

//myvideosurface.h
#ifndef MYVIDEOSURFACE_H
#define MYVIDEOSURFACE_H

#include <QObject>
#include <QAbstractVideoSurface>

#include <QDebug>

class MyVideoSurface : public QAbstractVideoSurface
{
    Q_OBJECT
public:
    explicit MyVideoSurface(QObject *parent = nullptr);

    virtual bool present(const QVideoFrame &frame);
    virtual QList<QVideoFrame::PixelFormat> supportedPixelFormats(QAbstractVideoBuffer::HandleType type = QAbstractVideoBuffer::NoHandle) const;

signals:
    void frameChanged(const QVideoFrame &frame);
};

#endif // MYVIDEOSURFACE_H

//myvideosurface.cpp
#include "myvideosurface.h"

MyVideoSurface::MyVideoSurface(QObject *)
{

}

bool MyVideoSurface::present(const QVideoFrame &frame)
{
    // 该函数会在摄像头拍摄到每一帧的图片后,自动调用
    //  图像处理函数,目标是把图片的格式从 QVideoFrame转换成 QPixmap(或者是能够轻易的转化成QPixmap的其他类)
#if 0
    QVideoFrame fm = frame;

    //拷贝构造,内部地址浅拷贝,视频帧依旧存放于不可读取的内存上,需要进行映射
    fm.map(QAbstractVideoBuffer::ReadOnly);
    //映射视频帧内容,映射到可访问的地址上
    //现在 QVideroFrame,视频帧数据可正常访问了
    /*QVideoFrame转换成 QPixmap ,我们要寻找转换的方式,一般思路上有2中在QVideoFrame里面,寻找: 返回值为 QPixmap,参数为空,函数名类似于 toPixmap 的方法或者在QVideoFrame的静态方法里面,寻找返回值为 QPixmap,参数为QVidoFrame的方法或者在 QPixmap的构造函数里面,寻找参数为QVideoFrame或者 QPixmap的静态方法里面,寻找返回值为 QPixmap,参数为QVideoFrame的方法经过这两轮的寻找,没找到可以直接将 QVideoFrame转换成 QPixmap的方法QT里面有一个万能的图像类,叫做 QImage因为一看构造函数,发现,构建一个QImage只需要图像的首地址,图像的宽度,图像的高度,(图像每一行的字节数),这些数据,任意图像类型,都可以轻易获取例如QVideoFrame就能够轻易的获取图像首地址:bits图像宽度:width图像高度:height图像每行字节数:bytesPerLine图像格式:需求格式为 QImage::Format_RGB32QImage::QImage(const uchar *data, int width, int height, Format format, QImageCleanupFunction cleanupFunction = Q_NULLPTR, void *cleanupInfo = Q_NULLPTR)
    */
    //QImage image(fm.bits(),fm.width(),fm.height(),QImage::Format_RGB32); 以下主要是图片格式的转化不同的形式,结果是一样的
    //QImage image(fm.bits(),fm.width(),fm.height(),fm.imageFormatFromPixelFormat(QVideoFrame::Format_RGB32));
    QImage image(fm.bits(),fm.width(),fm.height(),fm.imageFormatFromPixelFormat(fm.pixelFormat()));
    // 注意,摄像头拍摄到的图片,是上下左右相反的,所以我们还需要镜像一下
    image = image.mirrored(1);
    //表示横向镜像,纵向镜像是默认值
#endif
    emit frameChanged(frame);

    return true;
}

QList<QVideoFrame::PixelFormat> MyVideoSurface::supportedPixelFormats(QAbstractVideoBuffer::HandleType type) const
{
    Q_UNUSED(type);
    //  这个函数在  AbstractVideoSurface构造函数的时候,自动调用,目的是确认AbstractVideoSurface能够支持的像素格式,摄像头拍摄到的图片,他的像素格式是 RGB_3
    // 所以,我们要把RGB_32这个像素格式,添加到AbstractVideoSurface支持列表里面了
    // 当前函数,返回的就是AbstractVideoSurface所支持的像素格式的列表
    return QList<QVideoFrame::PixelFormat>() << QVideoFrame::Format_RGB32;// 此处的 operoatr<< 相遇 QList::append方法
}

//main.cpp
int main(int argc, char *argv[])
{
    QCameraInfo info = QCameraInfo::defaultCamera();
    QCamera *camera = new QCamera(info);
    MyVideoSurface* surface = new MyVideoSurface();

    //图像处理类
    camera->setViewfinder(surface);

    MyCamera *myCamer = new MyCamera;
    QObject::connect(surface, &MyVideoSurface::frameChanged, myCamer, &MyCamera::onNewVideoContentReceived);

    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    QmlLanguage qmlLanguage(app, engine);
    engine.rootContext()->setContextProperty("camera", myCamer);

    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    camera->start();

    return app.exec();
}

//main.qml
Window {
    id : root
    visible: true
    width: 640
    height: 480
    title: qsTr("cpp+camera")
        VideoOutput {
        id: videoOutput
        anchors.fill: parent
        source: camera
    }
}

运行效果如下:
qt cpp结合VideoOutput显示摄像头数据,qml,Qt,qt文章来源地址https://www.toymoban.com/news/detail-669231.html

到了这里,关于qt cpp结合VideoOutput显示摄像头数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • V4L2+QT+USB摄像头实时显示视频(Arm,Linux,window均适用)

    笔者自从学习了Framebuffer编程和V4L2编程之后,就想实现在LCD屏上显示实时视频 笔者学习过正点I.MX6U Linux C编程中的相关内容,然而原子的例程是针对OV5640摄像头写的,像素格式是RGB 然而USB摄像头大多支持MJPEG或者YUYV格式,如果要在屏幕上显示需要进行格式转换,而 转换像素

    2023年04月08日
    浏览(45)
  • 网页显示摄像头数据的方法---基于web video server

    1. 背景: 在ros系统中有发布摄像头的相关驱动rgb数据,需求端需要将rgb数据可以直接在网页上去显示。 问题解决: web_video_server功能包,相关链接: web_video_server - ROS Wiki 2. 下载,安装和编译: 由于我们项目使用的是ros2系统,所以下载web video server在ros2的分支,可以根据自己

    2024年02月13日
    浏览(36)
  • PC电脑实时接收树莓派摄像头图像数据并显示(Python实现)

    目录 一、任务概述 二、环境安装 三、实现 3.1 上位机端(PC服务器端) 3.2 树莓派端(客户请求端) 四、运行效果 最近在做一个树莓派自动驾驶小车,上位机使用windows10 PC电脑,下位机小车采用树莓派4B,树莓派上安装了USB免驱摄像头。上位机通过SSH来控制和分析树莓派小车

    2024年02月11日
    浏览(43)
  • Windows下使用QT+OpenCV完成人脸检测(获取摄像头的数据进行检测)

    Windows版本: Win10 X64 OpenCV版本: 2.4.13.6 QT版本: 5.12 OpenCV官网下载地址: ​ ​https://opencv.org​​​     目前官网OpenCV最新的版本是4.2.0 ,Windows版本的OpenCV在3.X版本后就不带X86的库,只有X64的库,如果需要X86的库,需要自己下载源码去重新编译。 由于我的QT软件在安装时没有安装

    2024年01月16日
    浏览(38)
  • 5. QT环境下使用OPenCV(基于TCP实现摄像头图像数据的多线程传输)

    1. 说明 通常情况下对于图像数据的采集可以放在后端进行,采集到的图像数据如果有需要可以通过通信将数据传输到前端进行显示,这其中需要使用到TCP数据传输协议和QT下的多线程开发技术。 QT当中主线程一般是界面层次的,在主线程中执行耗时较长的数据操作,会引起界

    2024年02月11日
    浏览(61)
  • Qt开发_调用OpenCV(4.x)完成人脸检测并绘制马赛克(摄像头实时数据)

    这个基于Qt和OpenCV的人脸检测和人脸打码项目是通过实时视频流中的人脸识别来保护隐私。 该项目目的是保护隐私并确保人脸数据安全。在某些情况下,使用实时视频流进行人脸检测和识别可能涉及对个人隐私的侵犯。通过在图像中打码人脸区域,可以避免未经许可的人脸出

    2024年02月06日
    浏览(54)
  • 基于Qt、PYTHON智能校园防御系统应用程序,实现了摄像头数据采集、人脸识别、口罩识别、 数据统计等功能

    完整项目地址:https://download.csdn.net/download/lijunhcn/88453470 项目结构 环境选型 语言:Python 操作系统:Windows 数据库:MySQL 窗口界面:PyQT API接口:百度AI接口,用以实现人脸登陆与注册 远程MySQL表结构 远程表结构sql脚本 项目背景 智能校园防御软件是实现了一款基于摄像头数据

    2024年02月03日
    浏览(50)
  • 【QT】QT调用电脑摄像头并拍照

    建议搭配视频食用: 【【QT】QT调用电脑摄像头并拍照】 https://www.bilibili.com/video/BV1pc411G7qy/?share_source=copy_webvd_source=c0d9dd4e64b88e4dbf93ac009c2010dc 一、在pro文件中添加‘multimedia multimediawidgets’ 二、在ui界面创建一个widget并改名为camera用于展示摄像头内容和pushbutton 用于拍照,并右键

    2024年02月12日
    浏览(41)
  • 毕设项目——基于Qt、PYTHON智能校园防御系统应用程序,实现了摄像头数据采集、人脸识别、口罩识别、 数据统计等功能

    完整项目地址:https://download.csdn.net/download/lijunhcn/88453470 项目结构 环境选型 语言:Python 操作系统:Windows 数据库:MySQL 窗口界面:PyQT API接口:百度AI接口,用以实现人脸登陆与注册 远程MySQL表结构 远程表结构sql脚本 项目背景 智能校园防御软件是实现了一款基于摄像头数据

    2024年02月04日
    浏览(41)
  • Android-WebRTC-实现摄像头显示

    EglBase是什么? 它提供了一个接口,用于在Android平台上创建和管理EGL(嵌入式系统图形库)上下文,以便在WebRTC中进行图像和视频的处理和渲染。 Capturer, Source, Track, Sink分别是什么? Capturer(采集器)是指用于采集音频或视频数据的设备或软件。它可以是麦克风、摄像头或其

    2024年02月15日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包