Qt捕获Opencv窗体并加载到界面

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 <QApplication>
 
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 <QMainWindow>
#include <QResizeEvent>
#include <readvideo.h>
 
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 <QWidget>
#include <Windows.h>
#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<HWND>(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 <QThread>
#include <QDebug>
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/videoio/videoio.hpp>
 
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
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值