欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Qt使用QCamera實(shí)現(xiàn)切換相機(jī),分辨率和圖像捕獲功能

 更新時(shí)間:2023年04月04日 14:24:59   作者:Star_ID  
這篇文章主要為大家介紹了如何利用Qt中的相機(jī)類QCamera,取景器類QCameraViewfinder,圖像捕獲類QCameraImageCapture實(shí)現(xiàn)切換相機(jī)、分辨率和圖像捕獲功能,需要的可以了解一下

demo中主要涉及的Qt類有:相機(jī)類QCamera,取景器類QCameraViewfinder,圖像捕獲類QCameraImageCapture,因此添加模塊multimedia multimediawidgets。

QT += core gui multimedia multimediawidgets

在widget.h中添加相關(guān)類聲明:

class QCamera;
class QCameraViewfinder;
class QCameraImageCapture;
class QCameraInfo;
class QCameraViewfinderSettings;

在類Widget中添加私有變量:

QCamera *camera;                   //相機(jī)
QCameraViewfinder *viewfinder;     //取景器
QCameraImageCapture *imageCapture; //圖像捕獲
QList<QCameraInfo> cameras;        //相機(jī)列表
QList<QSize> mResSize = {};        //分辨率列表

在widget.cpp中添加頭文件:

#include <QCamera>
#include <QCameraInfo>
#include <QCameraViewfinder>
#include <QCameraImageCapture>
#include <QFileDialog>
#include <QList>
#include <QDebug>

在widget.cpp的構(gòu)造函數(shù)中添加代碼:

先設(shè)置下窗口名稱及大小

setWindowTitle("Camera");
setFixedSize(600,400);

接著獲取所有相機(jī)列表并選擇一個(gè)相機(jī)初始化

cameras = QCameraInfo::availableCameras();   //獲取所有相機(jī)的列表
//qDebug() << "this is camera: ";
if (cameras.count() > 0) {
    for(const QCameraInfo &cameraInfo:cameras) {
        qDebug() << cameraInfo.description();
    }
    camera = new QCamera(cameras.at(0));     //初始化實(shí)例化一個(gè)相機(jī)對(duì)象
}

實(shí)例化取景器類,取景器本質(zhì)是一個(gè)窗口類,若不將當(dāng)前窗口設(shè)為父對(duì)象,則可以另起一個(gè)窗口顯示。將當(dāng)前窗口設(shè)為父對(duì)象后,視頻畫面便在當(dāng)前窗口顯示。

//設(shè)置取景器
viewfinder = new QCameraViewfinder(this);
camera->setViewfinder(viewfinder);
viewfinder->resize(600,350);                 //設(shè)置取景器顯示大小
//viewfinder->show();

實(shí)例化一個(gè)圖像捕獲類,并開啟相機(jī)

imageCapture = new QCameraImageCapture(camera);
camera->start();                             //開啟相機(jī)

設(shè)置默認(rèn)攝像頭的分辨率及幀率。注意:幀率一定要與攝像頭匹配,否則不會(huì)顯示畫面。

//設(shè)置默認(rèn)攝像頭參數(shù)
QCameraViewfinderSettings set;
set.setResolution(640, 480);                 //設(shè)置顯示分辨率
set.setMaximumFrameRate(25);                 //設(shè)置幀率
camera->setViewfinderSettings(set);

設(shè)置兩個(gè)下拉框部件的初始化

//添加初始化的相機(jī)選項(xiàng)
for(const QCameraInfo &cameraInfo:cameras) {
    qDebug() << "CameraInfo:" << cameraInfo;
    ui->cameraSel->addItem(cameraInfo.description());
}
ui->cameraSel->setCurrentIndex(0);

//添加初始化相機(jī)的分辨率選項(xiàng)
mResSize = camera->supportedViewfinderResolutions();
//qDebug() << "mResSize = " << mResSize;
for (const QSize &msize:mResSize) {
       qDebug() << msize; //攝像頭支持分辨率打印
       ui->resolutionSel->addItem(QString::number(msize.width(), 10) + "*" + QString::number(msize.height(), 10));
}
ui->resolutionSel->setCurrentIndex(0);

調(diào)整下widget.ui的內(nèi)容,添加兩個(gè)下拉框及一個(gè)按鈕

編寫信號(hào)槽連接

首先是選擇攝影機(jī),先釋放之前的內(nèi)存,再將camera指向新的。選擇新的相機(jī)意味著分辨率選項(xiàng)也會(huì)變化,因此需要?jiǎng)h除分辨率下拉框中前相機(jī)的所有分辨率選項(xiàng),再添加新相機(jī)的所有分辨率選項(xiàng)。

