文档章节

Qt5 摄像头

 问道嵌入式
发布于 2017/04/11 13:52
字数 1743
阅读 201
收藏 0

参考了网上几篇关于Qt调用摄像头博客后,决定将他们离散的、不成系统的知识点梳理一下,方便大家学习。

Qt中有一个模块叫Qt Multimedia,Qt 通过Qt Multimedia 模块提供一套丰富的QML类型和C++类去处理多媒体内容。该模块分成了以下两个子模块:

Qt Multimedia :Provides API for multimedia-specific use cases.

Qt Multimedia Widgets :Provides the widget-based multimedia API.

使用时,qmake工程文件需加入以下两个模块:

QT += multimedia multimediawidgets

且需添加头文件:

#include <QtMultimedia>

#include <QtMultimediaWidgets>

如果你只是用了该模块中的几个类,qt官方文档推荐你只需包含你用到的类即可。

Qt multimedia模块基于不同的平台抽象出多媒体接口来实现平台相关的特性和硬件加速。

接口功能覆盖了播放视频音频,录制视频音频,其中包括多种多媒体封装格式,同样支持类似于 camera,耳机,麦克风,收音机等设备。

以下是Qt Multimedia提供的类:

Class Description

QAudioOutput:Sends audio data to an audio output device(向一个音频输出设备发送音频数据)

QAudioRecorder:Record media content from an audio source.(从一个音频源解码多媒体内容)

QCamera:Access camera viewfinder.(获取摄像头取景器)

QCameraImageCapture:Capture still images with a camera.(用摄像头获取静态图像)

QMediaRecorder:Record media content from a camera or radio tuner source.

QMediaPlayer:Playback media from a source.(从一个源播放音视频)

QMediaPlaylist:List of media to be played.(待播放的多媒体列表)

QRadioTuner:Access radio device.(获取无线设备)

QAbstractVideoSurface:Base class for video presentation.

特性: 

下面列举一些通过Multimedia APIs可以实现的功能:

  • 访问音频输入,输出设备
  • 播放低延时音效
  • 支持多媒体播放列表
  • 音频视频编码
  • 收音机功能
  • 支持camera的预览,拍照,录像等功能。
  • 播放 3D positional audio
  • 解码音频视频到内存或者文件
  • 获取正在录制或者播放的音频和视频数据

Qt Multimedia内容着实丰富,在此我仅介绍其冰山一角。

1.QCameraInfo

Header:#include <QCameraInfo> 

qmake:QT += multimedia

Since:Qt 5.3 表明是5.3版本之后才加入

构造函数:

QCameraInfo(const QCamera &camera)

QCameraInfo(const QCameraInfo &other)

该类提供了一个静态成员函数availableCameras()获取所有可用的摄像头。

QList<QCameraInfo> availableCameras(QCamera::Positionposition=QCamera::UnspecifiedPosition)

这个类可以让我们查询系统目前可用的摄像头设备,获取它们的一般信息。下面的例子实例化了一个设备名叫‘mycamera‘’的QCamera类。

QList<QCameraInfo> cameras = QCameraInfo::availableCameras();

foreach (const QCameraInfo &cameraInfo, cameras) {
if (cameraInfo.deviceName() == "mycamera")
camera = new QCamera(cameraInfo);
}
下面德尔例子打印了系统所有可用的摄像头设备名
#include <QApplication>
#include <QCamera>
#include <QCameraInfo>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QList<QCameraInfo> cameras = QCameraInfo::availableCameras();
QList<QCameraInfo>::iterator cameras_iter = cameras.begin();
for(;cameras_iter != cameras.end();cameras_iter++)
    qDebug()<<cameras_iter->deviceName()<<"\n"<<cameras_iter->description();//打印设备名字和人能读懂的描述信息。
    qDebug()<<QCameraInfo::defaultCamera().description();//查看系统默认的摄像头
return a.exec();
}
输出结果:
"@device:pnp:\\\\?\\usb#vid_046d&pid_082b&mi_00#6&347a7f68&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\\global" 
 "Webcam C170"
"@device:pnp:\\\\?\\usb#vid_04f2&pid_b2e1&mi_00#7&985b7cf&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\\global" 
 "Lenovo EasyCamera"
 "Lenovo EasyCamera"

这个类比较简单,掌握两个静态成员函数,知道如何构造即可。

2.QCameraViewfinder

