在Linux系统下QT获取摄像头图像,显示在对应窗口

该博客展示了如何在Linux环境下利用QT库与multimedia、multimediawidgets模块,实现摄像头的开启、关闭及截图功能。通过QCamera、QCameraViewfinder和QCameraImageCapture类,用户可以选取系统中的摄像头,点击按钮启动和停止摄像头,并进行实时显示。同时,提供了截图功能,点击按钮即可保存并显示所捕获的图像。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

完整工程代码:https://download.youkuaiyun.com/download/weixin_43793181/20325195

界面效果如下:
在这里插入图片描述


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;//摄像头对象
    //QVideoWidget *w;
    QCameraViewfinder *w;
    QCameraImageCapture *cap;//截屏对象
};
#endif // MYCAMERA_H



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->widget);

#else
    w = new QCameraViewfinder(ui->widget);

#endif
    //调整大小一致
    w->resize(ui->widget->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("./%1.jpg").arg(id);
    pix.save(picpath);

    //显示
    pix = pix.scaled(ui->label->size());
    ui->label->setPixmap(pix);
}



main.cpp

#include "mycamera.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyCamera w;
    w.show();
    return a.exec();
}



完整工程代码:https://download.youkuaiyun.com/download/weixin_43793181/20325195

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

佳佳鸽

若文章帮到你,能不能请我喝杯茶

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值