QT+opencv4实时获取摄像头的图像展示并附带截图功能

opencv更新到了最新的版本,原有的opencv3在视频方面的写法和opencv4有许多区别,特此写一篇博客来记录。
源码展示:
首先是pro文件,这里lib里没有opencv文件了,只存在opencv2

INCLUDEPATH += D:\opencv\build\include
INCLUDEPATH += D:\opencv\build\include\opencv2\

LIBS += D:\opencv\build\lib\libopencv_*.a

然后是.h文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QImage>
#include <QDebug>
#include <QTimer>
#include <QPixmap>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc_c.h>
#include <opencv2/imgproc/types_c.h>

using namespace cv;

QT_BEGIN_NAMESPACE
namespace Ui {
    
     class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    
    
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    QImage Mat2QImage(const Mat &mat);

private slots:
    void on_opencamera_clicked();//打开摄像头
    void readFrame();//读取一帧
    void on_closecamera_clicked();//关闭摄像头
    void on_getImg_clicked();//获取截图

private:
    Ui::Widget *ui;
    QTimer *timer;//计时器
    QImage imag;//用QImage形式记录的图片
    VideoCapture cam;//视频捕捉
    Mat frame;//用mat形式记录的图片
    void init();

};
#endif // WIDGET_H

具体实现:

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    
    
    ui->setupUi(this);
    init();
}

void Widget::init()
{
    
    
    timer = new QTimer(this);
    connect(timer,&QTimer::timeout,this,&Widget::readFrame);//超时就捕捉一张图片
}
Widget::~Widget()
{
    
    
    delete ui;
}

QImage Widget::Mat2QImage(const Mat &mat)//mat转QImage
{
    
    
    if(mat.type()==CV_8UC1)
    {
    
    
        QVector<QRgb>colorTable;
        for(int i=0;i<256;i++)
            colorTable.push_back(qRgb(i,i,i));
        const uchar*qImageBuffer=(const uchar*)mat.data;
        QImage img(qImageBuffer,mat.cols,mat.rows,mat.step,QImage::Format_Indexed8);
        img.setColorTable(colorTable);
        return img;
    }
    //8-bitsunsigned,NO.OFCHANNELS=3
    if(mat.type()==CV_8UC3)
    {
    
    
        const uchar*qImageBuffer=(const uchar*)mat.data;
        QImage img(qImageBuffer,mat.cols,mat.rows,mat.step,QImage::Format_RGB888);
        return  img.rgbSwapped();
    }
    else
    {
    
    
        qDebug()<<"ERROR:MatcouldnotbeconvertedtoQImage.";
        return QImage();
    }
}

void Widget::on_opencamera_clicked()//打开摄像头
{
    
    

    cam.open(0);
    timer->start(33);        // 开始计时
}

void Widget::readFrame(){
    
    //读取帧并显示

    cam>>frame;
    imag = Mat2QImage(frame);
    ui->video_label->setPixmap(QPixmap::fromImage(imag));
}

void Widget::on_closecamera_clicked()//关闭摄像头
{
    
    
    cam.release();
}

void Widget::on_getImg_clicked()//截图
{
    
    
    imag.save("d:\\2.png");//将图片保存
}

ui界面:
在这里插入图片描述
实际运行效果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/naiue/article/details/114269321