connect(ui->cameraSel, QOverload<int>::of(&QComboBox::activated), [=](int index){
    //qDebug() << "Index" << ui->cameraSel->currentIndex() << ": " << ui->cameraSel->currentText();
    camera->stop();
    delete camera;
    camera = new QCamera(cameras[index]);                //camera指向指定的攝像頭
    camera->setCaptureMode(QCamera::CaptureStillImage);  //設(shè)定捕獲模式
    camera->setViewfinder(viewfinder);                   //設(shè)置取景器
    camera->start();

    //刪除前相機(jī)的所有分辨率內(nèi)容
    for (int i = 0; i < mResSize.size(); i++) {
           ui->resolutionSel->removeItem(0);
    }

    //添加新相機(jī)的所有分辨率
    mResSize.clear();
    //qDebug() << "now mResSize = " << mResSize;
    mResSize = camera->supportedViewfinderResolutions();
    for (const QSize &msize:mResSize) {
           qDebug() << msize; //攝像頭支持分辨率打印
           ui->resolutionSel->addItem(QString::number(msize.width(), 10) + "*" + QString::number(msize.height(), 10));
    }
    ui->resolutionSel->setCurrentIndex(0);
});

選擇分辨率

connect(ui->resolutionSel, QOverload<int>::of(&QComboBox::activated), [=](int index){
    //qDebug() << "Index" << ui->resolutionSel->currentIndex() << ": " << ui->resolutionSel->currentText();
    //qDebug() << "mResSize:" << mResSize[index];
    //重新設(shè)置攝像頭參數(shù)
    QCameraViewfinderSettings reset;
    reset.setResolution(mResSize[index]);
    camera->setViewfinderSettings(reset);
});

截圖按鈕

connect(ui->screenShot, &QPushButton::clicked, [=](){
    camera->setCaptureMode(QCamera::CaptureStillImage);
    delete imageCapture;
    imageCapture = new QCameraImageCapture(camera);
    QString fileName = QFileDialog::getSaveFileName();
    camera->searchAndLock();
    imageCapture->capture(fileName);
    camera->unlock();
});

最終效果

附完整代碼

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class QCamera;
class QCameraViewfinder;
class QCameraImageCapture;
class QCameraInfo;
class QCameraViewfinderSettings;

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;
    QCamera *camera;                   //相機(jī)
    QCameraViewfinder *viewfinder;     //取景器
    QCameraImageCapture *imageCapture; //圖像捕獲
    QList<QCameraInfo> cameras;        //相機(jī)列表
    QList<QSize> mResSize = {};        //分辨率列表
    //QCameraViewfinderSettings *set;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QCamera>
#include <QCameraInfo>
#include <QCameraViewfinder>
#include <QCameraImageCapture>
#include <QFileDialog>
#include <QList>
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    setWindowTitle("Camera");
    setFixedSize(600,400);

    cameras = QCameraInfo::availableCameras();   //獲取所有相機(jī)的列表
    //qDebug() << "this is camera: ";
    if (cameras.count() > 0) {
        for(const QCameraInfo &cameraInfo:cameras) {
            qDebug() << cameraInfo.description();
        }
        camera = new QCamera(cameras.at(0));     //初始化實(shí)例化一個(gè)相機(jī)對(duì)象
    }

    //設(shè)置取景器
    viewfinder = new QCameraViewfinder(this);
    camera->setViewfinder(viewfinder);
    viewfinder->resize(600,350);                 //設(shè)置取景器顯示大小
    //viewfinder->show();

    imageCapture = new QCameraImageCapture(camera);
    camera->start();                             //開啟相機(jī)

    //設(shè)置默認(rèn)攝像頭參數(shù)
    QCameraViewfinderSettings set;
    set.setResolution(640, 480);                 //設(shè)置顯示分辨率
    set.setMaximumFrameRate(25);                 //設(shè)置幀率
    camera->setViewfinderSettings(set);

    //添加初始化的相機(jī)選項(xiàng)
    for(const QCameraInfo &cameraInfo:cameras) {
        qDebug() << "CameraInfo:" << cameraInfo;
        ui->cameraSel->addItem(cameraInfo.description());
    }
    ui->cameraSel->setCurrentIndex(0);

    //添加初始化相機(jī)的分辨率選項(xiàng)
    mResSize = camera->supportedViewfinderResolutions();
    //qDebug() << "mResSize = " << mResSize;
    for (const QSize &msize:mResSize) {
           qDebug() << msize; //攝像頭支持分辨率打印
           ui->resolutionSel->addItem(QString::number(msize.width(), 10) + "*" + QString::number(msize.height(), 10));
    }
    ui->resolutionSel->setCurrentIndex(0);

    //信號(hào)槽連接
    connect(ui->cameraSel, QOverload<int>::of(&QComboBox::activated), [=](int index){
        //qDebug() << "Index" << ui->cameraSel->currentIndex() << ": " << ui->cameraSel->currentText();
        camera->stop();
        delete camera;
        camera = new QCamera(cameras[index]);                //camera指向指定的攝像頭
        camera->setCaptureMode(QCamera::CaptureStillImage);  //設(shè)定捕獲模式
        camera->setViewfinder(viewfinder);                   //設(shè)置取景器
        camera->start();

        //刪除前相機(jī)的所有分辨率內(nèi)容
        for (int i = 0; i < mResSize.size(); i++) {
               ui->resolutionSel->removeItem(0);
        }

        //添加新相機(jī)的所有分辨率
        mResSize.clear();
        //qDebug() << "now mResSize = " << mResSize;
        mResSize = camera->supportedViewfinderResolutions();
        for (const QSize &msize:mResSize) {
               qDebug() << msize; //攝像頭支持分辨率打印
               ui->resolutionSel->addItem(QString::number(msize.width(), 10) + "*" + QString::number(msize.height(), 10));
        }
        ui->resolutionSel->setCurrentIndex(0);
    });

    connect(ui->resolutionSel, QOverload<int>::of(&QComboBox::activated), [=](int index){
        //qDebug() << "Index" << ui->resolutionSel->currentIndex() << ": " << ui->resolutionSel->currentText();
        //qDebug() << "mResSize:" << mResSize[index];
        //重新設(shè)置攝像頭參數(shù)
        QCameraViewfinderSettings reset;
        reset.setResolution(mResSize[index]);
        camera->setViewfinderSettings(reset);
    });

    connect(ui->screenShot, &QPushButton::clicked, [=](){
        camera->setCaptureMode(QCamera::CaptureStillImage);
        delete imageCapture;
        imageCapture = new QCameraImageCapture(camera);
        QString fileName = QFileDialog::getSaveFileName();
        camera->searchAndLock();
        imageCapture->capture(fileName);
        camera->unlock();
    });
}

