学习内容:
- Qt5
- c++
学习产出:
一、介绍:
该部分主要实现了在Linux系统下,通过QT对multimedia、multimediawidgets库的使用,打开摄像头获取图像并显示在对应窗口,点击指定按钮时实现截图保存与显示。
- 首先设计UI界面的主要控件,包括:用于显示摄像头信息,图片保存路径的文本框,“开始”按钮,“停止”按钮,“截屏”按钮,分别对应的功能为:摄像头开始采集图片数据;摄像头停止采集图片数据;截出当前界面摄像头画面。然后将三个按钮分别转到槽函数实现对应的功能。
- .pro文件中需要添加QT +=multimedia和QT+=multimediawidgets,Qt Multimedia模块主要为实现多媒体应用提供了丰富的接口,可以轻松地使用Ubuntu平台的相机和收音机等。QVideoWidget继承自QWidget,所以它可以作为一个普通窗口部件进行显示,也可以嵌入到其它窗口中。将QVideoWidget指定为QMediaPlayer的视频输出窗口后,就可以显示播放的视频画面。
- 在“开始”按钮的触发函数中,首先通过qcamera(基于qt平台用于读取计算机摄像头视频信号的接口函数)获取当前可用摄像头信息,并显示给comboBox控件,方便用户观察摄像头信息。构造摄像头对象、截屏对象,将显示图像对应的label控件和槽函数连接起来。并设置显示的方式为自适应控件大小。将断开摄像头的信号与相应的函数连接(disconnect)。截屏功能的实现首先把QImage转换成QPixmap,然后将图片保存在指定路径位置,并将路径位置显示在UI界面的label框里,分别完成截屏图像和路径位置对应label框槽函数的连接,注意绑定显示的具体内容,图片格式和路径格式。
二、实现
1.首先需要在.pro文件中添加
QT +=multimedia
QT+=multimediawidgets
2.mycamera.h
#ifndef MYCAMERA_H
#define MYCAMERA_H
#include <QWidget>
#include <QCameraInfo>
#include <QCamera>
#include <QVideoWidget>
#include <QCameraViewfinder>
#include <QCameraImageCapture>
QT_BEGIN_NAMESPACE
namespace Ui { class MyCamera; }
QT_END_NAMESPACE
class MyCamera : public QWidget
{
Q_OBJECT
public:
MyCamera(QWidget *parent = nullptr);
~MyCamera();
private slots:
void on_pushButton_start_clicked();
void on_pushButton_stop_clicked();
void on_pushButton_capture_clicked();
//显示图片
void show_pic(int id, const QImage &preview);
private:
Ui::MyCamera *ui;
QCamera *ca;//摄像头对象
QCameraViewfinder *w;
QCameraImageCapture *cap;//截屏对象
};
#endif // MYCAMERA_H
3.mycamera.cpp
#include "mycamera.h"
#include "ui_mycamera.h"
#include <QDebug>
#include <QDir>
MyCamera::MyCamera(QWidget *parent)
: QWidget(parent)
, ui(new Ui::MyCamera)
{
ui->setupUi(this);
//获取系统中可用的摄像头信息
QList<QCameraInfo> infos = QCameraInfo::availableCameras();
//显示到下拉列表
foreach(QCameraInfo info,infos){
qDebug()<<info.deviceName()<<info.description();
//把摄像头设备名加入列表
ui->comboBox->addItem(info.deviceName());
}
ui->pushButton_stop->setEnabled(false);
ui->pushButton_capture->setEnabled(false);
}
MyCamera::~MyCamera()
{
delete ui;
}
//开始
void MyCamera::on_pushButton_start_clicked()
{
//构造摄像头对象
ca = new QCamera(ui->comboBox->currentText().toUtf8(),this);
//构造截屏对象
cap = new QCameraImageCapture(ca,this);
//连接截屏信号和显示截屏图像的槽
QObject::connect(cap,&QCameraImageCapture::imageCaptured,this,&MyCamera::show_pic);
#if 0
//使用父类对象构造显示窗口类
w = new QVideoWidget(ui->label);
#else
w = new QCameraViewfinder(ui->label);//定义取景器指针对象
#endif
//调整大小一致
w->resize(ui->label->size());
//设置摄像头的显示窗口
ca->setViewfinder(w);
w->show();
//启动摄像头
ca->start();
//禁止开始按钮
ui->pushButton_start->setEnabled(false);
ui->pushButton_stop->setEnabled(true);
ui->pushButton_capture->setEnabled(true);
}
//停止
void MyCamera::on_pushButton_stop_clicked()
{
//停止摄像头
ca->stop();
//隐藏显示窗口
w->hide();
//断开信号
QObject::disconnect(cap,&QCameraImageCapture::imageCaptured,this,&MyCamera::show_pic);
delete w;
delete cap;
delete ca;
ui->pushButton_start->setEnabled(true);
ui->pushButton_stop->setEnabled(false);
ui->pushButton_capture->setEnabled(false);
}
//截屏
void MyCamera::on_pushButton_capture_clicked()
{
cap->capture();
//不能立即显示图片
}
//显示截屏图片
void MyCamera::show_pic(int id, const QImage &preview)
{
qDebug()<<id;
//把QImage转换成QPixmap
QPixmap pix = QPixmap::fromImage(preview);
//保存图片
QString picpath = QString("/home/kkk/桌面/tt.jpg").arg(id);
pix.save(picpath);
ui->lineEdit_2->setText(picpath);
//显示
pix = pix.scaled(ui->label->size());
ui->label_2->setPixmap(pix);
}
4.mycamera.ui
另外一种直接调用Ubuntu摄像头保存图片的方法:
打开shell终端,输入命令安装cheese工具。cheese工具就可以打开摄像头。
(1)在终端输入命令:sudo apt-get install cheese
(2)启动cheese工具
在终端输入命令:cheese
可以右键选择保存特定的储存路径
参考文章:
在Linux系统下QT获取摄像头图像,显示在对应窗口_佳佳鸽的博客-CSDN博客_linux下使用qt获取所有外接摄像头名称