Qt使用QCamera實現(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ī)列表并選擇一個相機(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)); //初始化實例化一個相機(jī)對象
}
實例化取景器類,取景器本質(zhì)是一個窗口類,若不將當(dāng)前窗口設(shè)為父對象,則可以另起一個窗口顯示。將當(dāng)前窗口設(shè)為父對象后,視頻畫面便在當(dāng)前窗口顯示。
//設(shè)置取景器 viewfinder = new QCameraViewfinder(this); camera->setViewfinder(viewfinder); viewfinder->resize(600,350); //設(shè)置取景器顯示大小 //viewfinder->show();
實例化一個圖像捕獲類,并開啟相機(jī)
imageCapture = new QCameraImageCapture(camera); camera->start(); //開啟相機(jī)
設(shè)置默認(rèn)攝像頭的分辨率及幀率。注意:幀率一定要與攝像頭匹配,否則不會顯示畫面。
//設(shè)置默認(rèn)攝像頭參數(shù) QCameraViewfinderSettings set; set.setResolution(640, 480); //設(shè)置顯示分辨率 set.setMaximumFrameRate(25); //設(shè)置幀率 camera->setViewfinderSettings(set);
設(shè)置兩個下拉框部件的初始化
//添加初始化的相機(jī)選項
for(const QCameraInfo &cameraInfo:cameras) {
qDebug() << "CameraInfo:" << cameraInfo;
ui->cameraSel->addItem(cameraInfo.description());
}
ui->cameraSel->setCurrentIndex(0);
//添加初始化相機(jī)的分辨率選項
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)容,添加兩個下拉框及一個按鈕

編寫信號槽連接
首先是選擇攝影機(jī),先釋放之前的內(nèi)存,再將camera指向新的。選擇新的相機(jī)意味著分辨率選項也會變化,因此需要刪除分辨率下拉框中前相機(jī)的所有分辨率選項,再添加新相機(jī)的所有分辨率選項。
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)); //初始化實例化一個相機(jī)對象
}
//設(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ī)選項
for(const QCameraInfo &cameraInfo:cameras) {
qDebug() << "CameraInfo:" << cameraInfo;
ui->cameraSel->addItem(cameraInfo.description());
}
ui->cameraSel->setCurrentIndex(0);
//添加初始化相機(jī)的分辨率選項
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();
//刪除前相機(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實現(xiàn)切換相機(jī),分辨率和圖像捕獲功能的文章就介紹到這了,更多相關(guān)Qt QCamera內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何通過函數(shù)指針調(diào)用函數(shù)(實現(xiàn)代碼)
指針可以不但可以指向一個整形,浮點(diǎn)型,字符型,字符串型的變量,也可以指向相應(yīng)的數(shù)組,而且還可以指向一個函數(shù)2013-09-09
解析如何利用switch語句進(jìn)行字符統(tǒng)計
本篇文章是對如何利用switch語句進(jìn)行字符統(tǒng)計的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06

