当前位置: 华文问答 > 数码

打算在Windows 做一个图像识别,摄像头实时采集,对两帧图像对比。界面用什么哪个好MFC?qt?

2017-07-03数码

一、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/downl oad/xieliru/88712985?spm=1001.2014.3001.5503