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

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

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


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.csdn.net/download/weixin_43793181/13507051

猜你喜欢

转载自blog.csdn.net/weixin_43793181/article/details/110824962