Halcon+C#联合编程

1、新建halcon程序,读取图像并二值化图像。选择菜单栏中的【文件】→【读取图像】,选择图像打开。

2、图像二值化之前,需要对图像进行灰度化处理,写入程序“rgb1_to_gray (Image, GrayImage)”,运行程序。选择【打开灰度直方图】,弹出“灰度直方图”界面。选择【范围筛选及代码生成】→【阈值】,移动阈值线至合适的位置,选择【插入代码】,关闭窗口。

3、显示图片,插入代码“dev_display (Regions)”,并执行。

4、生成C#程序。选择菜单栏【文件】→【导出】,弹出导出界面,选择导出文件类型“C#”,确定。

5、双击打开生成的C#文件,action函数中额内容即为halcon中实现的。

6、新建项目。选择【文件】→【项目】,弹出“新建项目”界面

7、选择【其它语言】→【visual C#】→【windows 窗体应用】,修改文件保存名称,确定。

8、选择CPU类型。选择菜单栏中的【项目】→【属性】,弹出配置界面,选择【生成】,CPU类型根据自己的电脑类型选择。

9、回到之前的界面form1.cs,开始进行c#配置工作。

第一步,添加引用。在解决方案资源管理器中选择【引用】,单击右键,选择【添加引用】,在halcon安装目录,bin文件夹下找到“halcondotnet.dll”文件,选择【添加】。

10、打开halcon生成的c#程序。选择菜单栏中的【文件】→【打开】→【文件】,打开文件。

11、加入命名空间。在C#中,我们用的是格式是“using”,在halcon生成的程序中可以看到“using HalconDotNet”,选择并复制。打开“form.cs”程序,粘贴复制的程序。

12、添加命名空间完成后,选择菜单栏中的【生成】→【重新生成解决方案】

13、打开工具箱。选择菜单栏中的【视图】→【工具箱】。

14、选择工具箱中公共控件下的某一个控件,单击右键,选择【选择项】,弹出“选择工具箱项“界面。选择【.NET Framewok组件】→【浏览】→【halcondotnet.dll】→【打开】

15、工具箱中多出两个halcon控件

16、分别选中工具箱中的【button】和【HWindowControl】控件,并拖拽至form1界面上,如下图

17、在form1界面上空白处单击右键,选择【属性】,在text中输入“显示图片“;选中button1,单击右键选择属性,在text中输入”采集图片“;同理分别修改button2和button3的名称为“处理图片“和”显示图片“。

18、再次运行“重新生成解决方案“,查看是否有问题。

19、双击“采集图片”,添加事件。原程序代码如下图:

20、添加变量。打开halcon生成的程序,复制变量程序。打来“form1.cs”程序,粘贴程序。

21、添加openfiledialog控件。在之前halcon程序的设计中,我们是直接读取一个固定的图片,此处,我们换另一种方式,可以去查找并选择图片。选择【工具箱】→【对话框】→【openfiledialog】,拖拽至适当位置。

22、添加调用openfiledialog的函数。打开“form1.cs”,添加下列程序:

OpenFileDialog控件的基本属性

InitialDirectory:对话框的初始目录

Filter: 获取或设置当前文件名筛选器字符串,例如,"文本文件(*.txt)|*.txt|所有文件(*.*)||*.*"

FilterIndex 在对话框中选择的文件筛选器的索引,如果选第一项就设为1

RestoreDirectory 控制对话框在关闭之前是否恢复当前目录

FileName:第一个在对话框中显示的文件或最后一个选取的文件

Title 将显示在对话框标题栏中的字符

DereferenceLinks 在从对话框返回前是否取消引用快捷方式

ShowHelp 启用"帮助"按钮

ValiDateNames 控制对话框检查文件名中是否不含有无效的字符或序列

23、添加“采集图像”的halcon生成程序。

24、添加“处理并显示图像”的halcon的图像灰度化和二值化处理生成程序。

25、添加“处理并显示图像”的halcon的图像生成程序。

此处需要注意,必须首先打开窗口,打开的窗口需嵌在前面显示的框里,打开窗口的函数在halcon软件中输入“dev_open_window(0, 0, 512, 512, ‘black’, WindowHandle)”,重新生成C#程序。

HOperatorSet.OpenWindow(0, 0, 512, 512, 0, "visible", "", out hv_WindowHandle);

为了完成嵌入,需要将第三个参数512和第四个参数512分别改成前面显示框的位置,第五个参数改成前面框的句柄,如下所示:

26、添加“处理并显示图像”的halcon的图像显示生成程序。

### 解决HalconC#集成程序闪退问题 当在C#环境中使用Halcon时,可能会遇到程序意外崩溃的情况。这种现象通常由以下几个原因引起: #### 1. **未正确初始化或释放资源** 如果未能正确初始化Halcon库或者忘记释放已分配的对象(如`HObject`, `HWindow`),可能导致内存泄漏或其他异常行为。确保每次创建对象后都调用了相应的销毁方法。 ```csharp try { // 初始化Halcon HOperatorSet.SetSystem("width", 512); HOperatorSet.SetSystem("height", 512); // 图像处理逻辑... } finally { // 确保清理所有资源 if (image != null && !image.IsDisposed) image.Dispose(); if (window != null && !window.IsDisposed) window.Dispose(); } ``` #### 2. **数据类型不匹配** 在某些情况下,如果尝试将错误的数据类型传递给Halcon操作符,则可能引发运行时错误。例如,在执行图像转换时,应严格遵循官方文档中的参数定义[^2]。 #### 转换示例: - 将`HObject`转为灰度图`HImage`: ```csharp public static void HObjectToHImage(HObject hObject, ref HImage image) { HTuple pointer, type, width, height; HOperatorSet.GetImagePointer1(hObject, out pointer, out type, out width, out height); image.GenImage1(type, width, height, pointer); } ``` - 处理彩色图片时需注意指针分离: ```csharp public static void HObjectToRGBHImage(HObject hObject, ref HImage image) { HTuple pointerRed, pointerGreen, pointerBlue, type, width, height; HOperatorSet.GetImagePointer3(hObject, out pointerRed, out pointerGreen, out pointerBlue, out type, out width, out height); image.GenImage3(type, width, height, pointerRed, pointerGreen, pointerBlue); } ``` #### 3. **多线程访问冲突** Halcon并非完全支持多线程操作。如果多个线程同时访问同一个Halcon对象而没有同步机制保护,也可能导致不稳定甚至崩溃。建议采用锁来控制并发访问[^1]。 ```csharp private readonly object _lock = new object(); lock (_lock) { // 执行Halcon相关操作 } ``` #### 4. **版本兼容性问题** 使用不同版本的Halcon DLL文件以及.NET框架之间可能存在兼容性差异。务必确认项目所依赖的DLL版本与实际安装的Halcon软件一致,并且目标平台设置正确(x86/x64)。 --- ### 总结 通过以上分析可知,要有效防止C#应用程序因集成了Halcon而导致的崩溃情况发生,关键是做好以下几点工作:合理管理生命周期内的各类实例;精确把握各种API间交互所需的条件约束;审慎对待跨线程场景下的资源共享策略;最后还要兼顾软硬件环境的一致性和稳定性。 ```csharp using System; class Program { static void Main() { try { Console.WriteLine("Starting..."); // Your Halcon operations here Console.WriteLine("Finished successfully."); } catch(Exception ex){ Console.Error.WriteLine($"Error occurred: {ex.Message}"); } finally{ CleanupResources(); } } private static void CleanupResources(){ // Ensure all resources are properly disposed. } } ``` 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值