halcon视觉入门扫盲篇

halcon视觉入门扫盲篇

前言
    在公司让我研究视觉的时候,我是两眼一抹黑的。之前完全没有接触过视觉。综合权衡后选择了Halcon,使用的是HDevelop 13 (64-bit)。

    下载地址 官方下载

    破解有点麻烦,我使用的是文件替换破解。一个exe文件一个dll文件,替换即可。

假设以上环境搭建没有问题,现在开始了解视觉识别的套路

基础知识

既然是做视觉,就需要图像,不管这个图像是从摄像头读过来的还是从文件中读取的。图片有一些基础信息,比如:

通道:一张图片一般有3个通道,也就是R G B 三个通道,R 代表红色 G 代表绿色 B 代表蓝色。

像素:计算机存储每个图片有N多个像素点,我们常说某个相机有几百万像素,说的就是这个,像素在计算机存储层面不可分割,是最小粒子。但在视觉算法上是可以的(后面再说)。

灰度值:灰度也可以认为是亮度,也是黑白图像中点的颜色深度,范围一般从0到255,白色为255 ,黑色为0,故黑白图片也称灰度图像。(如此简单理解即可)

Region:区域,根据特征提取出来的一些范围。

算子:直接理解成方法。

知道这些基础知识以后,我们在来理解什么是视觉识别。也别去看百度百科了,简单的理解就是,通过提取图像中的特征,选取我们需要的区域,从而达到一定的目的。

比如,有如下图
halcon视觉入门扫盲篇
需要识别每个方格中是否有芯片。这是一个需求。根据这个需求,我们来进行需求拆解:

1. 如何在这张图里面得到这些方格。

2. 如何在每个方格中判断芯片是否存在。

大体思路就是这样了,接下来对图像进行分析,得到具体解决问题的思路:

如何在这张图里面得到这些方格。

分析图像可以知道:

  1. 方格是白色的,亮度较高。但白色的内容不只有方格,所以在提取特征的时候,需要注意。

  2. 方格比较规整,都是方形,面积相似。

  3. 方格与方格相连,所在的区域在整个图像的中心位置。

以上就是分析图像得到的信息。这些信息就是方格的特征,我们通过特征进行筛选,从而得到所有的方格。

如何判断方格中是否存在芯片

此时我们的兴趣点就在每个方格中,所以分析每个方格,我们可以得出一下结论:

  1. 芯片面积大小都差不多。

  2. 因为光照不均匀,导致有些地方的芯片亮度较高,有些亮度比较低,这可能是我们识别芯片过程中的难点。

  3. 芯片都是矩形。

  4. 有些芯片跟白色方格线比较近,可能会给我们识别芯片带来干扰。

  5. 芯片颜色灰度跟方格中的背景色不一致。

  6. 如果方格中没有芯片,那么方格中没有上述特征。

以上是特征分析,和解决问题的思路,接下来是编程的套路。

视觉分析的编程套路一般如下几个步骤:

  1. 打开图片(OpenImage)
  2. 将图片分解成3通道图片,或是转成灰度图(GrayImage)。
  3. 二值化或动态二值化(Region)。
  4. 联通区域。
  5. 特征筛选。
  6. 如果区域有干扰,一般会进行一下操作:
    1. 腐蚀
    2. 膨胀
    3. 形状转换
    4. 以上步骤重复,或组合重复。
  7. 根据需要,还可以合并区域,并重复4-6,从而达到目的。
  8. 输出区域并标注。

实则还有其他的处理方式,比如我们需要的区域特征不明显,不需要的区域特征很明显,此时,我们可以获取不需要的区域,然后使用相减的方式得到需要的区域。(这个会在实际的使用中讲到)

接下来进行答疑

我在学习的过程中,产生了很多疑问,直到我反复编程理解后才明白为什么要这么做。在这里,我会先给出答案。

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:将目标区域转化为特定的形状,比如得到的区域是一个不规则的矩形,我们可以作外接矩形或是外接圆,让它更符合实际结果。

上一篇:android使用XmlPullParser来解析XML文件


下一篇:3种检测页面是否符合amp标准的方法