Halcon的C#二次开发及经验分享
本文涉及面较广,因此很难在所有方面都讲解得很详细,故适合具有一定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(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位的)的方法如下:
public static HImage Bitmap2HImage_24(Bitmap bImage)
{
Bitmap bImage24;
BitmapData bmData = null;
Rectangle rect;
IntPtr pBitmap;
IntPtr pPixels;
HImage hImage = new HImage();
rect = new Rectangle(, , bImage.Width, bImage.Height);
bImage24 = new Bitmap(bImage.Width, bImage.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bImage24);
g.DrawImage(bImage, rect);
g.Dispose();
bmData = bImage24.LockBits(rect, ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
pBitmap = bmData.Scan0;
pPixels = pBitmap;
hImage.GenImageInterleaved(pPixels, "bgr", bImage.Width, bImage.Height, -, "byte", , , , , -, );
bImage24.UnlockBits(bmData); return hImage;
}
public static HImage Bitmap2HImage_8(Bitmap bImage)
{
Bitmap bImage8;
BitmapData bmData = null;
Rectangle rect;
IntPtr pBitmap;
IntPtr pPixels;
var hImage = new HImage();
rect = new Rectangle(, , bImage.Width, bImage.Height);
bmData = bImage.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed);
pBitmap = bmData.Scan0;
pPixels = pBitmap;
hImage.GenImage1("byte", bImage.Width, bImage.Height, pPixels);
bImage.UnlockBits(bmData);
//formathimage = hImage;
return hImage;
}
8、在hWindowControl控件中缩放图像
在hWindowControl中鼠标位置可用GetMposition获得,SetPart可改变窗口中显示的图像部分。
HOperatorSet.GetMposition(hWHandle, out mouseY, out mouseX, 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 : : Tolerance : Rows, Columns)
坐标点转化为Region:gen_region_polygon_filled( : Region : Rows, Columns : )
Xld转化为坐标点 :get_contour_xld(Contour : : : Row, Col)
坐标点转化为Xld :gen_contour_polygon_xld( : Contour : Row, Col : )
Halcon的C#二次开发及经验分享的更多相关文章
- thinkphp开发技巧经验分享
thinkphp开发技巧经验分享 www.111cn.net 编辑:flyfox 来源:转载 这里我给大家总结一个朋友学习thinkphp时的一些笔记了,从变量到内置模板引擎及系统变量等等的笔记了,同 ...
- Java程序员转Android开发必读经验分享
小编最近几日偷偷的发现部分Java程序员想转安卓开发,故此加紧补充知识,为大家搜集资料,积极整理前人的经验,希望可以给正处于困惑中的你,带来些许的帮助. 啰哩啰嗦的说说Java和Android程序的区 ...
- 关于启用 HTTPS 的一些经验分享(二)
转载: 关于启用 HTTPS 的一些经验分享(二) 几天前,一位朋友问我:都说推荐用 Qualys SSL Labs 这个工具测试 SSL 安全性,为什么有些安全实力很强的大厂家评分也很低?我认为这个 ...
- 免费提供UG、ProE二次开发、定制化开发服务
免费提供UG.ProE二次开发,定制开发服务. 拥有六年UG.ProE二次开发经验,相关项目经验. 从事过智能设计.计算机图形学相关研究. 联系方式: QQ:1787326383 微信号:begtos ...
- Magento 二次开发手册相关
最近开始学习Magento二次开发,其实以前在科泰的时候就已经见识到这套电子商务系统的复杂了,当时是部门要上一个Mangeto的团购系统,傻东安装就安装了2天才搞定,安装以后发现有300多张表,当时说 ...
- 最好最实用的PHP二次开发教程
◆二次开发 1.什么是二次开发? 二次开发,简单的说就是在现有的软件上进行定制修改,功能的扩展,然后达到自己想要的功能和效果,一般来说都不会改变原有系统的内核. 2.为什么要二次开发? 随着信息化技术 ...
- [转] GIS二次开发(C#+AE)
乘风莫邪 原文GIS二次开发(C#+AE) 此过程描述了使用ArcGIS控件建立和部署应用的方法和步骤. 你可以在下面的目录下找到相应的样例程序: <</FONT>安装目录>/ ...
- ODI KM二次开发手册
ODI KM二次开发手册 分类: ODI(16) 目录(?)[+] 1 引言 1.1 编写目的 本手册面向的读者对象为具备数据集成业务知识及对ODI操作了解的开发人员,作为其完成基于ODI基础上K ...
- 【老司机经验】CC2530&STM8S105二合一嵌入式学习板设计思路与经验分享
CC2530&STM8S105二合一嵌入式学习板设计思路与经验分享 1.缘起 这些年来一直在其他公司的实验箱和别人的开发板上进行教学与开发工作,总是觉得功能设计不那么合意.心里突然冒出个 ...
随机推荐
- PHP mysqli_fetch_object() 函数实例讲解
定义和用法 mysqli_fetch_object() 函数从结果集中取得当前行,并作为对象返回. 注释:该函数返回的字段名是区分大小写的. 语法 mysqli_fetch_object(result ...
- python中的logger模块详细讲解
logger 提供了应用程序可以直接使用的接口handler将(logger创建的)日志记录发送到合适的目的输出filter提供了细度设备来决定输出哪条日志记录formatter决定日志记录的最终输出 ...
- JoinableQueue---创建可连接的共享进程队列
创建可连接的共享进程队列.这就像是一个Queue对象,但队列允许项目的使用者通知生产者项目已经被成功处理. 通知进程是使用共享的信号和条件变量来实现的. from multiprocessing im ...
- GD库简介和使用
简介 php并不仅限于创建html输出,它也可以创建和处理包括GIF,PNG,jpef,wbmp以及xpm在内的多种格式的图像.更加方便的是,php可以直接将图像数据库输出到浏览器.要想在php中使用 ...
- uva-193-图染色-枚举
题意:n个节点,可用描成黑色或者白色,黑节点和黑节点不能相连,问最多描出多少黑节点 #include <iostream> #include <stdio.h> #includ ...
- Code First use dotConnect for MySQL
http://www.dotblogs.com.tw/yc421206/archive/2014/03/24/144507.aspx dotConnect for MySQL 是一家強大的 3rd C ...
- 【独家】完美解决appium安装app时,需要手动确认安装的问题
appium初始化driver时,如果未安装该app会先进行安装,安装时,很多安卓手机都会弹框,需要手动确认安装. 如小米的机器, 这是个头疼的问题,之前在网上找遍了,只有通过adb去点相对坐标成功了 ...
- ajax 实现跨域
ajax本身是不可以跨域的,通过产生一个script标签来实现跨域.因为script标签的src属性是没有跨域的限制的. 其实设置了dataType: 'jsonp'后,$.ajax方法就和ajax ...
- cnapckSurround c++builder Region 代码折叠快捷键
C++Builder代码折叠 cnapckSurround c++builder Region 代码折叠快捷键,可以导入导出,IDE code edit,cnpack menu surround wi ...
- Egret 工具推荐
Egret 工具推荐--打造最好的开发环境--IDE篇http://bbs.egret.com/forum.php?mod=viewthread&tid=13581&fromuid=1 ...