ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Halcon的C#二次开发及经验分享

2022-05-03 12:33:16  阅读:228  来源: 互联网

标签:HOperatorSet C# Region bImage 图像 二次开发 Halcon bmData


本文涉及面较广,因此很难在所有方面都讲解得很详细,故适合具有一定Halcon开发经验的人阅读。

 

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

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

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

缺点:改写工作量大,容易出错,如果Halcon代码量大,后期将难以更新维护。

 

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

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

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

 

建议:主二副一。

 

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

① 在项目“引用”中添加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(windowHandlehv_TextSize"mono""true""false");

disp_message(windowHandlehv_Text"window"rowcolhv_Color,"true");

 

7、格式转换

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

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

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

复制代码
 1 public static HImage Bitmap2HImage_24(Bitmap bImage)
 2 {
 3     Bitmap bImage24;
 4     BitmapData bmData = null;
 5     Rectangle rect;
 6     IntPtr pBitmap;
 7     IntPtr pPixels;
 8     HImage hImage = new HImage();
 9     rect = new Rectangle(0, 0, bImage.Width, bImage.Height);
10     bImage24 = new Bitmap(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     return hImage;
21 }
复制代码 复制代码
 1 public static HImage Bitmap2HImage_8(Bitmap bImage)
 2 {
 3     Bitmap bImage8;
 4     BitmapData bmData = null;
 5     Rectangle rect;
 6     IntPtr pBitmap;
 7     IntPtr pPixels;
 8     var hImage = new HImage();
 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     return hImage;
17 }
复制代码

 

8、在hWindowControl控件中缩放图像

 

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

 

HOperatorSet.GetMposition(hWHandleout mouseYout mouseXout mbutton);

HOperatorSet.SetPart(hWHandlemRow1mCol1mRow2mCol2);

 

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

 

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

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

 

Region转化为坐标点:get_region_polygon(Region : : Tolerance : RowsColumns)

坐标点转化为Region:gen_region_polygon_filled( : Region : RowsColumns : )

 

Xld转化为坐标点   :get_contour_xld(Contour : : : RowCol)

坐标点转化为Xld   :gen_contour_polygon_xld( : Contour : RowCol : )

标签:HOperatorSet,C#,Region,bImage,图像,二次开发,Halcon,bmData
来源: https://www.cnblogs.com/chinasoft/p/16218094.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有