文章目录

  • 前言
  • 一、添加对Sherlock运行时引擎的引用
  • 二、声明并创建一个Sherlock对象
  • 三、配置Sherlock窗口的显示
    • a) 加载一个调查
    • b)添加IpeDspCtrl 2.0 显示控件
    • c) 将显示器连接到图像窗口
  • 四、使用Sherlock对象来加载、执行和控制
  • 五、引擎事件
  • 六、释放Sherlock对象
  • 总结

前言

本人公司最近在做一款瑕疵检测的视觉项目,项目中利用Sherlock从相机中取图和对图像进行视觉处理,然后将图像和数据传输到项目中。这过程中软件需要和Sherlock进行图像和数据的传递,这就需要WinForm和Sherlock进行对接,但我在网上查找了许久能用上的资料十分有限,所以我决定写下这篇文章,来做一次总结,同时也希望能帮助到同样在为此问题困扰的你。


废话不多说我们直接进入正题,本例中所用的开发工具是Sherlock 7.3 64位和Visual Studio 2015,用到WinFrom进行程序的开发。

整个过程大致分为五个步骤:

  1. 添加对Sherlock运行时引擎的引用
  2. 声明并创建一个Sherlock对象
  3. 配置Sherlock窗口的显示
  4. 使用Sherlock对象来加载、执行和控制
  5. 释放Sherlock对象

一、添加对Sherlock运行时引擎的引用

打开一个新的WinForm应用程序项目。在项目的解决方案资源管理器窗口,右键单击引用。在弹出的菜单上单击Add Reference添加引用对话框,单击浏览选项卡,导航到C:\Program Files\Teledyne DALSA\Sherlockx64\Bin目录(系统不同安装目录可能不同),选择IpeEngCtrl.dll 单击确认按钮进行添加。

二、声明并创建一个Sherlock对象

必须在调用任何方法之前创建并初始化Sherlock对象。

代码如下(示例):

IpeEngCtrlLib.Engine hSherlock;
IpeEngCtrlLib.I_ENG_ERROR iReturn;
public Form1()
{ InitializeComponent(); hSherlock = new IpeEngCtrlLib.Engine(); iReturn = hSherlock.EngInitialize(); if (iReturn != IpeEngCtrlLib.I_ENG_ERROR.I_OK)    //判断是否失败{MessageBox.Show("Could not initialize VisionSystem object.", "FATAL ERROR");Close();}
}

三、配置Sherlock窗口的显示

1.加载一个调查

通常在From_Load事件中加载所需要的调查

代码如下(示例):

private void Form_Load(object sender, EventArg)
{ iReturn = VisionSystem.InvLoad("D:\\DM\\blemish detection.ivs");//加载调查if (iReturn != IpeEngCtrlLib.I_ENG_ERROR.I_OK)  //判断是否出错 {MessageBox.Show("Could not load investigation.", "FATAL ERROR");}
}

2. 添加IpeDspCtrl 2.0 显示控件

要在窗体上显示图像窗口,你需要添加一个IpeDspCtrl 2.0显示控件。在界面中选择 工具-->选择工具箱-->COM组件-->浏览,在\bin文件中找到IpeDspCtl.ocx进行添加.

在控件工具箱中找到IpeDspCtrl 2.0 Control控件,并添加到窗体中(默认名称为axIpeDspCtrl1)

3.将显示器连接到图像窗口

要显示图像窗口,必须将其连接到显示器控制

private void Form_Load(object sender, EventArg)
{ ...//连接显示对象到hSherlock对象  axIpeDspCtrl1.ConnectEngine(hSherlock.GetEngineObj());//连接显示器到hSherlock图像窗口//注:“imgA”是之前加载的Sherlock调查的图像窗口的名称  axIpeDspCtrl1.ConnectImgWindow("imgA");axIpeDspCtrl1.SetZoom((-1));
}

完成之后运行程序就可以在图像窗口上显示Sherlock调查里的图像了!!

四、使用Sherlock对象来加载、执行和控制

能显示图像肯定是不够的,还得对图像进行视觉处理和对ROI参数的调节,这些函数太多太多,我在这里介绍几个我项目中所用到的函数:

因为我做的是瑕疵检测,项目中用的Sherlock中的预处理是为“Threshold”, 算法用的是 “Connectivity - Binary”,所以在界面中需要获取和修改在两个算法的参数。

在Sherlock中把需要的参数和变量连接起来,就可以通过读写变量来传递值了。

通过函数

VarGetDouble(string bstrName, out double pval)      //读取Sherlock数字变量“bstrName”的值到本地变量“pval”中。(其他数据类型也有对应的获取函数,函数名为  “VarGet数据类型名“);

将数据读取到本地变量然后显示出来

