Qt用QCamera操作摄像头-实现预览拍照

Qt有专门用于开启摄像头的库,使用方式如下:
一,先在项目工程文件pro中添加模块

QT += multimedia multimediawidgets

二,再在头文件包含一下头文件:

#include 
#include 
#include 
#include 

并添加摄像头相关的成员指针

    QCamera *m_camera = nullptr;
    QCameraImageCapture *m_imageCapture = nullptr;
    QCameraViewfinder *m_viewFinder = nullptr;

三,函数实现打开摄像头功能
界面上添加QLabel标签labelCamera,用于摄像头开启预览;

void MainWindow::on_btOpen_clicked()
{
    QList<QCameraInfo> cameras = QCameraInfo::availableCameras();
    for(const QCameraInfo &cameraInfo : cameras)
    {
        qDebug() << "CameraInfo:" << cameraInfo;
    }
    if(cameras.size() < 1)
    {
        QMessageBox::information(NULL, "title", "No Camera!!!", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
        return;
    }
    if(m_camera == nullptr)
        m_camera = new QCamera(cameras[cameras.size()-1], this); // 摄像头对象

    if(m_viewFinder == nullptr)
        m_viewFinder = new QCameraViewfinder(ui->labelCamera); // 用于实时显示摄像头图像
    // 使 viewfinder 能够使用 QSS
    m_viewFinder->setAttribute(Qt::WA_StyledBackground, true);
    m_viewFinder->resize(ui->labelCamera->size());
    m_camera->setViewfinder(m_viewFinder); // camera 使用 viewfinder 实时显示图像

    m_camera->setCaptureMode(QCamera::CaptureStillImage);//将其采集为图片
    //m_camera->setCaptureMode(QCamera::CaptureMode::CaptureViewfinder);//将采集到取景器中
    m_camera->setViewfinder(m_viewFinder);
    m_viewFinder->show();
    m_camera->start();
    //ui->labelCamera->raise();//最上层
}

四,关闭摄像头

void MainWindow::on_btClose_clicked()
{
    if(nullptr != m_camera)
        m_camera->stop();
    if(nullptr != m_viewFinder)
        m_viewFinder->close();
}

五,拍照

void MainWindow::on_btPlay_clicked()
{
    QString  strFilePath = QCoreApplication::applicationDirPath();
    if(m_imageCapture == nullptr)
        m_imageCapture = new QCameraImageCapture(m_camera); // 用于截取摄像头图像

//    if (m_imageCapture->isCaptureDestinationSupported(QCameraImageCapture::CaptureToBuffer))
//    {
//        m_imageCapture->setCaptureDestination(QCameraImageCapture::CaptureToBuffer);    //保存在缓存,自行保存到文件,避免卡顿
//    }
//    else
    {
       m_imageCapture->setCaptureDestination(QCameraImageCapture::CaptureToFile);
    }
    m_camera->searchAndLock();
    QDateTime time = QDateTime::currentDateTime();
    QString strFileName = time.toString("yy-MM-dd hh-mm-ss");
    strFilePath += "/" + strFileName + ".jpg";
    m_imageCapture->capture(strFilePath);
    m_camera->unlock();

    QElapsedTimer t;
    t.start();
    while(t.elapsed()<20)
        QCoreApplication::processEvents();
    //QThread::sleep(1);
    QFileInfo fileInfo(strFilePath);
    if(!fileInfo.exists())
    {
        QMessageBox::information(NULL, "title", "Saving!!!", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
    }

}

整个工程源码下载:
Qt操作摄像头源码

你可能感兴趣的:(qt学习,qt,开发语言)