Qt+OpenCV插件开发示例

最近用Qt结合OpenCV 进行计算机视觉的开发,在C++开发中,界面设计是比较费力的一项工作,还好Qt提供了一整套GUI的框架和库。很多时候我们的项目比较大,如果以模块或者功能划分,可以独立开发,互不影响,那么插件就可以很好的解决这个问题。

本文主要讲解如何在QT中使用插件方式进行编程。需要对C++和QT开发有一定的基础。
开发环境
Qt5.8
QtCreator
OpenCV4.1

为了方便管理,我建立一个子目录项目 PluginFramework
在这里插入图片描述
然后在PluginFramework项目下右键->新子项目->Application->Qt Widgets Application,名称为MainApp,用来读取图片和加载插件。
在这里插入图片描述
每一个插件就是一个dll文件,为了好管理,我在PluginFramework项目下右键->新子项目->其他项目->子目录项目,创建名称为Plugins的子项目,所有的插件项目都Plugins子目录下创建。

最后新建一个插件Library,
在Plugins上鼠标右键->新子项目->Library,创建名称为:Edge_Detector_Plugin
具体的项目结构如图:

在这里插入图片描述

项目结构整清楚以后,就可以把有关的类库引进来,由于很多地方都会用到OpenCV库,所以我写成了opencv410.pri,放在了项目3rdparty目录中,其他的项目.pro只要include该文件就可以。

# opencv
include($$PWD/../3rdparty/opencv410.pri)

接下来就可介绍如何实现插件开发了。

创建插件接口

创建接口CvPluginInterface,,接口中的方法可以根据需要自行定义,这里定义接口如下,都是一些虚方法,需要子类去实现。需要特别注意的是声明CvPluginInterface为插件接口,并设置唯一标识。

Q_DECLARE_INTERFACE(CvPluginInterface, CVPLUGININTERFACE_IID),

创建完成后我放在了3rdparty,插件库和主程序都需要引用该头文件。

#ifndef CVPLUGIN_H
#define CVPLUGIN_H

#include <QObject>
#include <QWidget>
#include <QString>

#include <opencv2/opencv.hpp>

class CvPluginInterface
{
public:
    virtual ~CvPluginInterface() {}
    virtual QString title() = 0;
    virtual QString version() = 0;
    virtual QString description() = 0;
    virtual QString help() = 0;
    virtual void setupUi(QWidget *parent) = 0;
    virtual void processImage(const cv::Mat &inputImage, cv::Mat &outputImage) = 0;
};

// 声明为插件接口
#define CVPLUGININTERFACE_IID "com.computervision.cvplugininterface"
Q_DECLARE_INTERFACE(CvPluginInterface, CVPLUGININTERFACE_IID)

#endif // CVPLUGIN_H

插件接口的实现

以 Edge_Detector_Plugin为例。
插件界面是QWidget类型,这里命名为plugin.ui,类名为PluginGui。
在这里插入图片描述
实现插件接口的虚方法
在这里插入图片描述
具体的实现类cpp

在这里插入图片描述

使用插件

插件生成后,放在主程序的运行目录下,我这里放在plugins的文件夹下,MainApp 启动后就去加载插件。具体逻辑:

  1. 遍历plugins下所有插件dll,并创建菜单项 点击菜单项
  2. 实例化该插件,并创建连接,加载的界面显示
  3. 运行图像处理功能,显示图像结果

插件的加载使用主要有这几个函数:

// 加载插件
QPluginLoader pluginLoader(pluginFile.absoluteFilePath(), this);
// 实例化插件
if(CvPluginInterface *plugin = dynamic_cast<CvPluginInterface*>(pluginLoader.instance())){
	// 调动插件方法
     plugin ->processImage(originalMat, processedMat);
}

具体的结果展示:
在这里插入图片描述

源码我放在了github 上。
https://github.com/zhaitianyong/computer_vision_with_opencv3_and_qt5/tree/master/PluginFramework

参考:
Computer Vision with OpenCV 3 and Qt5

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
当使用QtOpenCV结合进行开发时,可以实现许多有趣的应用。下面是一个简单的Qt+OpenCV实例,用于打开摄像头并显示实时视频流: 1. 首先,确保已经安装了QtOpenCV,并在Qt项目中添加了OpenCV库。 2. 创建一个Qt窗口应用程序,并在主窗口中添加一个QLabel控件,用于显示视频流。 3. 在主窗口的构造函数中,初始化摄像头并设置视频流的参数: ```cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include <opencv2/opencv.hpp> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); // 初始化摄像头 cv::VideoCapture cap(0); if (!cap.isOpened()) { qDebug() << "无法打开摄像头"; return; } // 设置视频流的宽度和高度 cap.set(cv::CAP_PROP_FRAME_WIDTH, 640); cap.set(cv::CAP_PROP_FRAME_HEIGHT, 480); // 创建定时器,用于定时读取视频帧 QTimer* timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(updateFrame())); timer->start(30); // 每30毫秒更新一帧 } ``` 4. 在主窗口中添加一个槽函数`updateFrame()`,用于读取视频帧并在QLabel控件中显示: ```cpp void MainWindow::updateFrame() { cv::Mat frame; cap >> frame; // 读取视频帧 // 将OpenCV的Mat转换为Qt的QImage QImage qimg(frame.data, frame.cols, frame.rows, frame.step, QImage::Format_RGB888); qimg = qimg.rgbSwapped(); // BGR转RGB // 在QLabel控件中显示图像 ui->label->setPixmap(QPixmap::fromImage(qimg)); ui->label->setScaledContents(true); } ``` 5. 编译并运行程序,即可看到实时视频流在Qt窗口中显示。 这只是一个简单的示例,你可以根据自己的需求进行更复杂的图像处理和应用开发

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值