Widget::~Widget()
{
    delete ui;
}

到此這篇關(guān)于Qt使用QCamera實(shí)現(xiàn)切換相機(jī),分辨率和圖像捕獲功能的文章就介紹到這了,更多相關(guān)Qt QCamera內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言樹狀數(shù)組的實(shí)例詳解

    C語言樹狀數(shù)組的實(shí)例詳解

    這篇文章主要介紹了C語言樹狀數(shù)組的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • OpenCV + MFC實(shí)現(xiàn)簡(jiǎn)單人臉識(shí)別

    OpenCV + MFC實(shí)現(xiàn)簡(jiǎn)單人臉識(shí)別

    這篇文章主要為大家詳細(xì)介紹了OpenCV + MFC實(shí)現(xiàn)簡(jiǎn)單人臉識(shí)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • 主流操作系統(tǒng)平臺(tái)的宏定義

    主流操作系統(tǒng)平臺(tái)的宏定義

    這篇文章主要介紹了主流操作系統(tǒng)平臺(tái)的宏定義,最近正在學(xué)習(xí)C++程序從Windows 平臺(tái)向Unix 平臺(tái)移植,參考了 qt 的宏定義文件,需要的朋友可以參考下
    2014-02-02
  • C++利用兩個(gè)棧實(shí)現(xiàn)隊(duì)列的方法

    C++利用兩個(gè)棧實(shí)現(xiàn)隊(duì)列的方法

    這篇文章主要給大家介紹了關(guān)于C++利用兩個(gè)棧實(shí)現(xiàn)隊(duì)列的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • 如何通過函數(shù)指針調(diào)用函數(shù)(實(shí)現(xiàn)代碼)

    如何通過函數(shù)指針調(diào)用函數(shù)(實(shí)現(xiàn)代碼)

    指針可以不但可以指向一個(gè)整形,浮點(diǎn)型,字符型,字符串型的變量,也可以指向相應(yīng)的數(shù)組,而且還可以指向一個(gè)函數(shù)
    2013-09-09
  • C語言代碼中調(diào)用C++代碼的方法示例

    C語言代碼中調(diào)用C++代碼的方法示例

    這篇文章主要介紹了C語言代碼中調(diào)用C++代碼的方法示例,文中也介紹了C++代碼調(diào)用C代碼的方法,有需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-02-02
  • 一起聊聊C++中的四種類型轉(zhuǎn)換符

    一起聊聊C++中的四種類型轉(zhuǎn)換符

    這篇文章主要是想喝大家一起聊聊來C++中的四種類型轉(zhuǎn)換符?:const_cast、reinterpret_cast、dynamic_cast和static_cast,感興趣的可以了解一下
    2022-07-07
  • 基于堆的基本操作的介紹

    基于堆的基本操作的介紹

    本篇文章對(duì)堆的基本操作進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下
    2013-05-05
  • 解析如何利用switch語句進(jìn)行字符統(tǒng)計(jì)

    解析如何利用switch語句進(jìn)行字符統(tǒng)計(jì)

    本篇文章是對(duì)如何利用switch語句進(jìn)行字符統(tǒng)計(jì)的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • shared_ptr線程安全性全面分析

    shared_ptr線程安全性全面分析

    正如boost文檔所宣稱的,boost為shared_ptr提供了與內(nèi)置類型同級(jí)別的線程安全性。這包括:1. 同一個(gè)shared_ptr對(duì)象可以被多線程同時(shí)讀取。2. 不同的shared_ptr對(duì)象可以被多線程同時(shí)修改成
    2013-09-09

最新評(píng)論