QT实现USB摄像头接入显示

news2024/11/17 14:42:07

一、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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2.Linux的例行性工 作(计划任务)

目录 1. 场景&#xff1a; 2. 单一执行的例行性任务--at&#xff08;一次性&#xff09; 2.1. 安装 2.2. at命令详解 2.2.1. 格式 2.2.2. 参数 2.2.3. 时间格式 2.2.4. 实验1 2.2.5. 实验2 2.2.6. 注意 2.2.7. at命令执行过程分析 2.2.8. 实验3 3. 循环执行的例行…

Elasticsearch:聊天机器人、人工智能和人力资源:电信公司和企业组织的成功组合

作者&#xff1a;来自 Elastic Jrgen Obermann, Piotr Kobziakowski 让我们来谈谈大型企业人力资源领域中一些很酷且改变游戏规则的东西&#xff1a;生成式 AI 和 Elastic Stack 的绝佳组合。 现在&#xff0c;想象一下大型电信公司的典型人力资源部门 — 他们正在处理一百万件…

mac/macos上编译electron源码

官方教程&#xff1a;Build Instructions | Electron 准备工作这里不写了&#xff0c;参考官方文档&#xff0c;还有上一篇windows编译electron electron源码下载及编译-CSDN博客 差不多步骤&#xff0c;直接来 网络记得使用魔法 下载编译步骤 0. 选择目录很重要&#xff0…

Emergent Abilities of Large Language Models 机翻mark

摘要 证明通过扩大语言模型可以可靠地提高性能和样本效率在广泛的下游任务。相反&#xff0c;本文讨论了我们称之为大型语言模型的新兴能力的一种不可预测的现象。我们认为如果一个能力不存在于较小的模型中&#xff0c;但在较大的模型中存在&#xff0c;则该能力就是新兴的。…

InforSuiteAS中创中间件windows环境部署

版本&#xff1a;InforSuiteAS_StE_V10.0.5.2.1 环境要求&#xff1a;Java环境 DK1.8版本&#xff0c; 内存2GB或以上 &#xff0c; 硬盘空间 10GB或以上&#xff0c; 监视器 图形界面安装需要256色以上&#xff0c;字符界面安装没有色彩要求 &#xff0c;浏览器 Microsoft …

el-tree基础的树形节点设置节点不能选中高亮出来,对已经选中的节点设置disabled,对当前节点刚选中后设置禁用disabled

一、 el-tree基础的树形节点设置节点不能选中高亮出来 需求 我们使用element-ui或者element-plus的时候会遇到树形控件的使用&#xff0c;我们使用树形控件会限制有的节点不让选中和高亮出来&#xff0c;这个时候需要我们做限制。在实现中我们发现了element-ui和element-plus…

SQL注入实战:绕过操作

一&#xff1a;绕过操作 1、常用绕过方式 大小写绕过&#xff1a; 通过修改关键字内字母大小写来绕过过滤措施。例如:AnD11Select* from ** oRdEr by 1 双写绕过&#xff1a; 使用双写绕过。因为在过滤过程中只进行了一次替换。就是将关键字替换为对应的空。 比如 union在…

使用Opencv-python库读取图像、本地视频和摄像头实时数据

使用Opencv-python库读取图像、本地视频和摄像头实时数据 Python中使用OpenCV读取图像、本地视频和摄像头数据很简单&#xff0c; 首先需要安装Python&#xff0c;然后安装Opencv-python库 pip install opencv-python然后在PyCharm或者VScode等IDE中输入对应的Python代码 一…

VS执行程序的时候运行上一次的程序。

这个问题我找了很久&#xff0c;最后自己随便按一下&#xff0c;成功了&#xff0c;分享给大家&#xff1a; 上面的代码是我测试的时候用的&#xff0c;随便写个c或者c代码就行&#xff0c;因为这个时候&#xff0c;我的代码已经更改了&#xff0c;它依然执行上一次的程序。我…

2024.1.27每日一题

