1、项目开发背景
编译环境:基于C++语言,QT5.13.1 VisualStudio 2015, VisionMaster4.2.0
硬件环境:CPU:Intel 12400F,GPU:NVIDIA 3060Ti
2、项目开发设计思路
2.1、QGraphicsView框架开发
开发灵感来源QT官方的Diagram Scene Example案例:

QGraphicsView框架是QT提供的一套用于二维图形的视图框架,允许开发者处理大量的图形项(如形状、图像、文本等),并支持高级功能如项选择、拖拽、缩放和旋转。
GraphicsView架构主要由3个部分组成,即场景(Scene)、视图(View)和图形项(ltem)。
①场景(Scene):是所有图形项的容器,负责图形项的管理和绘制。
②视图 (View):提供了一个窗口(或视口)显示其关联的场景。用户通过视图与场景内的图形项进行交互。
③图形项(ltem):也就是图元,是场景中的所有元素的基类,如形状、图像或自定义项等。
2.2、前端流程图的交互设计
使用Qt 5.13.1设计编辑器的Ui界面,主要实现以下:
①基础布局实现:实现编辑器的基础布局,如工具栏
显示等。
②图形元素开发:开发流程中的基本图形元素,包括
不同类型的算子节点。
③拖拽和连线逻辑:实现节点的拖拽逻辑以及节点之
间连线的逻辑。
④参数编辑:实现双击节点,通过参数栏编辑其算子
的参数。

2.2、后端的逻辑处理
①逻辑处理:实现创建、更新、删除流程的逻辑,以及执行流程的核心逻辑。
②图像处理算子:根据流程中定义的图像处理操作(算子),调用相应的海康VisionMaster的图像处理库。
③数据持久化与安全:设计和实现数据持久化方案,确保流程设计、用户信息和执行结果的安全存储。
④错误处理与日志:记录关键操作和系统异常,便于监控系统状态和调试问题。
3、节点与节点之间的逻辑处理
设计了一种类似双链表的形式,节点与节点之间的相关联,通过相互保存彼此的指针。当上游节点被删除时,可以通过指针通知下游节点,同理,当下游节点被删除时,会通知上游节点。
3.1、节点算子(图元)的组成
一个节点图元(PartsItem)主要由三个部分组成,分别是输入接口(Input)、本体(Body)、输出接口(Output)。

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图元使得节点与节点之间相互保存指针。

输出接口鼠标点击事件程序实现如下:
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、运行效果

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