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

}

C++ 摄像头类代码注释详解:Camera 类实现

原文地址: https://www.cveoy.top/t/topic/oRcc 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录