halcon视觉入门扫盲篇
halcon视觉入门扫盲篇
前言
????在公司让我研究视觉的时候,我是两眼一抹黑的。之前完全没有接触过视觉。综合权衡后选择了Halcon,使用的是HDevelop 13 (64-bit)。
????下载地址 官方下载
????破解有点麻烦,我使用的是文件替换破解。一个exe文件一个dll文件,替换即可。
假设以上环境搭建没有问题,现在开始了解视觉识别的套路
基础知识
既然是做视觉,就需要图像,不管这个图像是从摄像头读过来的还是从文件中读取的。图片有一些基础信息,比如:
通道:一张图片一般有3个通道,也就是R G B 三个通道,R 代表红色 G 代表绿色 B 代表蓝色。
像素:计算机存储每个图片有N多个像素点,我们常说某个相机有几百万像素,说的就是这个,像素在计算机存储层面不可分割,是最小粒子。但在视觉算法上是可以的(后面再说)。
灰度值:灰度也可以认为是亮度,也是黑白图像中点的颜色深度,范围一般从0到255,白色为255 ,黑色为0,故黑白图片也称灰度图像。(如此简单理解即可)
Region:区域,根据特征提取出来的一些范围。
算子:直接理解成方法。
知道这些基础知识以后,我们在来理解什么是视觉识别。也别去看百度百科了,简单的理解就是,通过提取图像中的特征,选取我们需要的区域,从而达到一定的目的。
比如,有如下图
需要识别每个方格中是否有芯片。这是一个需求。根据这个需求,我们来进行需求拆解:
1. 如何在这张图里面得到这些方格。
2. 如何在每个方格中判断芯片是否存在。
大体思路就是这样了,接下来对图像进行分析,得到具体解决问题的思路:
如何在这张图里面得到这些方格。
分析图像可以知道:
-
方格是白色的,亮度较高。但白色的内容不只有方格,所以在提取特征的时候,需要注意。
-
方格比较规整,都是方形,面积相似。
-
方格与方格相连,所在的区域在整个图像的中心位置。
以上就是分析图像得到的信息。这些信息就是方格的特征,我们通过特征进行筛选,从而得到所有的方格。
如何判断方格中是否存在芯片
此时我们的兴趣点就在每个方格中,所以分析每个方格,我们可以得出一下结论:
-
芯片面积大小都差不多。
-
因为光照不均匀,导致有些地方的芯片亮度较高,有些亮度比较低,这可能是我们识别芯片过程中的难点。
-
芯片都是矩形。
-
有些芯片跟白色方格线比较近,可能会给我们识别芯片带来干扰。
-
芯片颜色灰度跟方格中的背景色不一致。
-
如果方格中没有芯片,那么方格中没有上述特征。
以上是特征分析,和解决问题的思路,接下来是编程的套路。
视觉分析的编程套路一般如下几个步骤:
- 打开图片(OpenImage)
- 将图片分解成3通道图片,或是转成灰度图(GrayImage)。
- 二值化或动态二值化(Region)。
- 联通区域。
- 特征筛选。
- 如果区域有干扰,一般会进行一下操作:
- 腐蚀
- 膨胀
- 形状转换
- 以上步骤重复,或组合重复。
- 根据需要,还可以合并区域,并重复4-6,从而达到目的。
- 输出区域并标注。
实则还有其他的处理方式,比如我们需要的区域特征不明显,不需要的区域特征很明显,此时,我们可以获取不需要的区域,然后使用相减的方式得到需要的区域。(这个会在实际的使用中讲到)
接下来进行答疑
我在学习的过程中,产生了很多疑问,直到我反复编程理解后才明白为什么要这么做。在这里,我会先给出答案。
Q:为什么需要将图片分解成3通道图片,或是灰度图?
A:我的理解是,因为如果不分解,图片是RGB三通道图片,那么程序就不知道对哪个通道进行操作。将图片转换为灰度图或是单通道后,我们才能根据图片的明暗,也就是灰度,进行特征提取。
Q:什么是二值化?
A:二值化通俗的讲就是通过两个灰度值来分割出感兴趣的区域。比如,我需要的区域很亮,我查看特征后发现,这个区域的亮度范围在 210-255之间。此时我就可以通过 threshold 算子,如: threshold(Image, Region, 210, 255) 来得到我们感兴趣的区域 Region。这里 Image是输入参数,210是控制参数,255是控制参数,Region是输出参数。
Q:什么是联通区域?
A:联通区域实际上是一个算子 connection,是这样调用的:connection (Region, ConnectedRegions) ,实际上我们通过二值化得到的区域不一定就完全是我们需要的内容,可能会存在干扰。也就是说,会有很多个区域存在,但这些区域在没有执行 connection之前是一个整体,我们只有在对他进行联通之后,才会被分割成多个对象。此时,我们就可以通过,面积,长宽,矩形相似度等特征进行进一步筛选。总的说回来,connection这个算子虽然说是联通区域,但实际上是将区域分割成多个部分。
Q:什么是特征筛选?
A:特征筛选是通过面积,长宽,矩形相似度,灰度值等条件,将我们需要的内容筛选出来。
Q:什么是腐蚀?
A:腐蚀的前提是我们要的比实际的结果要小,所以需要对目标区域进行腐蚀,让它变小。
Q:什么是膨胀?
A:膨胀跟腐蚀正好相反,因为我们要的比较大,但目标区域比较小,所以我们需要让它变大。
Q:什么是形状转换?
A:将目标区域转化为特定的形状,比如得到的区域是一个不规则的矩形,我们可以作外接矩形或是外接圆,让它更符合实际结果。