[C.C++] 零基础小白实现C#与Halcon算法的项目梦幻联动

391 0
Honkers 2026-6-5 00:16:36 | 显示全部楼层 |阅读模式

本文是今日在学习了C#课程之后,第一次接触到C#中不同软件算法结合,课后整理了一些思绪如下,如有不当之处,请各位大佬批评指正!

一、环境搭建与整体过程描述

1.找到Halcon软件直接右键打开进入资源文件夹:

 2.找到我们搭建环境所需的Hanlcon软件算法库:

 最重要的就是bin\x64-win64文件夹里面的halcon.dll文件(包含了Halcon软件的算法库函数)与bin/dotnet35里面的halcondotnet.dll文件,建议复制出来在同一文件里面打包方便直接嵌入到C#程序里面。

3、在进行移植之前还需要利用Visual Studio创建一个Windows窗体项目:

 创建之后选择项目鼠标右键打开选择打开资源文件夹

将我们第2步找到的halcon算法库直接复制到项目文件夹里面的bin/debug可执行文件夹里面。

至此,联合项目基础环境已经完成!

二、Halcon算法引用以及创建HWindowControl控件

1.Halcon算法引用

        在项目解决方案资源管理器里面找到“引用”,点击选择复制好的算法目录文件halcondotnet.dll文件:

 添加选择“确定”即可!

在引用路径下面出现说明引用成功!

2.创建一个HWindowControl控件

        引用成功之后,我们需要在窗体工具箱(工具箱找不到的可以在软件菜单栏“视图”里面选择工具箱)里面直接拖拽添加halcondotnet.dll文件,会自动生成项目窗口控件工具:

接下来就可以开始创建项目了 

 三、搭建简单处理回形针项目并测试

1.绘制窗口

        新建HWindowControl窗口1并添加按钮1用于读取图片,

 鼠标右键选择按钮选择属性,可以更改文本显示以及变量名:

              

接下来创建窗口2和按钮2作为阈值处理,文本框用于输入对图片阈值分割处理最大最小值,还可以添加label标签用于说明:

修改文字方法与修改按钮名字方法相同,右击选择属性即可更改。最终效果如下:

2.查看窗口源代码以及相关定义

        在窗口界面点击选择之后按键盘F7或者FN+F7进入源代码查看:

进入以下界面:

要是想查看相关定义变量按住Ctrl单击InitializeComponent();函数即可进入查看:

3.代码编写

        为了方便观看,本文选择直接在项目里面加入注释以供参考:

(1)图片选择并显示在窗体源码块:

  1. //定义一个HObject类型的变量用于接受图片
  2. HObject TestImage;
  3. //创建单击按钮事件只需在form界面鼠标左键双击即可自动创建并进入
  4. private void button_read_Click(object sender, EventArgs e)
  5. {
  6. //读取文件方法
  7. HOperatorSet.ReadImage(out TestImage, "D:\\VisionStudio-demo\\0819\\clip.png");
  8. //获取图片大小--Width与Height变量获取图片宽高
  9. HTuple Width, Height;
  10. HOperatorSet.GetImageSize(TestImage,out Width,out Height);
  11. //设置图片显示范围 hWindowControl1.HalconWindow获得窗体句柄
  12. HOperatorSet.SetPart(hWindowControl1.HalconWindow,0,0, (Height-1), (Width-1)); //0,0, (Height - 1), (Width - 1)代表从0,0坐标到图片的宽高坐标,达到全屏显示
  13. //将图片投射到窗体上
  14. HOperatorSet.DispObj(TestImage, hWindowControl1.HalconWindow);//将TestImage变量投射到句柄窗口上
  15. }
复制代码

图片读取运行结果:

        注:如果出现运行System.BadImageFormatException:“试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)”错误,

解决方法:找到项目右击属性,找到“生成”选项将“首选32位”取消勾选即可解决!

 

