Qt捕获Opencv窗体并加载到界面
1、Qt捕获Opencv窗体cv::imshow并加载到界面
2、使用OpenCV、RTSP打开摄像头
3、适合初学者,涉及到Hand句柄基础知识,请自行查找
4、本人使用Qt5.10.0、vs2015、opencv3.4.3,必须在运行根目录添加opencv动态库或将此库添加环境变量
代码:
********************CaptureOpenCVWindow.pro********************
#-------------------------------------------------
#
# Project created by QtCreator 2020-05-12T11:02:32
#
#-------------------------------------------------
QT += core gui
#CONFIG += console
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = CaptureOpenCVWindow
TEMPLATE = app
# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp \
mainwindow.cpp \
readvideo.cpp
HEADERS += \
mainwindow.h \
readvideo.h
FORMS +=
INCLUDEPATH += \
D:\Softwares\opencv3.4.3\build\include\
D:\Softwares\opencv3.4.3\build\include\opencv\
D:\Softwares\opencv3.4.3\build\include\opencv2\
win32:CONFIG(release, debug|release): LIBS += -LD:/Softwares/opencv3.4.3/build/x64/vc15/lib/ -lopencv_world343
else:win32:CONFIG(debug, debug|release): LIBS += -LD:/Softwares/opencv3.4.3/build/x64/vc15/lib/ -lopencv_world343d
********************main.cpp********************
#include "mainwindow.h"
#include
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
const char *c1 = "rtsp://admin:zhhh6052@10.0.105.101:554/cam/realmonitor?channel=1&subtype=0";
const char *c2 = "view";
MainWindow w(c1, c2);
//printf("%s, %s\n", argv[1], argv[2]);
//MainWindow w(argv[1], argv[2]);
w.show();
return a.exec();
}
********************mainwindow.h********************
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(const char* sRTSP, const char* sWindowName, QWidget *parent = 0);
~MainWindow();
protected:
void resizeEvent(QResizeEvent* event);
private:
//捕捉的OpenCV窗口
QWidget* m_WidgetOpenCVWindow;
//捕捉的OpenCV窗口名
std::string m_StrOpenCVWindowName;
//读取摄像头视频的线程
CReadVideo* m_ReadVideo;
};
#endif // MAINWINDOW_H
********************mainwindow.cpp********************
#include "mainwindow.h"
#include
#include
#pragma comment(lib, "user32.lib")
MainWindow::MainWindow(const char* sRTSP, const char* sWindowName, QWidget *parent) :
QMainWindow(parent)
{
resize(192*5, 108*5);
m_ReadVideo = nullptr;
m_StrOpenCVWindowName = sWindowName;
//创建窗体,用于显示摄像头画面
m_WidgetOpenCVWindow = new QWidget (this) ;
m_WidgetOpenCVWindow->resize(192*5, 108*5);
m_WidgetOpenCVWindow->move(0,0);
cv::namedWindow(m_StrOpenCVWindowName, cv::WINDOW_NORMAL);
//获取窗体句柄
HWND Whnd=static_cast(cvGetWindowHandle(sWindowName));
if (Whnd)
{
HWND hParent = ::GetParent(Whnd);
SetParent(Whnd,(HWND)m_WidgetOpenCVWindow->winId());
ShowWindow(hParent, SW_HIDE);//隐藏运行程序框
//捕获窗口后,才读取摄像头视频
m_ReadVideo = new CReadVideo(sRTSP, sWindowName, this);
m_ReadVideo->start();
}
}
MainWindow::~MainWindow()
{
if(m_WidgetOpenCVWindow)
delete m_WidgetOpenCVWindow;
m_WidgetOpenCVWindow = nullptr;
if(m_ReadVideo)
delete m_ReadVideo;
m_ReadVideo = nullptr;
}
void MainWindow::resizeEvent(QResizeEvent *event)
{
cv::resizeWindow(m_StrOpenCVWindowName, cv::Size(event->size().width(), event->size().height()));
m_WidgetOpenCVWindow->resize(event->size());
}
********************readvideo.h********************
#ifndef READVIDEO_H
#define READVIDEO_H
#include
#include
#include
#include
#include
#include
#include
#include
class CReadVideo : public QThread
{
Q_OBJECT
public:
//sRTSP设置这是第几个摄像头,sWindowName设置网络摄像头地址
explicit CReadVideo(const char* sRTSP, const char* sWindowName, QObject *parent = nullptr);
~CReadVideo();
void stop();
protected:
virtual void run();
private:
bool stopped;
cv::VideoCapture _videoCapture;
//网络摄像头地址
std::string m_StrVideoAddress;
//opencv window name
std::string m_StrOpenCVWindowName;
};
#endif // READVIDEO_H
********************readvideo.cpp********************
#include "readvideo.h"
CReadVideo::CReadVideo(const char *sRTSP, const char *sWindowName, QObject *parent) : QThread(parent)
{
stopped = false;
m_StrVideoAddress = sRTSP;
m_StrOpenCVWindowName = sWindowName;
}
CReadVideo::~CReadVideo()
{
stopped = true;
if(this->isRunning())
{
this->stop();
//等待1500毫秒,线程退出
for(int i=0; i<100; ++i)
{
if(stopped == false)
break;
msleep(10);
}
}
}
void CReadVideo::stop()
{
stopped = true;
}
void CReadVideo::run()
{
stopped = false;
while(!stopped)
{
try{
if(m_StrVideoAddress.length() < 3){
if(!_videoCapture.open(std::atoi(m_StrVideoAddress.c_str()))){
sleep(60);
continue;
}
}
else{
if(!_videoCapture.open(m_StrVideoAddress))
{
sleep(6);
continue;
}
}
while(!stopped)
{
if(!stopped)
{
cv::Mat matRead;
if(_videoCapture.read(matRead))
{
cv::imshow(m_StrOpenCVWindowName, matRead);
}
else
{
break;
}
}
else
{
break;
}
}
}
catch(QString sException)
{
Q_UNUSED(sException);
sleep(60);
continue;
}
}
stopped = false;
}
整体代码,请见我的资源https://download.csdn.net/download/u011093735/15466028