Qt应用程序开发八:Qt摄像头QCamera应用

本文介绍了一个使用QT库实现的摄像头应用程序,支持视频录制与图像捕获功能。该应用通过QT的多媒体模块实现了摄像头的启动、视频录制及图像截取,并提供了用户界面进行操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

效果图:

//优快云Camera.pro

QT       += core gui
QT      += multimediawidgets
QT      += multimedia

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = 优快云Camera
TEMPLATE = app


SOURCES += main.cpp\
        优快云Camera.cpp

HEADERS  += 优快云Camera.h

FORMS    += 优快云Camera.ui
//优快云Camera.h

#ifndef 优快云CAMERA_H
#define 优快云CAMERA_H

#include <QWidget>
#include<QCamera>
#include<QCameraViewfinder>
#include<QCameraImageCapture>
#include<QMediaRecorder>


namespace Ui {
class 优快云Camera;
}

class 优快云Camera : public QWidget
{
    Q_OBJECT

public:
    explicit 优快云Camera(QWidget *parent = 0);
    ~优快云Camera();
    void openCamera(QString description=QString());
    void enumCamera();
    void bindRecoder(QCamera *camera);

private slots:
    void on_btn_record_video_clicked();

    void on_btn_cut_image_clicked();

    void onImageCaptured(int id,QImage img);

    void on_btn_open_camera_clicked();

    void on_btn_record_video_stop_clicked();

private:
    Ui::优快云Camera *ui;
    QCamera*               mCamera;         //摄像头对象
    QCameraViewfinder*     mViewfinder;     //摄像头取景器
    QCameraImageCapture*   mImageCapture;   //截图对象
    QMediaRecorder*        mMediaRecorder;  //视频录制对象


};

#endif // 优快云CAMERA_H
//优快云Camera.cpp

#include "优快云Camera.h"
#include "ui_优快云Camera.h"
#include<QCameraInfo>
#include<QDebug>
#include<QAudioEncoderSettings>
#include<QUrl>

优快云Camera::优快云Camera(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::优快云Camera)
{
    ui->setupUi(this);
    mCamera = NULL;
    mViewfinder = new QCameraViewfinder(ui->widget_camrea_view);
    mViewfinder->resize(ui->widget_camrea_view->size());
    mViewfinder->setAspectRatioMode(Qt::KeepAspectRatio);//设置全视角显示
    enumCamera();

}

优快云Camera::~优快云Camera()
{

    if(mCamera != NULL)
    mCamera->stop();
    delete ui;
}

void 优快云Camera::openCamera(QString description)
{
    if(description.isEmpty()){
        QCameraInfo info = QCameraInfo::defaultCamera(); //默认摄像头
        mCamera = new QCamera(info,this);
    }else{
        QList<QCameraInfo> cameras = QCameraInfo::availableCameras();
        foreach (const QCameraInfo &cameraInfo, cameras){
            if(cameraInfo.description() == description){
                mCamera = new QCamera(cameraInfo,this);
                break;
            }
        }
    }
    mCamera->setCaptureMode(QCamera::CaptureVideo);
    connect(mCamera, static_cast<void(QCamera::*)(QCamera::Error)>(&QCamera::error),
         [=](QCamera::Error value){ qDebug()<<value;});

    //设置摄像头取景器
    mCamera->setViewfinder(mViewfinder);
    //绑定截图对象
    mImageCapture = new QCameraImageCapture(mCamera);
    connect(mImageCapture,SIGNAL(imageCaptured(int,QImage)),SLOT(onImageCaptured(int,QImage)));
    bindRecoder(mCamera);
    //开启摄像头
    mCamera->start();


}

/*
@brief       枚举摄像头
@return
*/
void 优快云Camera::enumCamera()
{
    QList<QCameraInfo> cameras = QCameraInfo::availableCameras();
    foreach (const QCameraInfo &cameraInfo, cameras){
         ui->comboBox_camera->addItem(cameraInfo.description());
    }
}
/*
@brief          设置录制格式
@param  camera  摄像头对象
@return
windows 下测试无效,其他解决方案 用QtMEL 详情 http://kibsoft.ru/
*/
void 优快云Camera::bindRecoder(QCamera *camera)
{
    mMediaRecorder = new QMediaRecorder(camera,this);
    connect(mMediaRecorder, static_cast<void(QMediaRecorder::*)(QMediaRecorder::Error)>(&QMediaRecorder::error),
        [=](QMediaRecorder::Error error){ qDebug()<<error;});
    connect(mMediaRecorder,&QMediaRecorder::statusChanged,[=](QMediaRecorder::Status status){qDebug()<<status;});

    //设置音频编码格式
    QAudioEncoderSettings audioSettings;
    audioSettings.setCodec("audio/amr");
    audioSettings.setQuality(QMultimedia::HighQuality);
    //mMediaRecorder->setAudioSettings(audioSettings);

    QVideoEncoderSettings settings = mMediaRecorder->videoSettings();

    settings.setResolution(640,480);
    settings.setQuality(QMultimedia::VeryHighQuality);
    settings.setFrameRate(30.0);
    settings.setCodec("video/mp4");

    mMediaRecorder->setVideoSettings(settings);
    mMediaRecorder->setOutputLocation(QUrl(qApp->applicationDirPath() + "/xzp.mp4"));
}


void 优快云Camera::on_btn_record_video_clicked()
{

    if(!mCamera) return;
    qDebug()<<"start record";
    mMediaRecorder->record();
}

void 优快云Camera::on_btn_cut_image_clicked()
{
    if(!mCamera) return;
    mImageCapture->capture();
}

/*
@brief       显示截图
@param id    截图ID
@param img   mImageCapture截图返回的图片信息
@return
*/
void 优快云Camera::onImageCaptured(int id, QImage img)
{
    qDebug()<<id;
    ui->lab_cutImage->setPixmap(QPixmap::fromImage(img).scaled(ui->lab_cutImage->size()));
}

void 优快云Camera::on_btn_open_camera_clicked()
{
    openCamera();//打开默认摄像头
    //openCamera(ui->comboBox_camera->currentText()); 打开选择的摄像头

}

void 优快云Camera::on_btn_record_video_stop_clicked()
{
    if(!mCamera) return;
    mMediaRecorder->stop();
}

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值