halcon视觉学习-基于halcon

halcon简介

halcon在工业视觉中属于很棒的。
学习halcon需要具备 软件、图像处理、光学 三个部分的知识。图像处理一般的套路就是 获取图像>分割区域>特征提取

halcon视觉学习-基于halcon_第1张图片
halcon界面

halcon文件所在位置:
Users / Shared / Library / Application Support / halcon 13 / example / hdevelop/
我们做项目的图片路径就在 example/images/ 里面

一、嵌入式工业读码器

包括DM码、QR码、vericode码


halcon视觉学习-基于halcon_第2张图片

二、 图像采集的原理,以及准确成像的专业方法

  • 1.2 相机的接口类型
    USB、IEEE1394、Gigabit Ethernet(千兆网)

  • 1.3 小试halcon
    首先,安装相机驱动(一些品牌halcon自带驱动),比如balser安装pylon驱动,打开halcon界面,选择助手,打开新的Image Acquisition,选择资源,自动检测接口,然后点击右边的按钮选择一个接口,选择后把选项 资源 切换到 连接,再点击连接框里面的一个连接,表示相机和软件建立连接,再点击 实时,相机实时采集数据了。

三、 Blob分析与形态学

Blob
区域是一种非常重要的概念。
区域是blobs这一数据类型在halcon中的一种贴切的表达形式。
采集图像-区域分割,最后通过特征(如圆度、面积、矩形度等)筛选,这一过程被称为Blob(binary large objects)分析。

形态学
形态学是对区域大小调整的一种非常重要的方法和概念。形态学包括「开运算、闭运算、腐蚀、膨胀」
形态学需要引入一个新的概念,即结构元素。

  • 开运算可以去除小区域以及原区域中突出的细节部分;
  • 闭运算可以填补相邻区域以及空洞;
  • 腐蚀,会有一个结构元素,即一个形状的像素组合,以这个结构元素的中心点像素来计算保留处,这个结构元素在目标元素中逐行移动,若目标元素中的形状和结构元素相同,这个目标元素中对应中心点像素保留。
  • 膨胀,与腐蚀相反,即参照一个结构元素,这个结构元素我们可以设定中心点,需要膨胀的位置,然后顺着图像一格一格走,只要有和中心点有交集,即可按结构元素膨胀。
    开运算就是先腐蚀再膨胀,闭运算就是先膨胀再腐蚀。参考
halcon视觉学习-基于halcon_第3张图片
腐蚀
halcon视觉学习-基于halcon_第4张图片
膨胀
  • 灰度直方图。在图像处理中使用非常频繁,比如分开绿豆和红豆,可以拍照后选择灰度,红色和绿色灰度不同,通过直方图选择灰度范围,即可选择出红豆或绿豆。

  • 特征直方图。比如圆度、面积、


实战案例-区分红豆和绿豆

  • 1.首先打开一张图片,点击确定,打开图片后,按住command不放,在图片界面会出现 当前的像素坐标和 灰度值


    halcon视觉学习-基于halcon_第5张图片
  • 2.获取图片后,按照套路开始图片分割,我们打开灰度直方图,直接点上方的按钮,选择合适的灰度范围。按照下图操作完后,点击单步跳过函数


整个程序的编写和思考如下:

* 1. 采集图像
read_image (HalconTest01, '/Users/jkx/Desktop/halcon_test01.png')
* 2. 分割图像
threshold (HalconTest01, Regions, 43, 247)  // regions区域,表示选中43-247中间的灰度
dev_set_draw('margin')   // 画出边缘
dev_display(HalconTest01)  // 显示halconTest01这个图片,主要是生成 HalconTest01 这个变量
dev_display(Regions)  // 显示 分割过的 Regions 图片,此时可以看到图片背景有杂质,下一步要去除杂质
* 3. 采用开运算,消除图像杂质,先构建结构元素,结构元素中心点坐标我们可以不用管
gen_circle(Circle, 200, 200, 20)  // 200,200 是结构元素的坐标,不管,后面是半径,根据你杂质的大小选择,否组杂质清不干净
opening (Regions, Circle, RegionOpening)  // 开运算,表示打开 Regions这个对象,依照结构元素Circle这个对象,且生成新的RegionOpening对象
dev_clear_window()
dev_display(HalconTest01)
dev_display(RegionOpening)

* 4. 分离区域,将一个区域分解成多个区域
connection(RegionOpening, ConnectedRegions)  //这次分离只分离开部分,后面优化可以删掉这条
gen_circle(Circle1, 200, 200, 21.5)    // 腐蚀,结构元素更大,确保连在一起的豆子被分割开,Circle1是对象
erosion1 (ConnectedRegions, Circle1, RegionErosion, 1)  // ConnectedRegions, Circle1, RegionErosion, 1 ,括号里是函数的参数,这些参数是对象,RegionErosion是新的对象,halcon的套路是函数参数里靠后的是新生成的对象,输入、结构元素、输出
connection (RegionErosion, ConnectedRegions1)   // 分离开这些豆子
* 5. 再次清屏,为了更好的展示效果
dev_display(HalconTest01)
dev_display(RegionErosion)
* 6. 数一数有多少个被腐蚀后的参数
count_obj(ConnectedRegions1, Number)
* 7. 膨胀,恢复原来的样子
dilation1 (ConnectedRegions1, Circle1, RegionDilation1, 1)
* 8. 再次清屏,显示效果,为了便于理解,程序才这么啰嗦,实际可简化
dev_clear_window ()
dev_display (HalconTest01)
dev_display (RegionDilation1)
* 9. 插入特征直方图,区分豌豆和绿豆
select_shape (RegionDilation1, SelectedRegions, 'circularity', 'and', 0.571, 0.743)
dev_set_line_width (2)
dev_display (HalconTest01)
dev_display (SelectedRegions)  // 和上面的不能倒顺序,倒顺序就只能显示Halcon01,不能显示 SelectedRegions