LeetCode 最大合金数 2861. 最大合金数 - 力扣&#xff08;LeetCode&#xff09; 题目描述 假设你是一家合金制造公司的老板&#xff0c;你的公司使用多种金属来制造合金。现在共有 n 种不同类型的金属可以使用&#xff0c;并且你可以使用 k 台机器来制造合金。每台机器都需…

【项目日记(五)】第二层: 中心缓存的具体实现(上)

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:项目日记-高并发内存池⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你做项目   &#x1f51d;&#x1f51d; 开发环境: Visual Studio 2022 项目日…

sqli-lbs靶场搭建

目录 环境小皮源码下载 1.源码解压&#xff1a; 2.搭建网站 2.1点击创建网站 2.2修改sql-connections\db-creds.inc 2.3重新启动 3.访问你设置的域名 3.1点击启动数据库配置 3.2返回第一个页面&#xff08;开启题目&#xff09; sqlilbs靶场搭建 环境小皮源码下载 下载地址&am…

AWTK 开源串口屏开发(8) - 系统设置

AWTK 开源串口屏开发 - 系统设置 系统设置只是一个普通应用程序&#xff0c;不过它会用 默认模型 中一些内置的属性和命令&#xff0c;所以这里专门来介绍一下。 1. 功能 在这个例子会用到 默认模型 中一些下列内置的属性和命令&#xff1a; 内置属性 属性类型说明rtc_yea…

x-cmd pkg | httpx - 为 Python 设计的下一代 HTTP 客户端库

目录 简介首次用户功能特点进一步探索 简介 HTTPX 是一个为 Python 设计的下一代 HTTP 客户端库&#xff0c;由 Tom Christie 创建。它提供了同步和异步的 API&#xff0c;并支持 HTTP/1.1 和 HTTP/2 协议。与 Requests 库类似&#xff0c;但增加了对异步请求的支持和 HTTP/2 …

8通液体水位检测IC/液位检测芯片/抗干扰水位检测VK36W8I SOP16/QFN16L FAE支持

产品型号&#xff1a;VK36W8I 产品品牌&#xff1a;永嘉微电/VINKA 封装形式&#xff1a;SOP16/QFN16L 工程服务&#xff0c;技术支持&#xff01; 概述 VK36W8I具有8个触摸检测通道&#xff0c;可用来检测8个点的水位。该芯片具有较高的集成度&#xff0c;仅需极少的外部组…

【汇总】解决Spring-Web与Spring-WebFlux冲突

【汇总】解决Spring-Web与Spring-WebFlux冲突 问题发现问题解决问题一&#xff1a;The bean requestMappingHandlerMapping, defined in class path resource [org/springframework/web/reactive/config/DelegatingWebFluxConfiguration.class],问题二&#xff1a;The Java/XML…

Cesium渲染白膜数据

async DrawBaiMoFun2() {// tiles 矩阵变换let changePostion = (tileSet, tx, ty, tz, rx, ry, rz, scale, center) => {if (!center) return;const m = Cesium.Transforms.eastNorthUpToFixedFrame(center);const surface =center ||Cesium.Cartesian3.fromRadians(cartog…

.NET中的matplotlib平替,ScottPlot简单使用

文章目录 前言解决方案Python调用.NET 原生解决 ScottPlot找到文章ScottPlot Nuget安装简单代码测试代码跑不了5.0新版本测试 总结 前言 我之前在学OpenCV 三语言开发的时候&#xff0c;遇到了一个问题&#xff0c;怎么可视化的显示数据。Python有matplotlib&#xff0c;那么C…

el-table每一行的回调方法及假删除真隐藏

html数据 <template><el-table :data"tableData" :row-class-name"rowClassName">//每一行的回调方法<el-table-column fixed prop"date" label"日期" width"150"></el-table-column><el-table…

Unknown encoder ‘libmp3lame

环境&#xff1a; macos m1 &#xff0c; python3.10.x 背景 做视频切片&#xff0c; 使用moviepy 中VideoFileClip进行截取视频。 报错&#xff1a; Unknown encoder libmp3lameThe audio export failed because FFMPEG didnt find the specified codec for audio encoding …