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