當前位置: 華文問答 > 數碼

打算在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