该类提供一个摄像头取景构件。意思就是为QCamera对象显示照片提供一个容器。

QCameraViewfinder *viewfinder = new QCameraViewfinder();

还需要与摄像头关联,后面介绍。

3.QCameraImageCapture

该类用来记录多媒体内容,一般不单独使用,而是跟其他media对象结合使用。从他的构造函数就可以看出这一点。

QCameraImageCapture::QCameraImageCapture(QMediaObject *mediaObject, QObject *parent = Q_NULLPTR)

构造一个多媒体对象,用来记录mediaObject产生的多媒体流。

下面介绍几个常用的成员函数。

3.1QStringList QCameraImageCapture::supportedImageCodecs() const

打印支持的图片解码

3.2 int QCameraImageCapture::capture(const QString &file = QString())

该函数很重要,

3.3 isreadyForCapture : const bool 查看摄像头是否可以捕捉。

3.4 QString QCameraImageCapture::imageCodecDescription(const QString &codec) const

Returns a description of an image codec.,获取指定的图像解码描述信息。

几个重要的信号:

[signal] void QCameraImageCapture::imageCaptured(int id, const QImage &preview)

 

Signal emitted when the frame with request id was captured, but not processed and saved yet. Frame preview can be displayed to user.

调用capture函数后会触发该信号,该信号的两个参数存储着帧信息。我们可以自己为该信号写一个槽函数,将该帧显示或者保存。

4.QCamera

Header:#include <QCamera>

qmake:

QT += multimedia

Inherits:QMediaObject

QCamera为系统摄像头设备提供了接口,和QCameraViewfinder结合使用可以显示图片,和QMediaRecorder结合可以录制视频,和QCameraImageCapture结合可以拍照。这个类比较复杂,我仅学习重要的部分。

定义的类型:

捕捉模式:enum CaptureMode { CaptureViewfinder, CaptureStillImage, CaptureVideo }

状态:enum State { UnloadedState, LoadedState, ActiveState }

分别是:

1.摄像头的初始状态,这种状态可以设置摄像头的解码方式、解决方案、帧率。

2.同1,不过摄像头已经加载

3..成功调用start()后进入的状态

公有成员函数:

void setCaptureMode(QCamera::CaptureModes mode) 设置捕捉模式,可以在任何时候调用

CaptureModes captureMode() const 获取捕捉模式

QCameraViewfinderSettings QCamera::viewfinderSettings() const查看摄像头的显示设置

公有槽:

start()启动摄像头,如果成功启动,摄像头的状态变为QCamera::ActiveState,失败则发射error()信号。

[slot] void QCamera::stop()停止摄像头,使它的状态从 QCamera::ActiveState t变为 QCamera::LoadedState.

5.QCameraViewfinderSettings

Header:#include <QCameraViewfinderSettings>

qmake:QT += multimedia

Since:Qt 5.5(新特性)

该类用于设置QCamera使用的viewfinder。如何设置呢?就是利用QCamera::setViewfinderSetting()函数将我们构造的QCameraViewfinder对象传入。

QCameraViewfinder对象包含了viewfinder的一些属性设置。例子:

QCameraViewfinderSettings viewfinderSettings;

viewfinderSettings.setResolution(640, 480);//设置大小
viewfinderSettings.setMinimumFrameRate(15.0);//设置最小帧率(帧/秒)
viewfinderSettings.setMaximumFrameRate(30.0);
camera->setViewfinderSettings(viewfinderSettings);

void QCameraViewfinderSettings::setPixelFormat(QVideoFrame::PixelFormat format)用于设置像素格式,QVideoFrame::PixelFormat QCameraViewfinderSettings::pixelFormat() const则用于获取像素格式。

最后来个综合实例,涵盖上述介绍的三个类。

.cpp文件如下:

#include "MainWin.h"

MainWin::MainWin(QWidget *parent)

: QWidget(parent)

{

ui.setupUi(this);

camera = new QCamera(this);

viewfinder = new QCameraViewfinder();

imageCapture = new QCameraImageCapture(camera);

ui.horizontalLayout->addWidget(viewfinder);

ui.label_Display->setScaledContents(true);//设置显示比例自动缩放

camera->setViewfinder(viewfinder);//为摄像头对象设置显示的容器

camera->start();//启动摄像头

connect(imageCapture, SIGNAL(imageCaptured(int, QImage)), this, SLOT(displayImage(int, QImage)));//连接图片捕获信号到我们自己写的槽函数

connect(ui.pushButton_Capture, SIGNAL(clicked()), this, SLOT(captureImage()));

connect(ui.pushButton_Save, SIGNAL(clicked()), this, SLOT(saveImage()));

connect(ui.pushButton_Quit, SIGNAL(clicked()), qApp, SLOT(quit()));

}