也可以更改后写入Sherlock变量

iReturn = hSherlock.VarSetDouble("smin_area", min_area)  //将本地变量“min_area”的值赋给Sherlock变量“smin_area”
SoImageSave(string bstrSo,string bstrFile)//一个图像窗口的图像保存到一个文件中,不保存叠加图形

参数

bstrSo    图像窗口名称

bstrFile  图片保存的路径

通过这个函数你可以将获取的图像进行保存

你可以将保存图片函数的写在RunCompleted(运行完成事件)中,每次调查结束后系统会执行一次RunCompleted事件。

private void Form_Load(object sender, EventArg)
{ ...//定义RunCompleted事件处理程序//每次调查结束后系统会执行一次 VisionSystem_RunCompleted 函数VisionSystem.RunCompleted +=new         IpeEngCtrlLib._IEngineEvents_RunCompletedEventHandler(VisionSystem_RunCompleted);
}
下面是几个常用的函数:
InvModeSet (IpeEngCtrLib nMode)    //设置运行模式
        I_EXE_MODE_ONCE - 运行一次
        I_EXE_MODE_CONT -一直运行
        I_EXE_MODE_CALIB -”运行校正程序
        I_EXE_MODE_HALT - 遇到问题就终止
        I_EXE_MODE_HALT_AFTER_ITERATION -在完成当前迭代停止调查
        I_EXE_MODE_HALT: 从这个调用返回后的引擎将停止。因为引擎可能需要一些时间来完全停止,需要等到InvModeGet回报I_EXE_MODE_HALT.
        I_EXE_MODE_HALT_AFTER_ITERATION: 触发收购需要特别注意,因为引擎可能永远等待触发器
InvModeGet (IpeEngCtrLib * pnMode)       //获取当前运行的模式

参数  :pnMode   当前引擎运行模式(将获取到的数据存入pnMode中)

InvSave (IpeEngCtrLib bstrFile)保存文件     //保存文件

参数:bstrFile   完整文件名称

SoTimeoutGet (IpeEngCtrLib bstrSo, long * pnTimeoutMs)         //获取超时时间

参数

bstrSo图像窗口名称

pnTimeoutMs超时值,单位为毫秒

返回:I_OK成功

SoTimeoutSet (IpeEngCtrLib bstrSo, long nTimeoutMs)        //设置超时时间

参数

bstrSo图像窗口名称

nTimeoutMs超时值,单位为毫秒

返回:I_OK成功

RoiCoordArraySet (IpeEngCtrLib bstrRoi,ref Array psanCoordsX, ref Array  psanCoordsY);   //设置值ROI的坐标

参数

bstrRoi   ROI的名字

psanCoordsX: X的坐标

psanCoordsY : Y的坐标

返回:I_OK成功

五、引擎事件

AfterLoad ()        //加载程序后事件
BeforeLoad ()     //加载程序之前事件
OnRunError (I_EXEC_ERROR nError)  //运行错误处理事件
参数 :错误类型
ReporterClear ()        //报告清除事件
ReporterDisplay (BSTR bstrMsg)  //ReporterDisplay报告显示事件
RunCompleted ()        //运行完成事件
RunStop ()        //停止运行类似于InvModeSet(I_EXE_MODE_HALT_AFTER_ITERATION).
UserProgramEvent()        //用户程序事件


六、释放Sherlock对象

俗话说“有借有还,再借不难”在程序结束前应该及时释放动态分配的Sherlock,重写Dispose事件:

protected override void Dispose(bool disposing)
{if (disposing){if (hSherlock != null){hSherlock.EngTerminate();hSherlock = null;}if (components != null){components.Dispose();}}base.Dispose(disposing);
}

好了,到这里差不多就已经把 WinFrom和Sherlock进行对接的过程和知识讲完了,当然Sherlock是一个非常强大的视觉处理软件,其功能肯定不止这些,我现在也才接触到一些皮毛而已。对于刚入视觉行业的我来说把我所学到的知识总结起来同时分享出去,在提升自己的同时,也是一种别样的乐趣和满足。

另外这是我第一次写博客,文章中的语句可能略显“青涩”,如果有没讲清楚的地方还请多多包含,当然如果其中有疑问或写错的地方还请提出我一定会虚心接受并加以改正。如果此博客帮助到了您或您觉得写的还可以,还麻烦您点个赞,您的支持也会成为我努力学习和继续写下去的动力,谢谢。

