Qt摄像头QCamera *** 作

Qt摄像头QCamera *** 作,第1张

Qt摄像头QCamera *** 作

#include "cameramainwindow.h"
#include "ui_cameramainwindow.h"

CameraMainWindow::CameraMainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::CameraMainWindow)
{
    ui->setupUi(this);
    LabCameraState=new QLabel("摄像头state: ");
    LabCameraState->setMinimumWidth(150);
    ui->statusbar->addWidget(LabCameraState);
    LabCameraMode=new QLabel("抓取模式: ");
    LabCameraMode->setMinimumWidth(150) ;
    ui->statusbar->addWidget(LabCameraMode) ;
    LabInfo=new QLabel("");
    ui->statusbar->addPermanentWidget(LabInfo);




    QList cameras = QCameraInfo::availableCameras() ;
    if (cameras.size()>0)
    {
        iniCamera(); // 初始化摄像头
        iniImageCapture();//初始化静态画图
        iniVideoRecorder() ;//初始化视频录制
        curCamera->start() ;
    }


}

CameraMainWindow::~CameraMainWindow()
{
    delete ui;
}

void CameraMainWindow::iniCamera()
{
    QCameraInfo curCameraInfo=QCameraInfo::defaultCamera(); //获取缺省摄像头
    ui-> comboCamera->addItem( curCameraInfo. description());//摄像头描述
    ui->comboCamera->setCurrentIndex(0) ;
    curCamera=new QCamera(curCameraInfo, this); //创建摄像头对象
    QCameraViewfinderSettings viewfinderSettings;
    viewfinderSettings.setResolution(640,480) ;
    curCamera->setViewfinderSettings (viewfinderSettings) ;
    curCamera->setViewfinder(ui->widget);
    curCamera->setCaptureMode(QCamera::CaptureStillImage);

    ui->pushButton_5->setChecked(curCamera->isCaptureModeSupported(QCamera::CaptureVideo));
    ui->pushButton_2->setChecked(curCamera->isCaptureModeSupported(QCamera::CaptureStillImage));

    connect(curCamera,SIGNAL(stateChanged(QCamera::State)),this,SLOT(on_stateChanged(QCamera::State)));
    connect(curCamera,SIGNAL(captureModeChanged(QCamera::CaptureModes)),this,SLOT(on_captureModeChanged(QCamera::CaptureModes)));

}

void CameraMainWindow::iniImageCapture()
{
    imageCapture=new QCameraImageCapture(curCamera,this);
    imageCapture->setBufferFormat(QVideoframe::Format_Jpeg);

    imageCapture->setCaptureDestination(QCameraImageCapture::CaptureToFile);

    connect (imageCapture, SIGNAL (readyForCaptureChanged(bool)),
             this, SLOT(on_imageReadyForCapture(bool)));
    connect(imageCapture,SIGNAL (imageCaptured(int, const QImage &)) ,
            this,SLOT(on_imageCaptured(int, const QImage &)));
    connect(imageCapture,SIGNAL(imageSaved(int,const QString &)) ,
            this,SLOT(on_imageSaved(int,const QString &)));

}

void CameraMainWindow::iniVideoRecorder()
{
    mediaRecorder=new QMediaRecorder(curCamera,this);
    connect(mediaRecorder,SIGNAL(stateChanged(QMediaRecorder::State)),this,SLOT(on_camerastateChanged(QMediaRecorder::State)));
    connect(mediaRecorder,SIGNAL(durationChanged(qint64)),this,SLOT(on_cameradurationChanged(qint64)));
}

void CameraMainWindow::on_stateChanged(QCamera::State state)
{
    switch (state)
    {
    case QCamera::UnloadedState:
        LabCameraState->setText("摄像头state: UnloadedState");
        break;
    case QCamera::LoadedState:
        LabCameraState->setText("摄像头state: LoadedState") ;
        break;
    case QCamera::ActiveState:
        LabCameraState->setText("摄像头state: ActiveState");
    }
    ui->pushButton_3->setEnabled(state!=QCamera::ActiveState) ;
    ui->pushButton_4->setEnabled(state==QCamera::ActiveState) ;

}