MainWin::~MainWin()

{

}

void MainWin::captureImage()

{

//ui->statusBar->showMessage(tr("正在捕获图片"), 1000);

imageCapture->capture();//调用Qt提供的槽函数捕捉照片

}

void MainWin::displayImage(int, QImage image)

{

ui.label_Display->setPixmap(QPixmap::fromImage(image));

// ui->statusBar->showMessage(tr("捕获成功"), 5000);

}

void MainWin::saveImage()

{

QString fileName = QFileDialog::getSaveFileName(this, tr("保存到文件"), QDir::homePath(), tr("jpeg格式文件(*.jpg)"));

if (fileName.isEmpty()) {

//ui->statusBar->showMessage(tr("保存操作已取消"), 5000);

return;

}

const QPixmap* pixmap = ui.label_Display->pixmap();

if (pixmap) {

pixmap->save(fileName);

//ui->statusBar->showMessage(tr("保存成功"), 5000);

}

}

程序运行如下:

© 著作权归作者所有

粉丝 0
博文 1
码字总数 1743
作品 0
广州
私信 提问
VLC media player 2.2 发布,引入新组件管理器

VLC media player 2.2 发布,此版本改进了插件功能,引入了新的组件管理器。 组件管理器 (Image: Ghacks.net) 2.2.x 系列主要是改进桌面应用的航向,Qt5 移植和原生 VDPAU 硬件加速。 更多更...

oschina
2014/04/02
2.3K
6
跨平台视频播放库--QtAV

QtAV是基于Qt和FFmpeg的音视频播放库。开发者能够很容易基于QtAV编写播放器。支持常见的功能如播放、截图、暂停、快进快退、音量控制、播放网络流媒体等。目前支持的渲染方式有QPainter、Dir...

LucasWang
2013/03/04
15.5K
3
qml+opencv(一)

前言 突然想起opencv,一直想做人脸识别,可是理论基础太水,只能慢慢来,去年学习了一会,然后公司让我去搞app和网络,就一直搁着,现在学习qml,突然想能不能在qml里面使用opencv,所以就有...

首席吹牛官
2015/05/22
0
0
QtAV 1.5.0 发布,跨平台高性能音视频框架

QtAV 1.5.0 发布,更新内容如下: 加入QtAVWidgets模块。和QtMultimeida一样,QtAV模块只包含核心的功能,只依赖QtCore和QtGui。这样部署QtQuick应用可以去掉QtWidgets模块,大概小6M。QtAV模...

LucasWang
2015/02/14
4.4K
7
centos7 如何处理 libQt5Widgets.so.5 问题

今天一同事发过来一个报错信息,提示如下: error while loading shared libraries: libQt5Widgets.so.5: cannot open shared object file: No such file or directory 查了几个博客分享的解...

归来仍少年
2018/03/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

读书replay《maven实战》.1.20190526

前情提要 maven这个工具用了好久了,但是一直都用的迷迷糊糊的,没有对它进行过系统性的学习,只是知道一些常用的功能怎么实现,所以20190516这一天我从JD购买了徐晓斌老师所著的《maven实战...

wanxiangming
29分钟前
0
0
真实项目案例实战——【状态设计模式】使用场景

什么是状态模式 状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样。 状态模式应用场景 1.一个对象的行为取决于它的状态,并且它必须在运行时刻根...

须臾之余
35分钟前
0
0
Java 实现把字符串转换成整数【底层实现】

https://blog.csdn.net/zl18310999566/article/details/80263396

qimh
39分钟前
0
0
IDEA的debugger

1、win下节省内存空间 3、条件断点

一只小青蛙
49分钟前
3
0
炸!亿级数据DB秒级平滑扩容

一步一步,娓娓道来。 一般来说,并发量大,吞吐量大的互联网分层架构是怎么样的? 数据库上层都有一个微服务,服务层记录“业务库”与“数据库实例配置”的映射关系,通过数据库连接池向数据...

编程SHA
55分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部