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界面:
实际运行效果: