一、在成功创建Windows窗体应用(.NET framework)及成功调用halcondotnet.dll文件后
1.创建基础窗口及按键
2.创建两个个新类,一个用来封装,一个用来调用代码
3.首先在ImageHelper类中写入读取图片的方法
这里是写一个静态方法,用于读取图像文件,并在窗口中显示图像。方法的参数包括输出参数hImage,用于存储读取的图像对象;字符串参数filename,用于指定要读取的图像文件的路径;HWindow类型的参数window,用于指定图像显示的窗口。
(1).HOperatorSet.ReadImage方法读取filename路径中的图像文件,并将结果存储在hImage变量中。
(2).HOperatorSet.GetImageSize方法获取图像的宽度和高度,存储在width和height变量中。
( 3).HOperatorSet.SetPart方法设置图像显示的范围,参数包括窗口、左上角和右下角的坐标。
(4).HOperatorSet.DispObj方法在窗口中显示图像。
通过try {} catch{}输出异常处理
异常处理部分,如果读取图像出现异常,会将hImage设为null,并返回false,表示读取失败。
public static bool ReadImage(out HObject hImage, string filename, HWindow window)
{
try
{//从路径中读取图片并输出
HOperatorSet.ReadImage(out hImage, filename);
//设置长宽
HTuple width, height;
//从图片中输出并设置在后面图片显示的窗体中
HOperatorSet.GetImageSize(hImage, out width, out height);
HOperatorSet.SetPart(window, 0, 0, (height - 1), (width - 1));
HOperatorSet.DispObj(hImage, window);
return true;
}
//查找错误并返回空值
catch
{
hImage = null;
return false;
}
}
4.给读取图片的按键设置点击事件,并写入图片读取显示函数使其能够点击并显示图片
(1).首先设置HObject变量ho_image,HObject是Halcon图像库中的一个类,用来表示图像对象。
(2).定义了一个字符串变量filename,并给它赋值
(3).调用Algorithm.ImageHelper类中的ReadImage方法
(4).判断result的值来确定ReadImage方法是否执行成功。如果result为true,则表示成功读取图像;否则,弹出一个对话框显示"Algorithm.ImageHelper.ReadImage 失败"
private HObject ho_image;
private void button1_Click(object sender, EventArgs e)
{
string filename = "E:\\cad\\模板匹配图片\\metal-parts-06.png";
bool result = Algorithm.ImageHelper.ReadImage(out ho_image, filename, hWindowControl1.HalconWindow);
if (result != true)
{
MessageBox.Show(" Algorithm.ImageHelper.ReadImage 失败");
}
}
5.阈值分割这里分为 普通阈值分割:HOperatorSet.Threshold(hImage, out Region, minGray, maxGray);
和自动阈值分割:HOperatorSet.BinaryThreshold(hImage, out Region, "max_separability", " dark",out s);
其中的主要参数有普通阈值分割的最大最小灰度值,自动阈值分割分割的方法max_separability,smooth_histo,还有采用的亮暗划分。
因此ThreSholdDef类中写入三个枚举类型,并通过重载构造函数将两个分割方式的参数分别传入
namespace Algorithm
{
public enum 阈值分割方式
{
Threshold = 0,
BinaryThreshold = 1,
}
public enum 自动阈值分割方法
{
max_separability = 0,
smooth_histo = 1,
}
public enum 亮或暗
{
dark = 0,
light = 1
}
public class ThreSholdDef
{
public ThreSholdDef(int minGray, int maxGray)
{
_Segment = 阈值分割方式.Threshold;
_MaxGray = maxGray;
_MinGray = minGray;
}
public ThreSholdDef(自动阈值分割方法 segmentMothd, 亮或暗 lightOrDark)
{
_Segment = 阈值分割方式.BinaryThreshold;
_SegmentMothd = segmentMothd;
_LightOrDark = lightOrDark;
}
public 阈值分割方式 _Segment;
public int _MaxGray;
public int _MinGray;
public 自动阈值分割方法 _SegmentMothd;
public 亮或暗 _LightOrDark;
}
}
6.在将参数封装后,再在ImageHelper中调用并写入方法,通过ThreSholdDef Def调用
开始先给Region赋予空值,再根据阈值分割的方式分别进行操作
1,如果Def._Segment是Threshold,调用HOperatorSet.Threshold方法,使用参数Def._MinGray作为阈值进行图像分割。
2,如果Def._Segment是BinaryThreshold,调用HOperatorSet.BinaryThreshold方法,使用参数Def._SegmentMothd和Def._LightOrDark作为分割方法和光暗模式,并将结果保存在输出图像Region中。
3,如果Def._Segment不是上述两种方式,返回false。
注:因为参数封装在ThreSholdDef类中是枚举类型,而在ImageHelper中引用的“阈值分割方法”和“亮或暗”为字符串类型,因此需要ToString()去修饰改为字符输出。
public static bool Threshold_all(HObject hImage, out HObject Region, ThreSholdDef Def)
{
Region = null;
switch (Def._Segment)
{
case 阈值分割方式.Threshold:
HOperatorSet.Threshold(hImage, out Region, Def._MinGray, Def._MinGray);
break;
case 阈值分割方式.BinaryThreshold:
HTuple s;
HOperatorSet.BinaryThreshold(hImage, out Region, Def._SegmentMothd.ToString(), Def._LightOrDark.ToString(),out s);
break;
default:
return false ;
}
return true; ;
}
7.最后再在阈值分割按键中创建点击事件,并且调用ThreSholdDef中的参数,再将参数引用至
ImageHelper类中的Threshold_all方法。
private void button2_Click(object sender, EventArgs e)
{
string filename = "E:\\cad\\模板匹配图片\\metal-parts-06.png";
bool result = Algorithm.ImageHelper.ReadImage(out ho_image, filename, hWindowControl1.HalconWindow);
HObject Region;
Algorithm.ThreSholdDef btd = new Algorithm.ThreSholdDef(自动阈值分割方法.max_separability, 亮或暗.dark);
Algorithm.ImageHelper.Threshold_all(ho_image,out Region,btd);
HOperatorSet.DispObj(Region, hWindowControl1.HalconWindow);
}
二、结果