开发一个自己的VM模块(三)
在开发一个自己的模块(二)里介绍了模块的底层C++部分的开发。第三部分讲解界面显示,自定义控件如何开发。

一、界面显示

如下图,MoveAndRotate,XIn,YIn,RIn,结果显示区的XOut,YOut,ROut都是自定义字符串,显示的也都是原始字符。


图 1 配置输入订阅


图 2 运行结果


如果需要将上述字符串显示变成中文,需要在字符翻译文件里添加翻译项。在VisionMaster.exe的同级目录Lang文件夹下,有个LanguageTool.exe。双击打开如下图:

图 3 语言资源工具


在Key文本框中输入要翻译的字符串,在中文值文本框中输入要显示的中文名称,在英文值文本框中输入要显示的英文名称,点后面的增加/编辑按钮,即可完成添加。修改同理。

将VM主界面关闭,重新打开。即可看到翻译后的中文名。如下图:

图 4 添加了语言资源的显示效果


可按此方法加入其它XIn,YIn,RIn,XOut,YOut,ROut的翻译对照。


二、结果显示

在模块运行之后,得到了计算结果,但在图像上没有相应的显示,如下图:


图 5 无结果显示


打开自定义的模块目录,找到xxxDisplay.xml,打开,如下图所示:


图 6 显示XML

默认情况下只显示了输入,输出图片,ROI,当前结果,历史结果这几项。在里面添加点的显示即可,可以到其它模块的Display.xml里去复制点的XML定义,进行调整。如下图:


图 7 添加点,文字显示


添加了point、text的Object,即点的显示与文字的显示,注意划红线的部分,点与文字的数据来源都要与MoveAndRotate.xml里的Output对应上。显示如下:


图 8 显示点与文字


如果不能正常显示,要看看底层C++库里是否输出了Modustatus。可参考开发自己的VM模块(二)里关于模块输出的部分。

如果要在显示TAB页,加开关控制点是否显示,加文字的配置。如下:


图 9 显示配置页



图 10 添加点与文字配置


注意,红线部分需要与Display里的Object Name保持一致。而文本显示的TextDisplayGroup是固定的,不用调整名称。添加完成后,显示TAB页变成如下:


图 11 显示TAB页有点和文字的配置


三、开发自定义配置控件

如果模块非常复杂,类似VM自带的特征匹配,需要做复杂的配置建模,这样的配置界面是无法通过XML直接配置出来的,这时就需要自己开发配置控件。需要一些的WPF开发功底。

而在生成器生成的C#工程里,已经附送了自定义配置控件的示例代码,以上面的MoveAndRotate为例,C#工程在MoveAndRotate_CsProj\MoveAndRotateCs里,里面有MoveAndRotateCs和MoveAndRotateControl两个目录,打开MoveAndRotateCs.sln(使用VS2013打开),如下图:


图 12 控件工程


里面的MoveAndRotateControl项目就是控件。从截图可以看到,已经做了一个新建模型,编辑模型的界面,点击新建模型按钮,就会弹出另一个界面ModelConfigDialog.xaml,做具体的模型生成工作。这两个界面可以按需修改成任何想自定义的界面内容。那如何使用到这个自定义的XXXControl呢?

看XmlData,如下图:


图 13 自定义Item


自定义了一个ModelPanel继承自NameValueItem(Tab XML里的Items的基类),扩展出了一个新的Item。再看DataTemplate下的ParamUserControlDataTemplate.xaml。


图 14 自定义数据模板


定义了一个数据模板ModelPanel,里面包含了自定义的配置界面ModelPanelControl。即:在Tab XML的Items下可以添加一个新的ModelPanel的Item,框架会把它实例化成图13的ModelPanel类的对象,并且尝试用同名的数据模板来做呈现。

       在Tab Xml中做修改,加入一个新的Tab Lang_ModelSet,并在这个新Tab的Items下添加了新定义的ModelPanel,如下图:


图 15 TAB XML中加入自定义控件


打开VM,拖入移动旋转模块,双击打开配置,可以看到如下图的新自定义TAB页:


图 16 自定义配置控件

有了控件,可以做各种各样自定义的界面展现,但如何与模块底层通信,将两者联系起来,达到真正的配置效果?

       连接自定义配置控件与配置TAB页的桥梁是ParamUserControlDataTemplate.xaml,仔细看


把ModelPanelControl的ParentNode绑定到了ModelPanel这个Tab Item的身上,而顺着Item的父节点往上找,找到最顶层节点,就是Tab Xml里的根节点AlgorithmTabRoot。而与模块底层通信的出入口,就在AlgorithmTabRoot的public IParamsConfig UserStringData这个属性上。所以示例代码中有拿通信出入口的代码如下:


图 17 通信接口


获得通信接口之后,从底层获取数据的方式如下:


设置数据到底层方式如下:


相应的,在底层GetParam,SetParam里要添加GetImageWidth,GetImageHeight,GetImageData,SetImageWidth,SetImageHeight,SetImageData的处理逻辑,如下图:


图 18 GetParam里加入获取数据示例代码



图 19 在SetParam里加入设置数据示例代码


至此,自定义控件的界面及数据传递就全部打通,基本框架已搭建,可以根据业务需求随意发挥了。

自定义模块的所有内容讲解完毕。

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

海康机器视觉工程师认证重启(VM通道)

下一篇

使用VisionMaster4.2SDK联合C#进行二次开发入门

评论请先登录 登录
全部评论 2

感谢分享😆

2024-07-24 10:39:42 广东省
回复

很好

2023-02-16 08:10:10 未知地区
回复
  • 1
Lv.0
1
关注
288
粉丝
17
创作
241
获赞
所属专题
  • VM4.2二次开发环境配置方法(入门必看)
  • Visionmaster4.2 + QT5.14.2 + VS2017二次开发保姆级避坑课程
  • 使用VisionMaster4.2SDK联合C#进行二次开发入门
  • VM二次开发视觉框架(C#)
  • 二次开发过程注意的点
  • 开发一个自己的VM模块(三)
  • 开发一个自己的VM模块(二)
  • 开发一个自己的VM模块系列一:模块详解
  • 【VM集成开源AI】深度学习算子模块封装
  • Vm算子CMvdImage图片生成方法,即IntPtr转byte[]和byte[]
  • Sauvola二值化处理在图像处理应用的优势介绍分析
  • “启智杯”设计大赛-一种模板匹配建模与识别控件
  • “启智杯”模板匹配控件的扇形掩膜实现方式交流
  • “启智杯”:IMvdImage类型转换为MFC的CBitmap类型
  • "启智杯":确定扇环外切矩形的方法
  • VM二次开发小技巧-增加十字辅助线
  • VM二次开发小技巧—快速匹配模板切换
相关阅读
  • 深度学习基础介绍
    2024-11-01 浏览 0
  • 大小车场景化实施方案资料目录
    2024-11-09 浏览 0
  • 【开发有道系列】C++与C#相互调用的方法
    2024-11-19 浏览 0
  • 一文带你入门RCS4.x【任务编排】(二)
    2024-12-02 浏览 0
  • 深度学习基础介绍
    2024-11-01 浏览 0

请升级浏览器版本

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

推荐使用以下浏览器