目录
版权声明 3
读者利益 3
感谢 4
前言 4
前置条件 5
开发环境 6
1.Halcon中打开采集获取图像 7
1.1 打开图像和显示图像 8
1.1.1 HDevelop中打开图像 8
1.1.2 LabVIEW中使用Halcon打开图像&Halcon显示图像 14
1.1.3 LabVIEW中使用NI Vision打开图像&Halcon显示图像 57
1.1.3.1 LabVIEW库Max函数 59
1.1.3.2 调用代码接口节点CIN 69
1.1.3.3 ArrayMemInfo数组内存信息 86
1.1.3.4 LabVIEW库DSNewPClr和MoveBlock函数 93
1.1.3.5 IMAQ GetImagePixelPtr+Move Block方法 103
1.1.4 LabVIEW中使用Halcon打开图像&LabVIEW显示图像 109
1.2 从相机采集图像 122
1.2.1 HDevelop中从相机采集图像 123
1.2.2 LabVIEW中使用Halcon采集图像和显示图像 143
1.2.2.1 打开OpenFramegrabber 144
1.2.2.2 抓取图像GrabImage(Dispose内存释放算子解决内存溢出) 150
1.2.2.3 关闭CloseFramegrabber/关闭所有CloseAllFramegrabber 163
1.2.2.4 LabVIEW类方式处理Halcon函数 165
1.2.2.5 Halcon算子的子VI处理方式 172
1.2.2.6 Halcon算子的状态机处理方式 179
1.2.2.7 获取相机参数GetFramegrabberParam 218
1.2.2.8 设置相机参数SetFramegrabberParam 231
1.2.2.9 彩色相机的白平衡 237
1.2.3 LabVIEW中使用NI-IMAQdx采集图像使用Halcon显示图像 248
2.Halcon中关于图像的一些基本操作 281
2.1 获取图像信息 281
2.2 图像类型的转换 285
2.3 彩色图像转换为灰度图像 293
2.4 RGB彩色图像转HLS彩色图像 303
2.5 通过饱和度调整图像的鲜艳度 305
2.6 获取鼠标点击位置的坐标 308
2.7 实时获取鼠标移动位置的坐标 312
2.8 获取鼠标位置的像素值 335
2.9 图像缩放 353
2.9.1 1:1原始尺寸 356
2.9.2 平移图像 360
2.9.3 适合窗口 373
2.9.4 缩放图像 389
2.10 覆盖Overlay 402
2.11 ROI兴趣区域 407
3.LabVIEW Halcon图像处理实例 429
3.1 圆直径测量 430
3.1.1 NI Vision找圆与Halcon找圆比较 430
3.1.2 LabVIEW Image中设置ROI测量兴趣区域 440
3.1.3 Halcon HImage中设置ROI测量兴趣区域 469
3.2 Barcode一维条码读取 474
3.2.1 NI Vision与Halcon读取一维码效果对比 474
3.2.2 Halcon中读取一维码 476
3.2.3 LabVIEW实例集成 499
3.2.3.1 Barcode_OP.vi状态机开发 499
3.2.3.2 Barcode_OP.vi状态机集成到实例程序框架 505
3.2.3.3 微小内存增加溢出调试 517
3.3 二维码读取 551
3.3.1 二维码_OP.vi状态机开发 553
3.3.2 二维码_OP.vi状态机集成到实例程序框架 561
3.4 形状匹配 578
3.4.1 Halcon形状匹配介绍 578
3.4.2 HDevelop环境中形状匹配例子 579
3.4.3 形状匹配_OP.vi状态机开发 582
3.4.3.1 创建 583
3.4.3.2 参数 596
3.4.3.3 查找 597
3.4.3.4 读取 602
3.4.3.5 保存 603
3.4.3.6 关闭 604
3.4.4 形状匹配_OP.vi状态机集成到实例程序框架 604
3.4.5 Halcon匹配与NI视觉匹配性能比较 658
3.5 字符识别 663
3.5.1 HDevelop中的OCR 664
3.5.2 字符识别_OP.vi状态机开发 684
3.5.3 字符识别_OP.vi状态机集成到实例程序框架 709
结束语 734
尊敬的读者,当您看到本页时,表示您已经获得了《LabVIEW HALCON图像处理入门教程》的相关版本(PDF电子书等形式)。无论您从何渠道获得本作品,您仅可将其用于自己的学习。《LabVIEW HALCON图像处理入门教程》作品的所有权利(发表权、署名权、修改权、保护作品完整权、复制权、发行权、出租权、展览权、表演权、放映权、广播权、信息网络传播权、摄制权、改编权、翻译权、汇编权及其它权利)归作者石鑫华所有,未经作者同意,您无权将《LabVIEW HALCON图像处理入门教程》用于出版、发行、复制、印刷、信息网络传播、摄制、改编、汇编等等侵权行为。为了维护作者的权益,分发给您的复本是加密的PDF文档,无法打印、复制、编辑等,其中的图片也有可能包含与您相关的水印,敬请谅解!本作品已登记著作权,侵权必究。
《LabVIEW HALCON图像处理入门教程》作品登记证书
亲爱的读者同志,当您通过正规渠道获得《LabVIEW HALCON图像处理入门教程》的复本时,表示您遵守了相关的法律法规。同时也表示了您对知识产权的承认以及对本书作者的尊重。买这本书的钱,对于做视觉的您来说,可能不足一个项目利润的十分之一。当然,对于作者来说,需要这类专业书籍的人也屈指可数,多卖一本少卖一本也发不了财。因此,如果您对本书有兴趣,请不要再跟作者讨价还价。您不是在菜市场买菜,您买的是一份可以有更高回报的经验分享。
为了提升正版阅读体验,在您购买本书时,可在作者网站visionbbs.com视觉论坛中注册相关ID,并通知作者,作者将为您提高相应的权限,以查看、下载论坛有积分限制的阅读内容(需要付费的内容除外)。您通过视觉论坛visionbbs.com可以了解到,作者在机器视觉行业还算有较丰富的应用经验,对于初学者或者是对机器视觉了解不深的工程师,视觉论坛也许可以提供一些必要的帮助,让您可以少走许多弯路,更快的掌握知识,更高效的完成您的机器视觉项目。
首先,感谢您支持作者。您是上帝,您的支持就是作者前进的动力。因此要特别感谢。
其次,感谢NI。因为NI为我们提供了LabVIEW这么好的图像处理开发软件,可以非常快的设计验证视觉项目,了解机器视觉与图像处理。
第三,感谢MVTec。其出口的Halcon性能强大速度快,是图像处理领域中的佼佼者。
第四,感谢MV。没有MV,我们大家也不会走进机器视觉和图像处理这个圈子。因此我们大家都要感谢MV。
从作者多年的使用经验以及机器视觉行业内同行反馈来看,NI Vision有些功能的性能还是比较欠缺的,如一维码/二维码的读取、字符识别、几何匹配等。在这些场景下的项目,可能图像质量差一点,就无法读取或识别了。但是同样的硬件条件得到的同样图片,在Halcon中则可以轻松处理。因此,有些项目要想得到稳定的效果,还是要切换到Halcon的库中进行处理。
Halcon本身的介绍,本教程就不详细介绍了,网上的介绍资料很多,可自行搜索了解。Halcon的图像处理库,可以说是目前商业领域比较强大的图像处理软件。但是因为其主要是针对文本编程环境的,所以大部分的教程、资料等,都是面向C++/C#/.NET/VB之类的文本编程语言。当然,也有一些简单的介绍LabVIEW的,不过都不全面,只是几个简单的使用,相互转来转去的。
创作本教程的初衷,是出于对NI Vision的性能不足,从而转换调用Halcon库来做核心的图像处理,将介绍LabVIEW与Halcon联合开发一些图像处理程序的方法和步骤。因为作者也没有太多Halcon开发的经验,所以只是简单介绍一些Halcon的基本操作以及有限的几个示例,以求打通LabVIEW与Halcon联合开发的壁垒。更多偏向于和作者一起学习,掌握 LabVIEW调用Halcon开发图像处理程序的方法和步骤。对于Halcon中大量的库函数的介绍以及实际项目的实现,本教程则无法满足这个要求。市面上也有一些Halcon方面的作者,创作了相关的教程,可以参考相应的教程。就算法本身来说,用法大概是相通的,只要会了一些LabVIEW中Halcon算子的调用与开发,入门了,那其它函数也是相同的使用方法,再尝试其它的项目也就容易了。
LabVIEW调用Halcon,主要的方式有两种。一种是使用HDevelop集成开发环境开发好相应的脚本程序,测试测量的函数算法、参数设置等,均在此脚本里。然后使用LabVIEW直接调用这些脚本即可完成任务。HDevelop集成开发环境,有点类似于NI VBAI,使用VBAI编写好脚本,也是可以在LabVIEW中调用脚本的。这种方法的好处是,LabVIEW调用简单;不足之处则是参数无法在LabVIEW中调整,必须要借助HDevelop集成环境,而且要安装Halcon。另一种方法,则是利用LabVIEW中的.NET函数节点调用Halcon的DLL中对.NET的编程接口。这种方法的好处是,可以调用所有Halcon中的函数,选择需要的测试测量步骤,并且可以自由的设置参数,在LabVIEW平台中编程灵活度要大的多。这种方法主要调用的是halcondotnet.dll这个动态链接库,所以只需要有可正常运行的halcondotnet.dll文件即可(如正版的或你懂的版),可以不需要安装Halcon即可进行图像处理程序的开发。也不需要再学习HDevelop集成开发环境。当然,对于初学者,可能还是要安装好Halcon,能会HDevelop集成开发环境更理想,因为有些图像处理实现的过程方法,调用的函数,参数的设置,还是需要在此环境中验证的,直接在DLL中调用,因为函数实在太多,有时也会摸不着头脑。这也是这种方法的缺点,就是需要开发者对Halcon的函数有一定的了解,知道常规的图像处理需要使用什么函数、参数的大概范围与意义,否则就需要查询Halcon的开发手册中相关函数的参数意义与使用方法。不过这种要求,即使NI Vision初学者,也是需要查看开发手册查看函数的参数与使用方法,演示例子之类的。对于老司机,那当然就不算什么缺点了。对于本教程,主要介绍的是后面一种方法,即调用halcondotnet.dll文件来完成图像处理的任务(主要是使用这个库文件,如果要使用Halcon驱动相机采集图像,还需要相机驱动文件,这个在后面介绍要用到时再介绍)。而调用HDevelop脚本的方法,本教程就不介绍了,网上也有一些简单的教程,作者也没有认真研究,就不献丑了。
《LabVIEW HALCON图像处理入门教程》中示例源代码在创作时,花费了不少时间与精力,因此不作为教程的免费资源提供,如需要源代码,可付费购买。
《LabVIEW HALCON图像处理入门教程》主要面向使用LabVIEW调用NI Vision的软件工程师,介绍LabVIEW环境中调用NI Vision库与Halcon库混合编程的方法,属于入门级教材。如果您已经能使用LabVIEW + Halcon玩出花来了,那么本教程不是很适合,会觉得太过简单。而如果您还没有学会LabVIEW + NI Vision的图像处理软件的开发,则会觉得本教程讲的乱七八糟,教程中的有关NI Vision的一些函数、概念莫名其妙、不明所以。
在阅读《LabVIEW HALCON图像处理入门教程》之前,首先应该对LabVIEW的编程方法与原理,有一定的了解,这样对于您使用LabVIEW来开发图像处理软件,将有非常大的帮助。因为教程中的演示例子,重点是介绍图像处理函数的,并不会去介绍LabVIEW的使用方法,如果您对于LabVIEW不了解,那可能会增加学习难度。
其次,《LabVIEW HALCON图像处理入门教程》教程第三章的实例,均是基于作者《NI Vision图像处理开发宝典》中的实例程序框架开发的,也就是LabVIEW中的生产者消费者编程模式。学习《LabVIEW HALCON图像处理入门教程》前,至少对生产者消费者模式有熟练的掌握,明白程序该如何初始化、如何调试、如何自动运行、如何退出,或者是先学习过《NI Vision图像处理开发宝典》。后面介绍的实例中,很多辅助的生产者、消费者,例如初始化、用户登录、保存结果、保存图像、保存机种配置文件、切换机种之类的,都是没有介绍的;甚至是自定义控件都没有花什么篇幅来介绍。重点只是介绍了图像处理相关以及一些与图像处理相关的初始化、释放关闭等生产者消费者,也就是《NI Vision图像处理开发宝典》修改新项目的过程。
第三,《LabVIEW HALCON图像处理入门教程》不是纯粹的调用Halcon的库函数来完成图像处理任务的,而是使用了LabVIEW+NI Vision+Halcon的方式混合编程的。目的就是为了解决一些NI视觉中解决不了问题(如稳定性、速度、性能等方面的欠缺),从而调用Halcon来解决问题。所以,还需要您对NI Vision有充分的了解。NI Vision相关的应用可以参考作者的《LabVIEW Vision函数实例详解》,这个教程是介绍NI Vision每个函数的使用方法的;或者是《NI视觉助手图像处理教程》,这个教程是介绍NI Vision的视觉助手的,包含了大部分的NI Vision大部分的图像函数的使用方法。
本教程介绍的开发环境:
LabVIEW开发环境:LabVIEW 2020 SP1 32位中文版:
http://pcmv.cn/thread-26291-1-1.html
NI视觉开发模块:NI Vision Development Module 2020 SP1
http://pcmv.cn/thread-25964-1-1.html
NI视觉采集软件:NI Vision Acquisition Software 20.6
http://pcmv.cn/thread-25966-1-1.html
Halcon环境:Halcon 19.11.0.0 Progress进阶版
http://pcmv.cn/thread-22554-1-1.html
Halcon安装时,可以选择安装32位版本和64位版本。本教程使用的是32位版本。这个需要与LabVIEW位数版本对应,如果LabVIEW是64位版本,则安装使用64位版本。安装后,对于64位的版本,则其支持文件位于.. HALCON-19.11-Progressind-win64目录下,如果需要使用你懂的版本,那就要将相应的Halcon.dll放到此目录下替换原始文件。而如果是32位版本,则其支持文件位于.. HALCON-19.11-Progressinsse2-win32目录下,要使用你懂的版本,那也是要用相应的Halcon.dll文件替换此目录下的原始文件。而对于我们要调用的halcondotnet.dll文件,是位于..HALCON-19.11-Progressindotnet35目录下,这个是不区分32和64位的。而对于其它一些DLL,如要使用HSmartWindowControl,则需要使用hcanvas.dll,这个DLL则是区分32和64位的(也就是sse2-win32目录下的,则是32位的,而x64-win64目录下的,则是64位的,只要用到了这些目录下的,则区分32/64位)。从Halcon 20.11版本开始,不再支持32位版本,只能使用64位版本。
对于DLL的版本,可以通过VS带的工具查看DLL是32还是64位,也可以直接用记事本打开DLL,然后搜索关键字PE,找到第一个PE,其后面是D字母的,则表示为64位的DLL,其后面是L字母的,则表示为32位的DLL。对于Halcondotnet.dll来说,通过后面的验证,只有32位版本的,没有64位版本的,即使在安装时,选择64位的,Halcondotnet.dll这个库也是32位版本的。
查看DLL位数版本-32位的dll
查看DLL位数版本-64位的dll
另外,这个halcondotnet.dll还区分.NET的版本,如19.11安装后,还有个支持.NET2.0的..HALCON-19.11-Progressindotnet20目录,其下也有halcondotnet.dll。当然,对于使用你懂的版本halcondotnet.dll,都需要用你懂的halcon.dll替换32或64位目录下的halcon.dll原始文件。
如果不安装Halcon,也是可以调用halcondotnet.dll进行开发的,这时需要将你懂的halcon.dll和halcondotnet.dll一起放到C:Windows目录下(一般是这样操作,至于放到开发目录下能不能正常工作,可以自行测试)。
要想开发图像处理程序,首先当然是要得到要处理的图像。常见的有打开图片的方式,这种只适用于功能演示,看看是不是可以实现功能。图片可以是其它任何图像采集设备得到的图像,如工业相机、摄像头、手机、数码单反、监控等等。另外一种,则是直接从图像采集设备中得到图像,这也是常规的机器视觉项目中使用的方法。
首先,我们来看个简单的打开图像的小示例。先不急着在LabVIEW中编程,而是在HDevelop中看看打开图像是如何实现的:
打开HDevelop
打开HDevelop IDE环境,然后关闭欢迎界面(如有兴趣,也可以点击相关的内容了解更多详情)。
菜单中选择助手>打开新的Image Acquisition
然后在HDevelop中选择菜单中的助手>打开新的Image Acquisition。这里的助手功能将帮助我们在HDevelop环境中打开或采集图像。
弹出Image Acquisition界面
弹出的Image Acquisition界面,默认是选择资源选项卡。在这个资源选项卡中,可以选择从图像获取接口(相机等采集图像),也可以选择图像文件。这里我们先尝试打开图像,而不是从相机中采集图像。所以,这里我们选择下面的图像文件选项。选中图像文件后,则选择文件和选择路径都启用,可以使用选择文件来选择单一的文件,也可以使用选择目录来选择文件夹中所有文件:
打开文件
打开文件后,就如上图所示,会加载图像到HDevelop环境中。但是这时程序窗口没有提示使用了什么函数。然后再选择代码生成选项卡,相关的参数都使用默认值(打开图像时,只有一个图像对象是可变的,这里默认为image。这里大概与NI Vision中的Create创建图像引用时指定的名称效果一样,不同的名称,则代表了不同的图像引用,对于不同的图像,使用不同图像对象),然后我们点击其中插入代码:
代码生成界面
代码生成后的界面
程序窗口
代码生成后,在程序窗口中可以看到,读取图像调用了函数read_image,将鼠标放置在函数上,会显示即时帮助(HDevelop的即时帮助相对比较简单,没有LabVIEW的即时帮助详细)。从其后面的参数格式可以看到,其第一个参数就是图像对象Image,第二个参数则是打开图像文件的路径和名称。为了理解,我们可以打开Halcon的帮助文档(IDE环境中帮助菜单或F1),查看read_image函数的具体解释:
帮助文档
Halcon安装的本地帮助文档,只有英文、德语、日语版本。如果外国语言不佳的,看起来可能比较吃力。另外,可以打开MVTEC的在线帮助文档页面,可以利用浏览器的在线翻译功能,也许会有一些帮助。Halcon 19.11版的帮助链接为(各个版本的帮助链接是不一样的):
https://www.mvtec.com/doc/halcon/1911/en/index.html
Halcon 19.11在线帮助页面
而具体的函数可以通过导航查找,如本节介绍的read_image函数,在File>Images下面:
链接为:
https://www.mvtec.com/doc/halcon/1911/en/read_image.html
具体帮助打开后,如下图:
英语原版函数说明
可以启用浏览器在线翻译功能(部分浏览器功能,或需要安装插件,不代表全部浏览器都有此功能):
翻译后的函数说明
翻译的内容,只是机器翻译,很多地方肯定是不太准确的,不过也了胜于无。如果对于其它的一些比较难理解的函数,可以尝试搜索引擎搜索,有很多函数,都有人做了汉化说明,可能更准确实用。
翻译后的函数说明
翻译的内容,只是机器翻译,很多地方肯定是不太准确的,不过也了胜于无。如果对于其它的一些比较难理解的函数,可以尝试搜索引擎搜索,有很多函数,都有人做了汉化说明,可能更准确实用。
前50页试读版本下载:
LabVIEW HALCON图像处理入门教程 LabVIEW使用NI VISION+Halcon混合编程机器视觉与图像处理入门学习资料
http://pcmv.cn/thread-28124-1-1.html?fromuid=9
(出处: 机器视觉论坛PCMV.CN)
完整版购买地址:
https://item.taobao.com/item.htm?ft=t&id=669162439269