1. 核心代码
#ifndef FRAMECOTHREAD_H
#define FRAMECOTHREAD_H
#include <QThread>
#include <QTimer>
#include <QString>
#include <QLabel>
#include "opencv.hpp"
using namespace cv;
#include "CommDef.h"
class FrameCoThread : public QThread
{
Q_OBJECT
public:
FrameCoThread();
FrameCoThread(QString url, QString strategy = COLLECTIONSTRATEGY_OPENCV, int interval = 50);
~FrameCoThread();
public:
void setUrl(QString url = CAPLOCAL);
void setStategy(const QString &stategy = COLLECTIONSTRATEGY_OPENCV);
void setInterval(int interval = 50);
void setDisplayWidget(QLabel *widget);
protected:
void run();
private:
void openCVRun();
signals:
private slots:
void updateImg();
private:
QTimer _timer;
Mat _srcImge;
VideoCapture _videocap;
QString _url; // 视频流地址
QString _strategy; // 采集方式
int _interval; // 采集频率
QLabel *_showLabel; // 显示控件
};
#endif // FRAMECOTHREAD_H
#include "FrameCoThread.h"
FrameCoThread::FrameCoThread()
{
}
FrameCoThread::FrameCoThread(QString url, QString strategy, int interval)
{
_url = url;
_strategy = strategy;
_interval = interval;
connect(&_timer, SIGNAL(timeout()), this, SLOT(updateImg()));
_timer.start(_interval);
}
FrameCoThread::~FrameCoThread()
{
}
void FrameCoThread::setUrl(QString url)
{
_url = url;
}
void FrameCoThread::setStategy(const QString &stategy)
{
_strategy = stategy;
}
void FrameCoThread::setInterval(int interval)
{
_interval = interval;
}
void FrameCoThread::setDisplayWidget(QLabel *widget)
{
_showLabel = widget;
}
void FrameCoThread::run()
{
if (COLLECTIONSTRATEGY_OPENCV == _strategy) {
openCVRun();
}
}
void FrameCoThread::openCVRun()
{
if (CAPLOCAL == _url) {
//从摄像头捕获视频
if(_videocap.open(0))
{
_srcImge = Mat::zeros(_videocap.get(CAP_PROP_FRAME_HEIGHT), _videocap.get(CAP_PROP_FRAME_WIDTH), CV_8UC3);
}
}
}
void FrameCoThread::updateImg()
{
if (!_videocap.isOpened())
return;
_videocap >> _srcImge;
if (_srcImge.data) {
QImage image2 = QImage((uchar*)(_srcImge.data), _srcImge.cols, _srcImge.rows, QImage::Format_RGB888);
_showLabel->setPixmap(QPixmap::fromImage(image2));
// _showLabel->resize(image2.size());
_showLabel->update();
}
}
2. Qt5.10 + Opencv4.01可直接编译运行完整工程代码
Opencv4.01需独立安装:Download opencv-4.0.1-vc14_vc15.exe (OpenCV)
完整工程代码:https://download.csdn.net/download/superyang_/10940189