QT实现USB摄像头接入显示

一、UVC协议简介

UVC全称是USB Video Class(USB视频类),是一种标准化的USB视频设备通信协议,它定义了摄像头与主机之间的数据传输协议和格式。

UVC协议的出现,解决了摄像头厂商之间互不兼容,以及摄像头应用开发与平台之间的散乱问题。

UVC标准是由USB-IF主导制定的,目前最新的版本是UVC 1.5,UVC的缺省设置类容易实现,不需要额外的驱动程序。

二、UVC协议不同版本对比

UVC协议的出现在2001年,目前已经发布了几个版本的标准协议:

| UVC版本 | 发布时间 | 支持最高分辨率 | 区别

UVC 1.0 | 2005年 | 800 x 600 | 第一个稳定版本

UVC 1.1 | 2008年 | 1920 x 1080 | 增加了更高分辨率的支持

UVC 1.5 | 2015年 | 4096 x 2304 | 增加了更高分辨率和HDR支持

从发布的时间、分辨率支持、HDR支持等角度来看,可以看出UVC协议在不断地演进和改进。

三.UVC协议的由来

UVC协议是早期微软(Microsoft)与另外几家主要设备厂商联合推出的为USB视频捕获设备定义的协议标准,目前是USBorg标准之一;USB摄像头即为标准的视频捕获设备。

四.支持的系统平台

Windows:自Windows XP SP2之后的版本都支持。

苹果Mac:Mac osX的10.4.3版本起加入UVC driver。

Linux:自Linux2.46之后增加了大量驱动到内核中,支持了UVC设备

PS3游戏主机: PlayStation 3在1.54版本开始支持UVC兼容

基于Linux内核的其它开源系统: 如派(Raspbian OS)乌图(Ubuntu)等,均使用Linux内核中的V4L2Videofor linux 2)来驱动USB摄像头。

五.QT实现接入USB摄像头

1.测试环境

   摄像头:笔记本自带摄像头

   QT环境:QT6.1

2.代码示例

(1)mainwindow.h

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

#include <QMainWindow>

#include <QImageCapture>

QT_BEGIN_NAMESPACE

namespace Ui { class MainWindow; }

QT_END_NAMESPACE

class MainWindow : public QMainWindow

{

    Q_OBJECT

public:

    MainWindow(QWidget *parent = nullptr);

    ~MainWindow();

private slots:

    void on_pushButton_clicked();

private:

    void do_image_saved(int id, const QString &fileName);

    void do_image_readyForCapture(bool ready);

    void do_image_captured(int id, const QImage &preview);

    Ui::MainWindow *ui;

    QImageCapture *imageCapture;

};

#endif // MAINWINDOW_H

(2)mainwindow.cpp

#include "mainwindow.h"

#include "ui_mainwindow.h"

#include <QCameraDevice>

#include <QMediaDevices>

#include <QMediaCaptureSession>

#include <QVideoWidget>

#include <QVideoSink>

#include <QtMultimedia>

#include <QImageCapture>

#include <QDebug>

MainWindow::MainWindow(QWidget *parent)

    : QMainWindow(parent)

    , ui(new Ui::MainWindow)

{

    ui->setupUi(this);

    QCameraDevice  defaultCameraDevice= QMediaDevices::defaultVideoInput();

    if (defaultCameraDevice.isNull())

    {

        return;

    }

    QCamera *m_camera = new QCamera(this);        //摄像头

    QMediaCaptureSession *captureSession = new QMediaCaptureSession(this);

    imageCapture = new QImageCapture(this);

    m_camera->setCameraDevice(defaultCameraDevice);

    captureSession->setImageCapture(imageCapture);

    captureSession->setCamera(m_camera);        //为session设置摄像

    captureSession->setVideoOutput(ui->widgetV);

    connect(imageCapture,&QImageCapture::imageCaptured,

            this,&MainWindow::do_image_captured);

    m_camera->start();

}

MainWindow::~MainWindow()

{

    delete ui;

}

void MainWindow::on_pushButton_clicked()

{

    QDir dir;

    //没有photograph文件夹则创建

    if(dir.exists("./photograph") == false)

    {

        dir.mkpath("./photograph");

    }

    //使用系统时间来命名图片的名称,时间是唯一的,图片名也是唯一的

    QDateTime dateTime(QDateTime::currentDateTime());

    QString time = dateTime.toString("yyyy-MM-dd-hh-mm-ss");

    //创建图片保存路径名

    QString filename = QDir::currentPath();     //获得当前路径

    filename += "/photograph/photo_";

    filename += QString("%1.jpg").arg(time);

   // imageCapture->capture();        //拍照,不存储,会显示到label里面

    imageCapture->captureToFile(filename);      //截图存储到文件夹内

}

void MainWindow::do_image_captured(int id, const QImage &preview)

{//与 imageCaptured()信号关联

    QImage scaledImage = preview.scaledToWidth(ui->widgetV->width());

    ui->label->setPixmap(QPixmap::fromImage(scaledImage));

}

3.测试结果

(1)视频显示

(2)视频+抓拍截图显示

(3)抓拍截图存储到文件夹内

4.完整工程代码下载:

https://download.csdn.net/download/xieliru/88712985?spm=1001.2014.3001.5503

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/354082.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

win10通过ssh链接deepin23并开启x11转发

前提 主机环境&#xff1a;win10 lstc 虚拟机环境&#xff1a;deepin23beta2 终端&#xff1a;tabby x11服务器: vcxsrv 安装ssh sudo apt install ssh开启root登录(看你需求&#xff09; 首先你要给root账号设置密码 sudo passwd root修改配置文件 sudo vim /etc/ssh/ss…

MongoDB本地部署并结合内网穿透实现公网访问本地数据库

文章目录 前言1. 安装数据库2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射2.3 测试随机公网地址远程连接 3. 配置固定TCP端口地址3.1 保留一个固定的公网TCP端口地址3.2 配置固定公网TCP端口地址3.3 测试固定地址公网远程访问 4. 结语 前言 MongoDB是一个基于分布式文件…

Linux-ROS学习之旅-话题编程(二)

##承接上一篇文章的知识&#xff0c;有下面的实例操作 通过代码新生一个海龟&#xff0c;放置在(5,5)点&#xff0c;命名为turtle2&#xff0c;通过代码订阅turtle2的实时位置并打印在终端&#xff0c;控制turtle2实现旋转运动 步骤&#xff1a; 1.创建一个工作空间和一个功…

【GitHub项目推荐--30 天学会XXX(HTML/React/Python/JavaScript)】【转载】

30 天学会 React 这个项目是《30 天 React 挑战》&#xff0c;是在 30 天内学习 React 的分步指南。它需要你学习 React 之前具备 HTML、CSS 和 JavaScript 知识储备。 除了 30 天学会 React&#xff0c;开发者还发布过 30 天学会 JavaScript 等项目。 开源地址&#xff1a;…

MySQL数据操纵语言DML

MySQL数据操纵语言DML(SELECT,UPDATE,INSERT INTO,DELETE) 目录 MySQL数据操纵语言DML(SELECT,UPDATE,INSERT INTO,DELETE)DML关键字数据操纵语言DML1.查表2.插入数据3.更新数据4.删除数据 DML关键字 DML关键字含义SELECT从数据库中检索数据INSERT INTO向数据库表中插入新的行…

什么是协方差矩阵?

协方差矩阵&#xff08;Covariance Matrix&#xff09;是一个用于衡量多个变量之间相互关系的工具&#xff0c;在统计学和数据分析领域中非常重要。这个矩阵展现了每一对变量之间的协方差。协方差是衡量两个变量如何一起变化的度量&#xff1b;如果两个变量的协方差是正的&…

基于springboot+vue的美容院管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 研究背景…

运维SRE-01 目录结构体系、find

1. Linux目录结构体系 Linux 核心目录的核心文件概述 1&#xff09; /etc下面 a) /etc/hosts 主机ip地址与域名(主机名)对应关系 b&#xff09; /etc/hostname 主机名 c) /etc/sysconfig/network-scripts/ifcfg-ens33或ifcfg-eth0 Linux网卡配置文件 d&#xff09;了解 /etc/i…

12.6管道流(血干JAVA系列)

管道流 12.6管道流基础概念【例12.34】验证管道流 12.6管道流 基础概念 管道流的主要作用是可以进行两个线程间的通信&#xff0c;如图12-9所示&#xff0c;分为管道输出流(PipedOutputStream)、管道输入流(PipedlnputStream)。如果要想进行管道输出&#xff0c;则必须把输出…