count_obj (SelectedRegions, Number1)  // 数一下豌豆的数量
set_tposition (200000, 24, 12)  // 设置显示文字的位置
write_string (200000, '豌豆的个数是:' + Number1)   // 显示的内容
* dev_clear_window ()
* dev_display (HalconTest01)

difference (RegionDilation1, SelectedRegions, RegionDifference)   // 差值运算,这里小错误,虽然差值了,很多元素看不见了,但是还存在,所以结果还是67,需要再次处理
select_shape (RegionDifference, SelectedRegions1, 'area', 'and', 855, 4895)

count_obj (SelectedRegions1, Number2)
set_tposition (200000, 24, 12)
new_line (200000)
write_string (200000, '绿豆的个数是:' + Number2)   // 显示绿豆数

颜色空间
主要分为以下几点:Halcon支持的颜色空间、通道与颜色空间的转化、通道与区域分割方法、案例讲解

一般来说,我们得到一幅图像可以拆分为RGB(红黄蓝三通道分量交织,按BGRB排序)随后我们可以由RGB得到HSV空间图像。
而且,通道图像和 颜色空间图像 都是 8bit 灰度图像。

  • 色调 H
    用角度来度量,取值为 0~360度,从红色开始逆时针计算,红色为0,绿色为120,蓝色为240,它们的补色黄色为60,青色180,品红300.

  • 饱和度 S
    饱和度表示颜色接近光谱的程度,一种颜色可以看出光谱色和白色混合的结果,其中光谱色越大,饱和度越高,颜色越艳丽,类似油画里的白矾,颜色加上白矾,它的保护度就降低了。

  • 明度 V
    明度表示颜色的 明亮程度,对于光源色,明度值取决于发光体的光亮度,对于物色体,此值和物体的折射比和反射比相关,一般取值从0%(黑)到100%(白)。

四、 几何定位+仿射变换+视觉测量

定位三方法:Blob定位、模板匹配、深度学习

仿射变换:就是一种特殊的几何变换,是一种投影,常见的有 旋转、平移、缩放 (就是矩阵间的运算)

Blob分析 模板匹配

五、MPL深度学习(多层神经网络)

比如对于不同的物品,A、B、C,我们可以通过纹理区分ABC,得出3个不同的值,再比如我们 通过周长区分ABC,又得出3个不同的值,那边把这些特征集合在一起构成特征向量, 不同物品的特征向量值不一样,可以划分出ABC,这个划分的过程就是靠分类器完成的,而训练的过程就是根据 特征向量的不同,把他们训练成某类物品并归类分类。
MPL:Multi-Layer Perceptron


halcon视觉总结

一般来说,对于2D项目,无外乎这样的套路:

    1. 图像采集
    1. 预处理,主要有两种方法,对比度去噪
对比度:
scale_image (灰度缩放算子,在灰度直方图里操作,线性拉伸灰度)
emphsize (增强算子)
grey_range_rect (增加灰度动态范围的算子)
equ_histo_image (直方图均匀化,让图片灰度分布更均匀)

去燥:
mean_image (均值滤波)、高斯滤波、中值滤波
    1. 图像分割
      二值化、形状选择、形态学
    1. 特征识别 和 求取计算
    1. 显示与通讯

halcon中涉及的图像处理十大理论知识

  1. 图像处理基础知识
  2. 图像的灰度变换
  3. 图像增强(预处理:增强对比度 和去噪(均值、中值、高斯滤波))
  4. 图像的几何变换(仿射变换、投影变换、极坐标变换等)
  5. 图像分割(边缘提取、Blob分析等)
  6. 图像的频域(缺陷划痕检测等)
  7. 图像的形态学(膨胀、腐蚀、开运算、闭运算等)
  8. 图像的复原(这点halcon涉及不多,主要是刑侦用)
  9. 运动图像(运动检测,差分、光流法)
  10. 图像配准(模板匹配等)


六、硬件知识

购买工业相机必须要知道的参数

  • 分辨率(Resolution):相机每次采集图像的像素点数。对于数字工业相机一般是直接与光电传感器的像元数对应的,对于模拟相机则是取决于视频制式,PAL制为768576,NTSC制为640480。
  • 像素深度(Pixel Depth):即每像素数据的位数,一般常用的是8Bit,对于数字工业相机一般还会有10Bit、12Bit等。
  • 最大帧率(Frame Rate)/行频(Line Rate):即相机采集传输图像的速率,对于面阵相机一般为每秒采集的帧数,对于线阵相机为每秒采集的行数。
  • 曝光方式(Exposure)和快门速度(Shutter):对于线阵相机都是逐行曝光的方式,可以选择固定行频和外触发同步的采集方式,曝光时间可以与行周期一致,也可以设定一个固定的时间;面阵工业相机有帧曝光、场曝光和滚动行曝光等几种常见方式。数字工业相机一般都提供外触发采图的功能,快门速度一般可到10微秒,高速工业相机还可以更快。
  • 像元尺寸(Pixel Size):像元大小和像元数共同决定了相机靶面的大小。目前数字工业相机像元尺寸一般为3-10μm,一般像元尺寸越小,制造难度越大,图像质量也越不容易提高。
  • 光谱响应特性(Spectral Range):指该像元传感器对不同光波的敏感特性,一般响应范围是350-1000nm,一些相机在靶面前加了一个滤镜,滤除红外光线,如果系统需要对红外感光时可去掉该滤镜。

打光和镜头
《工程光学》 打光、选型、镜头

你可能感兴趣的:(halcon视觉学习-基于halcon)