linux下打开摄像头拍照并保存图片+Ubuntu

本文介绍了如何在Linux环境下使用Qt5的multimedia和multimediawidgets库来操作摄像头,包括打开摄像头显示图像、停止采集、截图保存,并展示了关键代码实现,包括UI设计、摄像头对象创建、截屏功能等。
摘要由CSDN通过智能技术生成


学习内容:

  1. Qt5
  2. c++

学习产出:

一、介绍:

该部分主要实现了在Linux系统下,通过QT对multimedia、multimediawidgets库的使用,打开摄像头获取图像并显示在对应窗口,点击指定按钮时实现截图保存与显示。

  1.  首先设计UI界面的主要控件,包括:用于显示摄像头信息,图片保存路径的文本框,“开始”按钮,“停止”按钮,“截屏”按钮,分别对应的功能为:摄像头开始采集图片数据;摄像头停止采集图片数据;截出当前界面摄像头画面。然后将三个按钮分别转到槽函数实现对应的功能。
  2. .pro文件中需要添加QT +=multimedia和QT+=multimediawidgets,Qt Multimedia模块主要为实现多媒体应用提供了丰富的接口,可以轻松地使用Ubuntu平台的相机和收音机等。QVideoWidget继承自QWidget,所以它可以作为一个普通窗口部件进行显示,也可以嵌入到其它窗口中。将QVideoWidget指定为QMediaPlayer的视频输出窗口后,就可以显示播放的视频画面。
  3. 在“开始”按钮的触发函数中,首先通过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获取所有外接摄像头名称

虚拟机内Ubuntu如何打开摄像头+解决cheese工具黑屏问题_熊凯瑞的博客-CSDN博客_ubuntu打开摄像头

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值