void CameraMainWindow::on_captureModeChanged(QCamera::CaptureModes mode)
{
    if (mode==QCamera::CaptureStillImage)
        LabCameraMode->setText("抓取模式: StillImage");
    else if (mode==QCamera::CaptureVideo)
        LabCameraMode->setText("抓取模式: Video");
    else
        LabCameraMode->setText("抓取模式:Viewfinder");

}

void CameraMainWindow::on_cameradurationChanged(qint64)
{

}

void CameraMainWindow::on_camerastateChanged(QMediaRecorder::State state)
{
    ui->pushButton_5->setEnabled(state!=QMediaRecorder::RecordingState);
    ui->pushButton_6->setEnabled(state==QMediaRecorder::RecordingState);
}

void CameraMainWindow::on_imageReadyForCapture(bool ready)
{
    ui->pushButton_2->setEnabled(ready);
}

void CameraMainWindow::on_imageCaptured(int id, const QImage &preview)
{

    Q_UNUSED(id) ;
    QImage scaledImage=preview.scaled(ui->LabCapturedImage->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation) ;
    ui ->LabCapturedImage->setPixmap(QPixmap::fromImage(scaledImage));

}

void CameraMainWindow::on_imageSaved(int id, const QString &fileName)
{
    LabInfo->setText("图片保存为:"+fileName);
}

void CameraMainWindow::on_pushButton_2_clicked()
{
    if (curCamera->captureMode()!=QCamera::CaptureStillImage)
    {
        curCamera->setCaptureMode(QCamera::CaptureStillImage);
    }

    imageCapture->capture();

}

void CameraMainWindow::on_pushButton_3_clicked()
{
    curCamera->start();
}

void CameraMainWindow::on_pushButton_4_clicked()
{
    curCamera->stop();
}
#include
#include 
#include 
#include 
//录制视频
void CameraMainWindow::on_pushButton_5_clicked()
{
    if(!mediaRecorder->isAvailable())
    {
        QMessageBox::information(this,"提示","不支持录屏",QMessageBox::Ok);
        return;
    }
    if(curCamera->captureMode()!=QCamera::CaptureVideo)
    {
        curCamera->setCaptureMode(QCamera::CaptureVideo);
    }
    QString selectedFile=ui->lineEdit->text();
    if(selectedFile.isEmpty())
        return;

    if(QFile::exists(selectedFile))
    {
        if(!QFile::remove(selectedFile))
        {
            QMessageBox::information(this,"提示","文件被占用",QMessageBox::Ok);
            return;
        }
    }
    mediaRecorder->setOutputLocation(QUrl::fromLocalFile(selectedFile));
    mediaRecorder->record();
}
//停止录像
void CameraMainWindow::on_pushButton_6_clicked()
{
    mediaRecorder->stop();
}


#ifndef CAMERAMAINWINDOW_H
#define CAMERAMAINWINDOW_H

#include 
#include
#include
#include
#include
#include
#include
namespace Ui {
class CameraMainWindow;
}

class CameraMainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit CameraMainWindow(QWidget *parent = 0);
    ~CameraMainWindow();

private:
    Ui::CameraMainWindow *ui;
    QCamera *curCamera=Q_NULLPTR;//
    QCameraImageCapture *imageCapture; //抓图
    QMediaRecorder* mediaRecorder;//录像
    QLabel*LabCameraState ;
    QLabel *LabInfo;
    QLabel *LabCameraMode;
    void iniCamera();//初始化
    void  iniImageCapture();//初始化静态画图
    void iniVideoRecorder ();//初始化视频录制
private slots:
    void on_stateChanged(QCamera::State state);
    void on_captureModeChanged(QCamera::CaptureModes);
    void on_cameradurationChanged(qint64);
    void on_camerastateChanged(QMediaRecorder::State);

    void on_imageReadyForCapture (bool ready);
    void  on_imageCaptured(int id,const QImage &preview) ;
    void on_imageSaved(int id, const QString &fileName) ;

    void on_pushButton_2_clicked();
    void on_pushButton_3_clicked();
    void on_pushButton_4_clicked();
    void on_pushButton_5_clicked();
    void on_pushButton_6_clicked();

};

#endif // CAMERAMAINWINDOW_H

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zaji/5713487.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存