Qt有专门用于开启摄像头的库,使用方式如下:
一,先在项目工程文件pro中添加模块
QT += multimedia multimediawidgets
二,再在头文件包含一下头文件:
#include <QCamera>
#include <QCameraViewfinder>
#include <QCameraImageCapture>
#include <QCameraInfo>
并添加摄像头相关的成员指针
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操作摄像头源码