第二届启智杯-一种可视化流程编辑器
开发一个图形化的可交互的视觉流程编辑器,实现通过鼠标拖拽,连线完成一个视觉流程的搭建,使用户可以不用编写代码就能完成一个视觉流程的开发。使用Qt5.13.1设计编辑器的Ui界面,图像处理算子使用海康的VisionMaster4.2.0,编程语言:C++,开发环境为VisualStudio2015。

1、项目开发背景

编译环境:基于C++语言,QT5.13.1 VisualStudio 2015, VisionMaster4.2.0

硬件环境:CPU:Intel 12400F,GPU:NVIDIA 3060Ti

2、项目开发设计思路

2.1、QGraphicsView框架开发

开发灵感来源QT官方的Diagram Scene Example案例:
image.png

QGraphicsView框架QT提供的一套用于二维图形的视图框架,允许开发者处理大量的图形项(如形状、图像、文本等),并支持高级功能如项选择拖拽缩放旋转
GraphicsView架构主要由3个部分组成,即场景(Scene)、视图(View)和图形项(ltem)。
①场景(Scene):是所有图形项的容器,负责图形项的管理和绘制。
②视图 (View):提供了一个窗口(或视口)显示其关联的场景。用户通过视图与场景内的图形项进行交互。
③图形项(ltem):也就是图元,是场景中的所有元素的基类,如形状、图像或自定义项等。

2.2、前端流程图的交互设计

使用Qt 5.13.1设计编辑器的Ui界面,主要实现以下:
①基础布局实现:实现编辑器的基础布局,如工具栏
显示等。
②图形元素开发:开发流程中的基本图形元素,包括
不同类型的算子节点。
③拖拽和连线逻辑:实现节点的拖拽逻辑以及节点之
间连线的逻辑。
④参数编辑:实现双击节点,通过参数栏编辑其算子
的参数。
图片1.png

2.2、后端的逻辑处理

①逻辑处理:实现创建、更新、删除流程的逻辑,以及执行流程的核心逻辑。
②图像处理算子:根据流程中定义的图像处理操作(算子),调用相应的海康VisionMaster的图像处理库。
③数据持久化与安全:设计和实现数据持久化方案,确保流程设计、用户信息和执行结果的安全存储。
④错误处理与日志:记录关键操作和系统异常,便于监控系统状态和调试问题。

3、节点与节点之间的逻辑处理

设计了一种类似双链表的形式,节点与节点之间的相关联,通过相互保存彼此的指针。当上游节点被删除时,可以通过指针通知下游节点,同理,当下游节点被删除时,会通知上游节点。

3.1、节点算子(图元)的组成

一个节点图元(PartsItem)主要由三个部分组成,分别是输入接口(Input)本体(Body)输出接口(Output)
image.png

3.2、节点的创建与内部指针的保存

通过类似双链表的形式,使得节点内部输入接口、本体以及输出接口之间相互保存彼此指针。
程序实现如下:

void createPartsItem()
{
	//本体创建Body Parts
	m_pBodyItem = new BodyPartsItem(this);

	//可能有多个输入接口
	for (int i = 0; i < m_iInputItemNumber; i++)
	{
		//输入接口创建InputParts
		InputPartsItem* item = new InputPartsItem(m_pBodyItem);

		//输入接口与主体的指针相互保存

		//输入接口添加保存主体的指针
		item->addNextItem(m_pBodyItem);
		//主体添加保存输入接口的指针
		m_pBodyItem->addPrevItem(item);
	}

	//可能有多个输出接口
	for (int i = 0; i < m_iOutputItemNumber; i++)
	{
		OutputPartsItem* item = new OutputPartsItem(m_pBodyItem);
		//输出接口与主体的指针相互添加保存
	
		//输出接口添加保存主体的指针
		item->addPrevItem(m_pBodyItem);
		//主体添加保存输出接口的指针
		m_pBodyItem->addNextItem(item);
	}

}

3.3、节点与节点之间指针的保存

节点与节点之间进行指针的相互保存,主要由两个函数完成–鼠标点击事件与鼠标释放事件。
当鼠标点击节点1的输出接口时,触发输出接口的鼠标点击事件,创建Line图元,同时Line图元与节点1相互保存指针;当鼠标移动到节点2的输入接口,鼠标释放,触发鼠标释放事件,Line图元与节点2的输入接口相互保存指针。从而通过Line图元使得节点与节点之间相互保存指针。
image.png
输出接口鼠标点击事件程序实现如下:

void OutputPartsItem::mousePressEvent(QGraphicsSceneMouseEvent * event)
{
	//判断是否时鼠标左键点击
	if (event->button() == Qt::LeftButton)
	{
		//Line图元的创建
		m_pOutCurveLine = new VGPCurveLine(this);
	
		//输出接口添加Line图元的指针
		this->addNextItem(m_pOutCurveLine);
		//Line图元添加输出接口的指针
		m_pOutCurveLine->addPrevItem(this);
		
	}
	PartsItemBase::mousePressEvent(event);
}

输出接口鼠标释放事件程序实现如下:

void OutputPartsItem::mouseReleaseEvent(QGraphicsSceneMouseEvent * event)
{
	setCursor(Qt::PointingHandCursor);
	QPointF releasePt = mapToScene(event->pos());
	qreal x = releasePt.x();
	qreal y = releasePt.y();
	QRectF rect = QRectF(QPointF(x - 5, y - 5), QPointF(x + 5, y + 5));

	//返回场景在点releasePt处的所有对象
	QList<QGraphicsItem*> list_item = scene()->items(releasePt);

	//Input输入接口与Line图元指针相互保存
	linkItem(list_item);

	PartsItemBase::mouseReleaseEvent(event);
}

4、运行效果

image.png

4、项目开发总结

团队开发的图形化可交互视觉流程编辑器,通过图形化界面大幅简化了视觉流程的搭建过程,使得非编程背景的用户也能快速高效地开发视觉应用。但是编辑器仍有许多需要改进的部分,需要进一步调试程序,扩展编辑器的功能,增加更多的VM图像处理算子,以满足更广泛的应用需求。

版权声明:本文为V社区用户原创内容,转载时必须标注文章的来源(V社区),文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:v-club@hikrobotics.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
上一篇

VM4.4更新亮点

下一篇

VM4.4更新概要

评论请先登录 登录
全部评论 0
Lv.0
0
关注
0
粉丝
1
创作
0
获赞
相关阅读
  • VM4.4更新亮点
    2024-04-12 浏览 0
  • 探寻机器视觉新星|第二届“启智杯”机器视觉设计大赛获奖名单公布
    2024-04-08 浏览 0
  • 第二届启智杯—光伏电池片质检视觉方案设计
    2024-04-15 浏览 0
  • 双车联动调试案例-华工中试基地
    2024-04-28 浏览 0
  • VM虚拟机部署欧拉系统及磁盘扩容
    2024-04-25 浏览 0

请升级浏览器版本

您正在使用的浏览器版本过低,请升级最新版本以获得更好的体验。

推荐使用以下浏览器