C++ 摄像头类代码注释详解:Camera 类实现
// Camera类的构造函数,继承自QMainWindow类,初始化成员变量和界面 Camera::Camera(QWidget *parent) : QMainWindow(parent), // 继承自QMainWindow类 ui(new Ui::Camera), // 创建一个Ui::Camera对象,用于管理该类的所有界面元素 camera(0), // 摄像头指针初始化为空 imageCapture(0), // 用于捕获图像的对象指针初始化为空 mediaRecorder(0), // 用于录制视频的对象指针初始化为空 isCapturingImage(false), // 是否正在捕获图像的标志位初始化为false applicationExiting(false) // 应用程序是否正在退出的标志位初始化为false { ui->setupUi(this); // 初始化界面
// 枚举所有检测到的摄像头,并添加到菜单中
QActionGroup *videoDevicesGroup = new QActionGroup(this);
videoDevicesGroup->setExclusive(true);
foreach (const QCameraInfo &cameraInfo, QCameraInfo::availableCameras()) {
QAction *videoDeviceAction = new QAction(cameraInfo.description(), videoDevicesGroup);
videoDeviceAction->setCheckable(true);
videoDeviceAction->setData(QVariant::fromValue(cameraInfo));
if (cameraInfo == QCameraInfo::defaultCamera())
videoDeviceAction->setChecked(true);
ui->menuDevices->addAction(videoDeviceAction);
}
// 将videoDevicesGroup的triggered信号与updateCameraDevice槽函数连接起来
connect(videoDevicesGroup, SIGNAL(triggered(QAction*)), SLOT(updateCameraDevice(QAction*)));
// 将captureWidget的currentChanged信号与updateCaptureMode槽函数连接起来
connect(ui->captureWidget, SIGNAL(currentChanged(int)), SLOT(updateCaptureMode()));
// 设置默认摄像头
setCamera(QCameraInfo::defaultCamera());
}
// Camera类的析构函数,释放动态分配的内存 Camera::~Camera() { delete mediaRecorder; delete imageCapture; delete camera; }
// 设置摄像头 void Camera::setCamera(const QCameraInfo &cameraInfo) { // 释放之前的摄像头、图像捕获器和媒体录制器 delete imageCapture; delete mediaRecorder; delete camera;
// 创建新的摄像头对象
camera = new QCamera(cameraInfo);
// 将摄像头的stateChanged信号与updateCameraState槽函数连接起来
connect(camera, SIGNAL(stateChanged(QCamera::State)), this, SLOT(updateCameraState(QCamera::State)));
// 将摄像头的error信号与displayCameraError槽函数连接起来
connect(camera, SIGNAL(error(QCamera::Error)), this, SLOT(displayCameraError()));
// 创建媒体录制器对象,并将其与摄像头连接起来
mediaRecorder = new QMediaRecorder(camera);
// 将mediaRecorder的stateChanged信号与updateRecorderState槽函数连接起来
connect(mediaRecorder, SIGNAL(stateChanged(QMediaRecorder::State)), this, SLOT(updateRecorderState(QMediaRecorder::State)));
// 创建图像捕获器对象,并将其与摄像头连接起来
imageCapture = new QCameraImageCapture(camera);
// 将mediaRecorder的durationChanged信号与updateRecordTime槽函数连接起来
connect(mediaRecorder, SIGNAL(durationChanged(qint64)), this, SLOT(updateRecordTime()));
// 将mediaRecorder的error信号与displayRecorderError槽函数连接起来
connect(mediaRecorder, SIGNAL(error(QMediaRecorder::Error)), this, SLOT(displayRecorderError()));
// 设置媒体录制器的元数据
mediaRecorder->setMetaData(QMediaMetaData::Title, QVariant(QLatin1String('Test Title')));
// 将曝光补偿滑块的valueChanged信号与setExposureCompensation槽函数连接起来
connect(ui->exposureCompensation, SIGNAL(valueChanged(int)), SLOT(setExposureCompensation(int)));
// 将摄像头的viewfinder设置为rviewfinde
camera->setViewfinder(ui->rviewfinde);
// 更新摄像头状态、锁定状态和媒体录制器状态
updateCameraState(camera->state());
updateLockStatus(camera->lockStatus(), QCamera::UserRequest);
updateRecorderState(mediaRecorder->state());
// 将imageCapture的readyForCaptureChanged信号与readyForCapture槽函数连接起来
connect(imageCapture, SIGNAL(readyForCaptureChanged(bool)), this, SLOT(readyForCapture(bool)));
// 将imageCapture的imageCaptured信号与processCapturedImage槽函数连接起来
connect(imageCapture, SIGNAL(imageCaptured(int,QImage)), this, SLOT(processCapturedImage(int,QImage)));
// 将imageCapture的imageSaved信号与imageSaved槽函数连接起来
connect(imageCapture, SIGNAL(imageSaved(int,QString)), this, SLOT(imageSaved(int,QString)));
// 将imageCapture的error信号与displayCaptureError槽函数连接起来
connect(imageCapture, SIGNAL(error(int,QCameraImageCapture::Error,QString)), this,
SLOT(displayCaptureError(int,QCameraImageCapture::Error,QString)));
// 将摄像头的lockStatusChanged信号与updateLockStatus槽函数连接起来
connect(camera, SIGNAL(lockStatusChanged(QCamera::LockStatus,QCamera::LockChangeReason)),
this, SLOT(updateLockStatus(QCamera::LockStatus,QCamera::LockChangeReason)));
// 根据摄像头是否支持静态图像捕获和视频捕获,设置captureWidget的tab页是否可用
ui->captureWidget->setTabEnabled(0, (camera->isCaptureModeSupported(QCamera::CaptureStillImage)));
ui->captureWidget->setTabEnabled(1, (camera->isCaptureModeSupported(QCamera::CaptureVideo)));
// 更新当前的捕获模式
updateCaptureMode();
// 启动摄像头
camera->start();
}
原文地址: https://www.cveoy.top/t/topic/oRcc 著作权归作者所有。请勿转载和采集!