最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

demo中主要涉及的Qt類有:相機類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;                   //相機
QCameraViewfinder *viewfinder;     //取景器
QCameraImageCapture *imageCapture; //圖像捕獲
QList<QCameraInfo> cameras;        //相機列表
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);

接著獲取所有相機列表并選擇一個相機初始化

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

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

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

實例化一個圖像捕獲類,并開啟相機

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

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

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

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

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

//添加初始化相機的分辨率選項
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)容,添加兩個下拉框及一個按鈕

編寫信號槽連接

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

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();

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

    //添加新相機的所有分辨率
    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;                   //相機
    QCameraViewfinder *viewfinder;     //取景器
    QCameraImageCapture *imageCapture; //圖像捕獲
    QList<QCameraInfo> cameras;        //相機列表
    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();   //獲取所有相機的列表
    //qDebug() << "this is camera: ";
    if (cameras.count() > 0) {
        for(const QCameraInfo &cameraInfo:cameras) {
            qDebug() << cameraInfo.description();
        }
        camera = new QCamera(cameras.at(0));     //初始化實例化一個相機對象
    }

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

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

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

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

    //添加初始化相機的分辨率選項
    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);

    //信號槽連接
    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();

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

        //添加新相機的所有分辨率
        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實現(xiàn)切換相機,分辨率和圖像捕獲功能的文章就介紹到這了,更多相關(guān)Qt QCamera內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入解析C++11?lambda表達式/包裝器/線程庫

    深入解析C++11?lambda表達式/包裝器/線程庫

    這篇文章主要介紹了C++11?lambda表達式/包裝器/線程庫的相關(guān)知識,本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • C/C++中運算符的優(yōu)先級、運算符的結(jié)合性詳解

    C/C++中運算符的優(yōu)先級、運算符的結(jié)合性詳解

    這篇文章主要介紹了C/C++中運算符的優(yōu)先級、運算符的結(jié)合性詳解的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • c++指針參數(shù)傳遞和引用參數(shù)傳遞的區(qū)別解析

    c++指針參數(shù)傳遞和引用參數(shù)傳遞的區(qū)別解析

    這篇文章主要介紹了c++指針參數(shù)傳遞和引用參數(shù)傳遞的區(qū)別解析,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • C語言實現(xiàn)數(shù)據(jù)的壓縮與解壓

    C語言實現(xiàn)數(shù)據(jù)的壓縮與解壓

    數(shù)據(jù)壓縮是通過一系列的算法和技術(shù)將原始數(shù)據(jù)轉(zhuǎn)換為更緊湊的表示形式,以減少數(shù)據(jù)占用的存儲空間,數(shù)據(jù)解壓縮則是將壓縮后的數(shù)據(jù)恢復(fù)到原始的表示形式,本文給大家詳細介紹了C語言實現(xiàn)數(shù)據(jù)壓縮與解壓,需要的朋友可以參考下
    2023-08-08
  • 淺談返回函數(shù)內(nèi)部new分配的內(nèi)存的引用

    淺談返回函數(shù)內(nèi)部new分配的內(nèi)存的引用

    下面小編就為大家?guī)硪黄獪\談返回函數(shù)內(nèi)部new分配的內(nèi)存的引用。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • OpenCV實現(xiàn)圖像角點檢測

    OpenCV實現(xiàn)圖像角點檢測

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)圖像角點檢測,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C語言實現(xiàn)萬年歷源碼

    C語言實現(xiàn)萬年歷源碼

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)萬年歷源碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • 基于C語言實現(xiàn)創(chuàng)意多彩貪吃蛇游戲

    基于C語言實現(xiàn)創(chuàng)意多彩貪吃蛇游戲

    這篇文章主要介紹了如何利用C語言實現(xiàn)一個創(chuàng)意多彩貪吃蛇游戲,這是一個純C語言外加easyx庫的繪圖函數(shù)制作而成的有趣小游戲,無需引入額外資源,感興趣的可以動手嘗試一下
    2022-08-08
  • C語言循環(huán)結(jié)構(gòu)深入刨析

    C語言循環(huán)結(jié)構(gòu)深入刨析

    C語言條件控制語句選擇結(jié)構(gòu),是屬于計算機的語言編輯,有在C語言條件控制中的語句選擇結(jié)構(gòu)的存在,即是C語言條件控制語句選擇結(jié)構(gòu),循環(huán)控制語句是一個基于C語言的編程語句,該語句主要有while循環(huán)語句、do-while循環(huán)語句和for循環(huán)語句來實現(xiàn)循環(huán)結(jié)構(gòu)
    2022-08-08
  • C/C++中的atan和atan2函數(shù)實例用法

    C/C++中的atan和atan2函數(shù)實例用法

    在本篇文章里小編給大家分享的是一篇關(guān)于C/C++中的atan和atan2函數(shù)實例用法相關(guān)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2020-02-02

最新評論

鄂伦春自治旗| 工布江达县| 灯塔市| 桂林市| 岚皋县| 宜兰市| 饶河县| 新竹市| 安化县| 嘉义县| 汨罗市| 河北省| 桂平市| 金坛市| 洛宁县| 绿春县| 子洲县| 卫辉市| 连州市| 宣威市| 竹北市| 砀山县| 喀什市| 海盐县| 鹿邑县| 揭东县| 喜德县| 仁布县| 斗六市| 堆龙德庆县| 若羌县| 突泉县| 商水县| 洮南市| 万全县| 西和县| 增城市| 乐清市| 东乡族自治县| 仙桃市| 泉州市|