QT5 QCamera摄像头
参考:
QT项目实战(视频播放器)<< 综述概要 https://zhijie.blog.csdn.net/article/details/131024980
有关QCamera的使用说明和常见问题 https://blog.csdn.net/weixin_42842157/article/details/122000515
Qt5.14.2中使用QCamera实现切换相机、分辨率和图像捕获功能 https://blog.csdn.net/Star_ID/article/details/127195698
(已源码验证**) 【QT】摄像头调用 https://blog.csdn.net/m0_61573070/article/details/125780286
*** 【QT】qt操作摄像头 https://jason-shen.blog.csdn.net/article/details/98875026
---------------------------------------------------------
摄像头标定:原理、方法、步骤 (**) https://blog.csdn.net/ken2232/article/details/135644249
标定问题:
摄像头的制造者,才需要考虑标定问题?
对于摄像头的使用者来说,不需要考虑标定问题。除非使用者也是制作者;比如:市面上没有现成的产品,而需要使用者自己搞定?又或者由于成本问题需要自造等等。
但基本的标定原理,使用者还是需要了解的吧?否则,怎么知道所购买的摄像头,到底哪一个更好呢?
==================================
QT5 QCamera摄像头
https://blog.csdn.net/m0_49476241/article/details/131986659
文章目录
前言
一、QCamera类
二、QCameraViewfinder类
三、QCameraInfo类
四、QCameraImageCapture类
总结
前言
本篇文章我们来讲解QT如何使用通过QCamera调用摄像头。
本篇文章的话就围绕QT5来展开讲解,QT6的话已经更新了多媒体的调用方式,这里我们以后再进行讲解。
一、QCamera类
QCamera类是Qt框架提供的用于访问和控制摄像头设备的类。它提供了一组函数和信号槽,使开发人员能够以编程方式访问摄像头设备并执行各种操作,例如捕捉照片、录制视频、调整摄像头参数等。
以下是一些QCamera类的常用函数和用法:
1.构造函数和析构函数:
QCamera(QObject* parent = nullptr):构造一个QCamera对象。可选参数parent指定了父对象,默认为nullptr。
~QCamera():析构函数,用于释放QCamera对象。
2.摄像头控制:
void setCaptureMode(QCamera::CaptureModes mode):设置摄像头的捕捉模式,可以是照片模式、视频模式或同时支持两种模式。
bool start():打开摄像头设备并开始捕捉视频帧或图像。
bool stop():停止捕捉视频或图像,并关闭摄像头设备。
void searchAndLock():搜索当前系统上可用的摄像头设备,并锁定所选设备。
3.预览窗口和视图控制:
void setViewfinder(QAbstractVideoSurface* surface):将预览窗口设置为指定的视频表面(QAbstractVideoSurface对象)。
void setViewfinder(QWidget* widget):将预览窗口设置为指定的QWidget对象。
void setViewfinderSettings(const QCameraViewfinderSettings& settings):设置预览窗口的参数,例如分辨率、帧率等。
4.拍照和录制视频:
void searchAndCapture():搜索并捕捉一帧图像。
void capture():捕捉当前预览窗口中的一帧图像。
void setCaptureDestination(QCameraImageCapture::CaptureDestinations destination):设置图像捕捉的目标位置,可以是文件、内存或其他自定义目标。
void record():开始录制视频。
void stopRecording():停止录制视频。
二、QCameraViewfinder类
QCameraViewfinder 是 Qt 中用于显示摄像头实时预览的类。它是 QCamera 类的一部分,用于在应用程序中创建一个摄像头视图窗口,以显示摄像头捕获的实时视频流。
QCameraViewfinder 继承自 QWidget 类,因此可以像其他 Qt 控件一样使用并集成到应用程序的用户界面中。它提供了一个可视化的界面,用于展示通过摄像头设备捕获的视频内容。
一些重要的 QCameraViewfinder 类的功能和特性包括:
1.实时预览: QCameraViewfinder 可以实时显示摄像头设备捕获的视频流。它通过调用 QCamera 的 setViewfinder() 方法将摄像头与视图绑定,从而将摄像头的实时图像显示在 QCameraViewfinder 上。
2.尺寸和缩放: QCameraViewfinder 可以根据窗口的大小自动调整摄像头预览的尺寸。它可以根据视图的宽高比例对视频流进行缩放,以确保画面的比例和容纳。
3.事件处理: QCameraViewfinder 可以处理鼠标和键盘事件,以及其他与用户交互相关的事件。您可以通过重写相应的事件处理函数来实现自定义行为。
4.窗口样式: QCameraViewfinder 被设计为可自定义样式,可以通过使用 QSS (Qt 样式表) 或其他 UI 风格技术来改变其外观和样式。
5.使用 QCameraViewfinder,您可以轻松地在 Qt 应用程序中创建一个具有实时摄像头预览功能的界面。您可以处理摄像头的属性设置、捕获和显示视频流等操作,实现自定义的多媒体应用程序,如视频监控、视频通话等。
三、QCameraInfo类
QCameraInfo 是 Qt 中用于获取有关系统中可用摄像头设备信息的类。它提供了一种简便的方式来检索和操作与摄像头相关的信息,包括设备名称、位置、支持的功能和参数等。
以下是 QCameraInfo 类的一些重要特性和功能:
1.获取可用的摄像头设备列表:您可以使用 QCameraInfo::availableCameras() 静态函数获取系统中可用的摄像头设备列表。该函数返回一个包含 QCameraInfo 对象的列表,每个对象代表一个可用的摄像头设备。
2.检索摄像头设备的属性:通过 QCameraInfo 对象,您可以获取有关摄像头设备的属性信息。例如,您可以使用 deviceName() 方法获取设备的名称,manufacturer() 方法获取设备的制造商信息,position() 方法获取设备的位置(前置摄像头或后置摄像头),还可以使用 description() 方法获取有关设备的描述信息。
3.查询摄像头设备支持的功能:QCameraInfo 提供了函数来查询摄像头设备支持的功能和参数。您可以使用 QCameraInfo::isCaptureModeSupported() 来检查设备是否支持拍照模式,使用 QCameraInfo::availableMimeTypes() 来获取设备支持的视频和图片编码格式等。
4.监测可用摄像头设备的变化:QCameraInfo 提供了信号和槽机制,可以用于监测可用摄像头设备的变化。通过使用 QCameraInfo::availableCamerasChanged() 信号,您可以在设备列表发生变化时接收通知,从而更新应用程序的界面或相关逻辑。
四、QCameraImageCapture类
QCameraImageCapture 类是 Qt 框架中用于捕获摄像头图像的类。它提供了一种方便的方式来拍摄照片或捕获图像帧,并提供了许多功能和信号用于处理捕获过程和结果。
以下是 QCameraImageCapture 类的一些重要功能和用法:
1.捕获图像:使用 capture() 函数可以捕获当前摄像头的图像。你可以在捕获前设置图像保存的格式、保存路径和文件名等参数。捕获完成后,可以通过 imageSaved() 信号获取捕获的图像数据。
2.设置图像保存参数:使用 setCaptureDestination() 函数可以设置图像的保存目标,可以选择保存为文件或存储在内存中。还可以使用 setEncodingSettings() 函数设置图像的编码格式和质量选项。
3.获取支持的图像编码格式和质量选项:使用 supportedImageCodecs() 函数可以获取当前系统支持的图像编码格式列表。使用 supportedResolutions() 函数可以获取摄像头支持的图像分辨率列表。
4.自动对焦和闪光灯控制:通过 isCaptureDestinationSupported() 和 isFeatureSupported() 函数可以检查是否支持自动对焦和闪光灯功能,并相应地进行设置。
5.异步捕获和信号处理:QCameraImageCapture 支持异步捕获,捕获图像时不会阻塞主线程。捕获完成后,可以通过 imageSaved() 信号获取捕获的图像数据,并进行进一步的处理。
总结
本篇文章主要讲解一下摄像头相关的类,那么下篇文章我们继续讲解并且进行实战。
————————————————
版权声明:本文为CSDN博主「花落已飘」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_49476241/article/details/131986659
Qt5.14.2中使用QCamera实现切换相机、分辨率和图像捕获功能
https://blog.csdn.net/Star_ID/article/details/127195698
demo中主要涉及的Qt类有:相机类QCamera,取景器类QCameraViewfinder,图像捕获类QCameraImageCapture,因此添加模块multimedia multimediawidgets。
QT += core gui multimedia multimediawidgets
在widget.h中添加相关类声明:
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的构造函数中添加代码:
先设置下窗口名称及大小
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)); //初始化实例化一个相机对象
}
实例化取景器类,取景器本质是一个窗口类,若不将当前窗口设为父对象,则可以另起一个窗口显示。将当前窗口设为父对象后,视频画面便在当前窗口显示。
//设置取景器
viewfinder = new QCameraViewfinder(this);
camera->setViewfinder(viewfinder);
viewfinder->resize(600,350); //设置取景器显示大小
//viewfinder->show();
实例化一个图像捕获类,并开启相机
imageCapture = new QCameraImageCapture(camera);
camera->start(); //开启相机
设置默认摄像头的分辨率及帧率。注意:帧率一定要与摄像头匹配,否则不会显示画面。
//设置默认摄像头参数
QCameraViewfinderSettings set;
set.setResolution(640, 480); //设置显示分辨率
set.setMaximumFrameRate(25); //设置帧率
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);
调整下widget.ui的内容,添加两个下拉框及一个按钮
编写信号槽连接
首先是选择摄影机,先释放之前的内存,再将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); //设定捕获模式
camera->setViewfinder(viewfinder); //设置取景器
camera->start();//删除前相机的所有分辨率内容
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];
//重新设置摄像头参数
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_NAMESPACEclass QCamera;
class QCameraViewfinder;
class QCameraImageCapture;
class QCameraInfo;
class QCameraViewfinderSettings;class Widget : public QWidget
{
Q_OBJECTpublic:
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)); //初始化实例化一个相机对象
}//设置取景器
viewfinder = new QCameraViewfinder(this);
camera->setViewfinder(viewfinder);
viewfinder->resize(600,350); //设置取景器显示大小
//viewfinder->show();imageCapture = new QCameraImageCapture(camera);
camera->start(); //开启相机//设置默认摄像头参数
QCameraViewfinderSettings set;
set.setResolution(640, 480); //设置显示分辨率
set.setMaximumFrameRate(25); //设置帧率
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); //设定捕获模式
camera->setViewfinder(viewfinder); //设置取景器
camera->start();//删除前相机的所有分辨率内容
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];
//重新设置摄像头参数
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;
}
————————————————
版权声明:本文为CSDN博主「Star_ID」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Star_ID/article/details/127195698