C# WinForm和Sherlock进行对接相关推荐

  1. C#(Winform)+H5(Html)微信/支付宝对接接口及前端支付页面

    由于工作需要,开了一个C#(Winform)+H5(Html)的微信/支付宝对接接口,需要使用的小伙伴可通过链接进行下载,欢迎各位小伙伴交流探讨. 测试链接:http://dumikj.com/pay ...

  2. 使用 .NET WinForm 开发所见即所得的 IDE 开发环境,实现不写代码直接生成应用程序...

    GitHub:https://github.com/iccb1013/Sheng.Winform.IDE SailingEase WinForm Framework WinForm开发框架开发手册:h ...

  3. 鸡肋还是革新——Blazor进WinForm

    winform是一老技术,感觉都有点掉牙了(我近20年前就是从winform开始接触.net的):blazor,是微软技术圈里的新宠,正在被悉心照顾.当这一老一少的技术碰撞后,会有什么火花? .net ...

  4. 金蝶k3财务接口_记录用友T+接口对接的心酸历程

    前言:公司的业务主要是对接财务系统做单据传输或者凭证处理的,难免少不了和各大财务软件做数据对接,其中当然是必须通过接口来传递数据了.于是乎,用友T+的版本来了,对接的工作自然是我来做,可没想到就是这样 ...

  5. winform前后端框架_ABP开发框架前后端开发系列(1)框架的总体介绍

    ABP是ASP.NET Boilerplate的简称,ABP是一个开源且文档友好的应用程序框架.ABP不仅仅是一个框架,它还提供了一个最徍实践的基于领域驱动设计(DDD)的体系结构模型.学习使用ABP ...

  6. c# 小票机打印二维条码_C# winform 使用rdlc打印小票其中包含动态显示多条形码的解决方法...

    前言 最近做一个项目就是winform程序去控制设备,通过modbus-rtu协议去通讯.做的过程中上位机还牵扯到与其他系统对接的问题,当对接好其他系统数据后将数据打印出一个小票,上位机端用seria ...

  7. 4.Abp vNext 地磅无人值守 Winform 客户端搭建

    地磅无人值守项目 系列文章目录 文章目录 前言 一.基础功能 1. 一台电脑启动一次客户端 2. 日志记录 3. 自动升级功能 二.对接硬件设备 1.对接摄像头 总结 前言 客户端主要是管控车辆进出场 ...

  8. 使用 .NET WinForm 开发所见即所得的 IDE 开发环境,实现不写代码直接生成应用程序

    SailingEase WinForm Framework WinForm开发框架开发手册:http://docs.shengxunwei.com/Home/Browser/sewinformfw/ ...

  9. 技术总结:winform和wpf的区别 以及 项目的“设计规划”

    一.winform和wpf的区别: 1.winform 是"前后端"不分离的,wpf是前后端分离的.这个是winform的设计器和c#编码"耦合度"太高了,不能 ...

最新文章

  1. RocketMq 的最佳实践
  2. C语言 标识符的作用域
  3. 深入理解java虚拟机---读书笔记
  4. 【深度学习图像项目实战-从入门到上线1】怎样学会科学的调研并启动一个项目...
  5. 内容处理和分发中的算法应用探究
  6. 《剑指offer》给定一颗二叉搜索树,请找出其中的第k大的结点。
  7. Windwos中system、System32、SysWOW64区别
  8. ASP调用web services
  9. 转账为demo,spring事务
  10. matlab2c使用c++实现matlab函数系列教程-sin函数
  11. postgresql 修改表字段的长度
  12. The pgAdmin 4 server could not be contacted
  13. 基因表达数据处理-Ensembl ID转化为Gene symbol
  14. Ubuntu 16.04 (Ubuntu18.04 也可以用)远程桌面(使用win10远程桌面客户端链接)和 使用vncveiwer链接的配置
  15. 电脑安卓手机模拟器怎么修改IP地址
  16. 无人机自由飞行测试台 FFT GYRO 2000
  17. spring-kafka广播模式配置_小学校园智能广播系统方案(定压广播)
  18. python qt 按钮_Python QtWidgets.QPushButton方法代码示例
  19. MATLAB中复数矩阵的转置、共轭及共轭转置
  20. 《java从入门到放弃》_《Java从入门到放弃》JavaSE入门篇:JDBC(入门版)

热门文章

  1. 唱歌如何保持高位置_什么是高位置发声?
  2. 华软mysql考试_在广州大学华软软件学院就读是怎样一番体验?
  3. 用javascript分类刷leetcode3.动态规划(图文视频讲解)
  4. 如何加快 Synology Drive 的同步过程?(外网速度极慢)
  5. Joomla网站实现页面静态化(利于SEO)
  6. 实现H264格式视频的流媒体播放
  7. 利用HGT聚类单细胞多组学数据并推理生物网络
  8. 一文告诉你CXL是什么,有什么新的机会 (上)
  9. PAT甲级 1032 Sharing (25分) 测试点5陷阱
  10. 爬虫项目——Scrapy爬取Boss直聘