Qt之摄像头调用

QT可以直接调用本地摄像头,同时可以进行截图。用到如下三个类

  • QCamera:物理摄像头
  • QCameraViewfinder:摄像头取景器
  • QCameraImageCapture:截图工具

最终效果如下所示

下面来介绍上述功能的实现过程

首先在.pro文件中添加如下内容

QT       += multimedia

QT       += multimediawidgets

编写.h文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
class QLabel;
class QCameraImageCapture;
class QCameraViewfinder;
class QCamera;
class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();


public slots:
    void capture_image();
    void display_image(int id, QImage image);
    void save_image();



private:
    QLabel * image_captured;
    QCameraImageCapture * image_capturer;
    QCameraViewfinder * viewfinder;
    QCamera * camera;
};

#endif // WIDGET_H

编写.c文件

#include "widget.h"
#include "QCamera"
#include "QCameraViewfinder"
#include "QCameraImageCapture"
#include "QHBoxLayout"
#include "QGridLayout"
#include "QPushButton"
#include "QLabel"
#include "QVBoxLayout"
#include "QHBoxLayout"
#include "QDir"
#include "QFileDialog"
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    camera = new QCamera(this);
    camera->setCaptureMode(QCamera::CaptureStillImage);
    //摄像头调用器

    viewfinder=new QCameraViewfinder(this);
    viewfinder->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    //视频观察窗口

    image_capturer=new QCameraImageCapture(camera);
    image_capturer->setCaptureDestination(QCameraImageCapture::CaptureToFile);
    //截图工具

    image_captured = new QLabel;
    image_captured->setFixedSize(300, 300);
    image_captured->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
    image_captured->setScaledContents(true);
    //截图显示

    QPushButton * capture_btn = new QPushButton("截图");
    capture_btn->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
    //截图按钮

    QPushButton * save_btn = new QPushButton("保存");
    save_btn->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
    //保存按钮

    QVBoxLayout *vlayout = new QVBoxLayout();
    vlayout->addWidget(image_captured);
    vlayout->addStretch();
    vlayout->addWidget(save_btn);
    vlayout->addWidget(capture_btn);
    //工具栏布局

    camera->setViewfinder(viewfinder);
    camera->start();
    //开始拍摄

    QHBoxLayout * layout = new QHBoxLayout();
    layout->addWidget(viewfinder);
    layout->addLayout(vlayout);
    this->setLayout(layout);
    //最外层布局

    this->resize(1000, 500);

    connect(capture_btn, &QPushButton::clicked , this, &Widget::capture_image );
    connect(image_capturer, &QCameraImageCapture::imageCaptured, this, &Widget::display_image);
    connect(save_btn, &QPushButton::clicked, this, &Widget::save_image);
}

Widget::~Widget()
{

}

void Widget::capture_image()
{
    image_capturer->capture();
}

void Widget::display_image(int id, QImage image)
{
    image_captured->setPixmap(QPixmap::fromImage(image));

}

void Widget::save_image()
{

    QString fileName = QFileDialog::getSaveFileName(this, QString::fromLocal8Bit("Save picture"),
                                                    QDir::currentPath(),
                                                    tr("Images (*.png *.xpm *.jpg)"));
    const QPixmap *pixmap = image_captured->pixmap();
    if(pixmap)
    {
        pixmap->save(fileName);
    }
}

大功告成

  • 5
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值