一、前置说明
限制:
QT 相机 QCamera:只提供了有限的相机支持,如 取景器显示 和 拍照功能,大部分相机控制功能没有实现。
在 win7 上,无法用 QCamera 实现 视频录制功能
使用的类的说明:
QCamera 类用于打开系统的摄像头设备,
QCameraViewfinder 用于显示捕获的视频,
QCameraImageCapture 用于截图。
二、成果展示:
三、代码
0、前置:
在 pro 文件中加上一个依赖 QT += multimediawidgets
1、main.cpp
#include "CameraWidget.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
CameraWidget w;
w.show();
return a.exec();
}
2、CameraWidget.h
#ifndef CAMERAWIDGET_H
#define CAMERAWIDGET_H
#include <QWidget>
class QCamera;
class QCameraViewfinder;
class QCameraImageCapture;
namespace Ui {
class CameraWidget;
}
class CameraWidget : public QWidget
{
Q_OBJECT
public:
explicit CameraWidget(QWidget *parent = 0);
~CameraWidget();
private slots:
void on_pushButton_clicked();
private:
Ui::CameraWidget *ui;
QCamera *camera;
QCameraViewfinder *viewfinder;
QCameraImageCapture *imageCapture;
};
#endif // CAMERAWIDGET_H
3、CameraWidget.cpp
#include "CameraWidget.h"
#include "ui_CameraWidget.h"
#include <QtMultimedia/QCameraInfo>
#include <QtMultimediaWidgets/QCameraViewfinder>
#include <QtMultimedia/QCameraImageCapture>
#include <QFileDialog>
#include <QDebug>
CameraWidget::CameraWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::CameraWidget)
{
ui->setupUi(this);
// 获取默认相机设备信息;
QCameraInfo dc = QCameraInfo::defaultCamera();
qDebug() << dc.description();
// 获取所有可用相机列表;
QList<QCameraInfo> cameras = QCameraInfo::availableCameras();
if(cameras.count() > 0) {
foreach (const QCameraInfo &cameraInfo, cameras) {
qDebug() << cameraInfo.description(); //相机描述信息;
qDebug() << cameraInfo.deviceName(); //设备的唯一 ID,一串杂乱的编码;
}
camera = new QCamera(cameras.at(0));
}
viewfinder = new QCameraViewfinder(this);
// 设置取景部件,普通部件使用 QCameraViewfinder;
// 图形视图框架中使用 QGraphicsVideoItem;
camera->setViewfinder(viewfinder);
viewfinder->resize(600, 350);
// QCameraImageCapture图像录制类,进行拍照;
imageCapture = new QCameraImageCapture(camera);
camera->start();
}
CameraWidget::~CameraWidget()
{
delete ui;
}
// 拍照按钮;
void CameraWidget::on_pushButton_clicked()
{
camera->setCaptureMode(QCamera::CaptureStillImage);
QString fileName = QFileDialog::getSaveFileName();
// 捕捉图片时,先对相机进行锁定,完成捕捉后在进行解锁;
camera->searchAndLock();
// 捕捉图片并保存,异步函数,必须使用绝对路径;
// 如果没有使用绝对路径,会将图片保存至默认目录;
imageCapture->capture(fileName);
camera->unlock();
}
4、CameraWidget.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>CameraWidget</class>
<widget class="QWidget" name="CameraWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>600</width>
<height>400</height>
</rect>
</property>
<property name="windowTitle">
<string>Widget</string>
</property>
<widget class="QPushButton" name="pushButton">
<property name="geometry">
<rect>
<x>500</x>
<y>360</y>
<width>75</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>拍照</string>
</property>
</widget>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources/>
<connections/>
</ui>