c# draw halcon_Halcon的C#二次开发及经验分享

本文介绍了Halcon与C#结合开发的两种方式,推荐使用函数导出的方式,便于维护。详细讲解了开发必备的设置步骤,包括添加halcondotnet.dll引用、设置控件和目标平台等。还分享了Halcon图形元素的显示、系统全局参数设置、调试方法、文字显示、格式转换、图像缩放以及图形元素与其他图像算法库数据交互的技巧。
摘要由CSDN通过智能技术生成

本文涉及面较广,所以很难在全部方面都讲解得很详细,故适合具备必定Halcon开发经验的人阅读。算法

1、Halcon二次开发的两种方式编程

① 使用C#的语法方式逐句改写Halcon代码函数

优势:各类变量的类型清楚,可读性强,改写后代码行数几乎不会增长多少。工具

缺点:改写工做量大,容易出错,若是Halcon代码量大,后期将难以更新维护。spa

② 封装成函数导出 (推荐)插件

优势:操做简单,对开发人员编程能力要求低,工做量少,且便于维护。调试

缺点:Halcon函数导出的代码可读性极低,一旦丢失原Halcon文件,二次开发程序将难以更新维护。code

建议:主二副一。orm

2、Halcon联合C#开发必备的设置步骤(Halcon 12 + Visual studio 2013)blog

① 在项目“引用”中添加halcondotnet.dll。其通常路径以下:

C:\Program Files\MVTec\HALCON-12.0\bin\dotnet35\halcondotnet.dll

② 在“工具箱”的“选择项”中添加hWindowControl控件,这是Halcon 12惟一提供的控件

③ 在用到Halcon代码的类顶部添加using HalconDotNet;

④ 在“属性”——“生成”中将目标平台由“Any CPU”改成“x64”(计算机推荐使用64位系统)

⑤ 若是安装Halcon时不是安装在默认路径,可能须要将halcon.dll文件复制到当前项目的输出路径下,halcon.dll的路径为:C:\Program Files\MVTec\HALCON-12.0\bin\x64-win64\halcon.dll

3、Halcon图形元素的显示

hWindowControl1.HalconWindow.DispObj(image);//显示图像、Region、Xld

hWindowControl1.HalconWindow.SetDraw("margin");//设置填充的模式

hWindowControl1.HalconWindow.SetColor("green");//设置显示颜色

4、系统全局参数设置(非必要,但建议设置)

HOperatorSet.SetSystem("do_low_error","false");//少报错

HOperatorSet.SetSystem("clip_region","false");//region在图像外不切掉

HOperatorSet.SetSystem("border_shape_models","true");//依然匹配边缘的图形

5、调试

C#中Halcon部分代码的调试不太方便,但也不是毫无办法。

① 调试时HTuple类型的变量能够直接查看值。

② Image、Region、Xld的变量通常只能经过“保存文件到本地”来查看变量状况。

HOperatorSet.WriteImage(image,"jpg",0x000000,"1.jpg");//彩色图像

HOperatorSet.WriteImage(image,"jpg",0,"1.jpg");//灰度图像

HOperatorSet.WriteRegion(ho_RegionUnion,"1.hobj");//后缀用.reg也行

HOperatorSet.WriteContourXldDxf(contours,"1.dxf");

③ 安装Halcon的变量检查插件到Visual Studio。该安装文件所在的默认路径为:

C:\Program Files\MVTec\HALCON-12.0\misc\HALCON_Variable_Inspect.vsix

6、在hWindowControl控件中显示文字

如下两个函数的内容由Halcon中的set_display_font和disp_message算子导出,可完成控件中的文字显示。

set_display_font(windowHandle,hv_TextSize,"mono","true","false");

disp_message(windowHandle,hv_Text,"window",row,col,hv_Color,"true");

7、格式转换

① HTuple兼容int、double等数据类型

② HObject类型的图像兼容HImage类型的图像

③ Bitmap转Himage(24位或8位的)的方法以下:

1 public staticHImage Bitmap2HImage_24(Bitmap bImage)2 {3 Bitmap bImage24;4 BitmapData bmData = null;5 Rectangle rect;6 IntPtr pBitmap;7 IntPtr pPixels;8 HImage hImage = newHImage();9 rect = new Rectangle(0, 0, bImage.Width, bImage.Height);10 bImage24 = newBitmap(bImage.Width, bImage.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);11 System.Drawing.Graphics g =System.Drawing.Graphics.FromImage(bImage24);12 g.DrawImage(bImage, rect);13 g.Dispose();14 bmData =bImage24.LockBits(rect, ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);15 pBitmap =bmData.Scan0;16 pPixels =pBitmap;17 hImage.GenImageInterleaved(pPixels, "bgr", bImage.Width, bImage.Height, -1, "byte", 0, 0, 0, 0, -1, 0);18 bImage24.UnlockBits(bmData);19

20 returnhImage;21 }

1 public staticHImage Bitmap2HImage_8(Bitmap bImage)2 {3 Bitmap bImage8;4 BitmapData bmData = null;5 Rectangle rect;6 IntPtr pBitmap;7 IntPtr pPixels;8 var hImage = newHImage();9 rect = new Rectangle(0, 0, bImage.Width, bImage.Height);10 bmData =bImage.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed);11 pBitmap =bmData.Scan0;12 pPixels =pBitmap;13 hImage.GenImage1("byte", bImage.Width, bImage.Height, pPixels);14 bImage.UnlockBits(bmData);15 //formathimage = hImage;

16 returnhImage;17 }

8、在hWindowControl控件中缩放图像

在hWindowControl中鼠标位置可用GetMposition得到,SetPart可改变窗口中显示的图像部分。

HOperatorSet.GetMposition(hWHandle,out mouseY,outmouseX,out mbutton);

HOperatorSet.SetPart(hWHandle,mRow1,mCol1,mRow2,mCol2);

set_part:用于修改窗口中显示的图像部分。(Row1,Column1) 表示要显示的图像部分的左上角, (Row2,Column2)表示要显示的图像部分的右下角。(详见dev_set_part和set_part的帮助文档)

9、Halcon图形元素与其余图像算法库数据的交互

Halcon的Region、Xld是本身的特有格式,它们与外界是不通用的。目前我研究出来的主要是经过将坐标点做为桥梁来与外界进行数据交互。

Region转化为坐标点:get_region_polygon(

坐标点转化为Region:gen_region_polygon_filled( :

Xld转化为坐标点   :get_contour_xld(

坐标点转化为Xld   :gen_contour_polygon_xld( :

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值