(2)阈值分割图片处理源码块:

  1. //声明两个变量用于接受窗体上用户输入的灰度值
  2. HTuple MinGray, MaxGray;
  3. private void button_deal_Click(object sender, EventArgs e)
  4. {
  5. //在事件触发之后最先清除窗口避免覆盖显示
  6. hWindowControl2.HalconWindow.ClearWindow();
  7. //为防止用户直接阈值分割而无图片,下面做一个简单判断
  8. if (TestImage == null)
  9. {
  10. button_read_Click(null,null);//当没有事先进行读取图片操作时触发调用,获取图片
  11. }
  12. //设置阈值处理显示颜色
  13. HOperatorSet.SetColor(hWindowControl2.HalconWindow, "blue");
  14. //接受窗体上用户输入的灰度值
  15. MinGray = int.Parse(textBox_Min.Text);//由于textBox_Min.Text是字符串类型利用int.Parse进行强转
  16. MaxGray = int.Parse(textBox_Max.Text);
  17. //阈值分割方法--Threshold()
  18. HObject Region;// 创建HObject类型的变量作为阈值分割的输出
  19. HOperatorSet.Threshold(TestImage,out Region, MinGray, MaxGray);
  20. //在第二个窗口上显示处理结果
  21. HTuple Width, Height;
  22. HOperatorSet.GetImageSize(TestImage, out Width, out Height);
  23. HOperatorSet.SetPart(hWindowControl2.HalconWindow, 0, 0, (Height - 1), (Width - 1));
  24. //将图片投射到窗体上
  25. HOperatorSet.DispObj(Region, hWindowControl2.HalconWindow);//将Region结果投射到句柄窗口上
  26. }
复制代码

运行结果如下 :

        综上所述,一个简单的实现图像基本阈值分割处理的小项目就搭建好了,主要还是练习如何将Halcon算法库移植到C#项目里面并运行,注意命名空间为HalconDotNet中的类HOperatorSet的使用,如果在代码中有需要完善或者更改的,还望各位大佬指正~~~

(3)完整代码

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. //引用导入的HalconDotNet文件
  11. using HalconDotNet;
  12. namespace 连合项目自测
  13. {
  14. public partial class Form1 : Form
  15. {
  16. public Form1()
  17. {
  18. InitializeComponent();
  19. }
  20. //定义一个HObject类型的变量用于接受图片
  21. HObject TestImage;
  22. //创建单击按钮事件只需在form界面鼠标左键双击即可自动创建并进入
  23. private void button_read_Click(object sender, EventArgs e)
  24. {
  25. //读取文件方法
  26. HOperatorSet.ReadImage(out TestImage, "D:\\VisionStudio-demo\\0819\\clip.png");
  27. //获取图片大小--Width与Height变量获取图片宽高
  28. HTuple Width, Height;
  29. HOperatorSet.GetImageSize(TestImage,out Width,out Height);
  30. //设置图片显示范围 hWindowControl1.HalconWindow获得窗体句柄
  31. HOperatorSet.SetPart(hWindowControl1.HalconWindow,0,0, (Height-1), (Width-1)); //0,0, (Height - 1), (Width - 1)代表从0,0坐标到图片的宽高坐标,达到全屏显示
  32. //将图片投射到窗体上
  33. HOperatorSet.DispObj(TestImage, hWindowControl1.HalconWindow);//将TestImage变量投射到句柄窗口上
  34. }
  35. //声明两个变量用于接受窗体上用户输入的灰度值
  36. HTuple MinGray, MaxGray;
  37. private void button_deal_Click(object sender, EventArgs e)
  38. {
  39. //在事件触发之后最先清除窗口避免覆盖显示
  40. hWindowControl2.HalconWindow.ClearWindow();
  41. //为防止用户直接阈值分割而无图片,下面做一个简单判断
  42. if (TestImage == null)
  43. {
  44. button_read_Click(null,null);//当没有事先进行读取图片操作时触发调用,获取图片
  45. }
  46. //设置阈值处理显示颜色
  47. HOperatorSet.SetColor(hWindowControl2.HalconWindow, "blue");
  48. //接受窗体上用户输入的灰度值
  49. MinGray = int.Parse(textBox_Min.Text);//由于textBox_Min.Text是字符串类型利用int.Parse进行强转
  50. MaxGray = int.Parse(textBox_Max.Text);
  51. //阈值分割方法--Threshold()
  52. HObject Region;// 创建HObject类型的变量作为阈值分割的输出
  53. HOperatorSet.Threshold(TestImage,out Region, MinGray, MaxGray);
  54. //在第二个窗口上显示处理结果
  55. HTuple Width, Height;
  56. HOperatorSet.GetImageSize(TestImage, out Width, out Height);
  57. HOperatorSet.SetPart(hWindowControl2.HalconWindow, 0, 0, (Height - 1), (Width - 1));
  58. //将图片投射到窗体上
  59. HOperatorSet.DispObj(Region, hWindowControl2.HalconWindow);//将Region结果投射到句柄窗口上
  60. }
  61. }
  62. }
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2026 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行