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

相关推荐
VBA63372 分钟前
VBA数据库解决方案第十五讲:Recordset集合中单个数据的精确处理
开发语言
wrx繁星点点6 分钟前
事务的四大特性(ACID)
java·开发语言·数据库
不写八个12 分钟前
Python办公自动化教程(005):Word添加段落
开发语言·python·word
HEX9CF17 分钟前
【CTF Web】Pikachu xss之href输出 Writeup(GET请求+反射型XSS+javascript:伪协议绕过)
开发语言·前端·javascript·安全·网络安全·ecmascript·xss
赵荏苒42 分钟前
Python小白之Pandas1
开发语言·python
丶Darling.43 分钟前
代码随想录 | Day26 | 二叉树:二叉搜索树中的插入操作&&删除二叉搜索树中的节点&&修剪二叉搜索树
开发语言·数据结构·c++·笔记·学习·算法
人生の三重奏1 小时前
前端——js补充
开发语言·前端·javascript
平凡的小码农1 小时前
JAVA实现大写金额转小写金额
java·开发语言
yttandb1 小时前
重生到现代之从零开始的C语言生活》—— 内存的存储
c语言·开发语言·生活
我明天再来学Web渗透2 小时前
【hot100-java】【二叉树的层序遍历】
java·开发语言·数据库·sql·算法·排序算法