基于蛙跳优化的神经网络数据预测matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 通过蛙跳优化算法&#xff0c;优化神经网络的权值参数&#xff0c;然后使用优化后的神经网络模型对数据进行预测&#xff0c;输出预测曲线。 2.测试软件版本以及…

2024 年 eBPF 和网络趋势预测

本文地址&#xff1a;2024 年 eBPF 和网络趋势预测 | 深入浅出 eBPF 1. eBPF 1.1 eBPF 将继续呈指数增长1.2 eBPF 应用市场1.3 eBPF 在手机中得到更广泛的应用1.4 eBPF 滥用带来的风险2. 可观测 2.1 最受欢迎的可观测性2.2 降低可观测性开销2.3 上下文感知的 Kubernetes 工作负…

多数据源组件dynamic-datasource使用总结

简介 dynamic-datasource-spring-boot-starter 是一个基于springboot的快速集成多数据源的启动器。 其支持 Jdk 1.7, SpringBoot 1.5.x 2.x.x 3.x.x。 特性 支持 数据源分组 &#xff0c;适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。支持数据库敏感配置信息 加密…

matlab基本操作

目录 1 清空workspace 2 清空命令行窗口 3 求字符的ASCII码 4 矩阵的表示 5 矩阵的转置 6 按列输出 7 求逆矩阵 8 创建零矩阵 9 生成随机数 10 生成空数组 11 生成单位矩阵 12 生成幻方矩阵 13 结构体 14 重复 15 点乘与叉乘 16 寻找符合条件的元素…

Hadoop, HIve, Spark关系简述

大数据∈数据管理系统的范畴 数据管理系统&#xff1a; 数据怎么存&#xff1f;数据怎么算&#xff1f; 单机数据管理时代下&#xff0c; 数据处理的任务&#xff1a;IO密集型&#xff1b; 数据存不下&#xff1f; HDFS用于存放多机器的数据并提供相关Api接口。 HDFS中引入了…

146基于matlab的齿轮非线性动力学

基于matlab的齿轮非线性动力学&#xff0c;绘出系统状态变量随参数变化分岔图&#xff0c;绘图参数对应的系统各周期及混沌状态的时间历程图、相轨迹图、Poincare映射图&#xff0c;程序已调通&#xff0c;可直接运行。 146 matlab 齿轮非线性动力学 相图 (xiaohongshu.com)

【前端web入门第二天】01 html语法实现列表与表格_合并单元格

html语法实现列表与表格 文章目录: 1.列表 1.1 无序列表1.2 有序列表1.3 定义列表 2.表格 2.1 表格基本结构2.2 表格结构标签2.3 合并单元格 写在最前,第二天学习目标: 列表 表格 表单 元素为嵌套关系 1.列表 作用:布局内容排列整齐的区域。 列表分类:无序列表、有序列表…

【leetcode题解C++】101.对称二叉树 and 111.二叉树的最小深度 and 222.完全二叉树的节点个数 and 110.平衡二叉树

101. 对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false 思路&#xff1a…

2023启示录|虚拟人这一年

图片&#xff5c;《银翼杀手 2049》剧照 作者丨程心 编辑丨罗辑 2023 年&#xff0c;大模型 “救活” 了很多行业&#xff0c;其中最为反转的&#xff0c;就是把虚拟数字人&#xff08;以下简称虚拟人&#xff09;从活死人墓里拉了出来。 还没开年&#xff0c;在 2022 年火…

python_ACM模式《剑指offer刷题》链表3

题目&#xff1a; 注意&#xff1a; 剑指offer上对这道题目的描述是给定的删除节点是节点指针。这表明这道题可以用时间复杂度为O(1)的方式解决。 而leetcode上对类似本题的描述是&#xff1a; 给定删除节点是节点值&#xff0c;这决定了本题时间复杂度必然至少为O(N)。因为…

PINN物理信息网络 | 全局自适应物理信息神经网络SA-PINN

概述 本文提出的自适应加权方法在于权重适用于不同损失组件中的个别训练点,而不是整个损失组件。之前的方法可以被看作是这个方法的一个特例,当所有针对特定损失组件的自适应权重同时更新时。在之前的方法中,独立开发的极小极大加权方案[16]与SA-PINNs最为相近,因为它也通过…