halcon视觉入门钢珠识别

经过入门篇,我们有了基础的视觉识别知识。现在加以应用。

有如下图片:

我们需要识别图片中比较明亮的中间区域,有黑色的钢珠,我们需要知道他的位置和面积。

  1. 分析如何识别

  2. 编写代码实现识别

实现代码如下:

* Image Acquisition 01: Code generated by Image Acquisition 01
read_image (Image, 'D:/temp/cir.png')
dev_close_window ()
get_image_size (Image, Width, Height)
dev_open_window_fit_size (0, 0, Width, Width, -1, -1, WindowHandle)
*二值化
binary_threshold (Image, Region, 'max_separability', 'dark', UsedThreshold)
*反向裁剪
complement (Region, RegionComplement)
*截断选区
connection (RegionComplement, ConnectedRegions)
*过滤底部干涉
select_shape (ConnectedRegions, SelectedRegions1, 'rectangularity', 'and', 0, 0.9)
*合并选区
union1 (SelectedRegions1, RegionUnion)
*转换为规则的形状(外接圆)
shape_trans (RegionUnion, RegionTrans, 'outer_circle')
*裁剪出感兴趣区域
reduce_domain (Image, RegionTrans, ImageReduced)
*对裁剪出来的区域二值化
binary_threshold (ImageReduced, Region1, 'max_separability', 'dark', UsedThreshold1)
*开操作
opening_circle (Region1, RegionOpening1, 50)
*开操作
opening_circle (Region1, RegionOpening2, 80)
*对比不同
difference (RegionOpening1, RegionOpening2, RegionDifference)
*分割区域
connection (RegionDifference, ConnectedRegions1) shape_trans (ConnectedRegions1, RegionTrans1, 'outer_circle')
*重新排序
sort_region (RegionTrans1, SortedRegions, 'first_point', 'true', 'row')
*计算除面积和圆心
area_center (SortedRegions, Area, Row, Column)
dev_set_draw ('margin')
dev_set_color ('green')
dev_display (Image)
dev_display (SortedRegions)
for Index := 0 to |Area| -1 by 1
dev_set_draw ('margin')
dev_set_color ('red')
dev_set_line_width (5)
set_tposition (WindowHandle, Row[Index], Column[Index])
write_string (WindowHandle, 'Area:' + Area[Index] +',origin:'+Row[Index] + ',' + Column[Index])
endfor
count_obj (SortedRegions,Number)
set_tposition (WindowHandle, 10,10)
write_string (WindowHandle, 'Total Number:' +Number)

以下是分析

分析

我们需要识别的内容在如图标注的内容上:

首先,按照上次讲的内容:

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

算子使用规则

我们通过三个例子来理解它:

Image 是输出参数,也就是我们的结果

'D:/temp/cir.png' 字符串常量 是出入参数,在Halcon中叫 控制参数

read_image (Image, 'D:/temp/cir.png')

Image是输入参数

Region 是输出参数

'max_separability' 是控制参数

'dark' 是控制参数

UsedThreshold 输出控制参数

binary_threshold (Image, Region, 'max_separability', 'dark', UsedThreshold)

Image是输入参数

Regions是输出参数

0 是输入控制

71 是输入控制

threshold (Image, Regions, 0, 71)

以下是实现思路跟结果讲解

* 读取图片
read_image (Image, 'D:/temp/cir.png')

得到结果

在进行动态二值化,或手动二值化也可以。

*动态二值化
binary_threshold (Image, Region, 'max_separability', 'dark', UsedThreshold) * 手动二值化
threshold (Image, Regions, 0, 71)

得到结果

*反向裁剪
complement (Region, RegionComplement)

得到结果

*联通区域
connection (RegionComplement, ConnectedRegions)

该步骤讲以上区域分割成一个一个零散区域。

*过滤底部干涉
select_shape (ConnectedRegions, SelectedRegions1, 'rectangularity', 'and', 0, 0.9)

我们可以在上一步的结果中看到,下面有一条线,这条线在外形上跟矩形很类似,我们通过矩形选取去过滤掉它。

得到结果

*合并选区
union1 (SelectedRegions1, RegionUnion)

合并区域跟联通区域是一个相反的操作,合并区域的目的是将零散区域合并成一个整体,这样,我们就可以给它做外接圆,旋转整个需要识别的区域。

*转换为规则的形状(外接圆)
shape_trans (RegionUnion, RegionTrans, 'outer_circle')

得到结果

*裁剪出感兴趣区域
reduce_domain (Image, RegionTrans, ImageReduced)

以上的所有步骤,都是为了得到感兴趣区域。

为什么要得到感兴趣区域呢,因为我们需要识别的内容,就在这个区域内,其他外部区域都是干扰,我们不需要关心。所以,在得到外接圆之后,我们用这个外接圆对原图进行裁剪,就得到了我们感兴趣的区域,到了现在,我们才真正准备开始对钢珠进行识别。

按照套路,我们要进行二值化,所以下面的代码就是动态二值化。当然也可以通过特征进行手动二值化。

*对裁剪出来的区域二值化
binary_threshold (ImageReduced, Region1, 'max_separability', 'dark', UsedThreshold1)

得到结果

接下来进行 腐蚀和膨胀 -----> 开操作(腐蚀和膨胀等同开操作):

Region1 输入区域

RegionOpening1 输出区域

50 开操作控制参数,这个参数是需要尝试得到的,由小到大,最终符合要求。

*开操作
opening_circle (Region1, RegionOpening1, 50)

得到结果

然后再次进行开操作,得到一个没有选取的结果。然后对比两个结果,取差值。

解释:假设第一次开操作得到了6个球,第二次一个都没有,那么两个取差值,就一定有6个球。

*开操作
opening_circle (Region1, RegionOpening2, 80) *对比不同,两次开操作,的结果进行对比。得到不同区域。
difference (RegionOpening1, RegionOpening2, RegionDifference)

实则这里不进行对比也是可以的。

得到结果

接下来分割区域,做形状转换。就是我们要的结果了。因为,我们上述操作,操作的是一个整体,但我们需要将这些结果进行分割,所以需要进行联通区域,得到区域后,因为区域形状不规则,所以我们需要将形状转化为规则的圆。所以需要进行性转转换。

*分割区域
connection (RegionDifference, ConnectedRegions1)
*对分割的区域,做最小外接圆。
shape_trans (ConnectedRegions1, RegionTrans1, 'outer_circle')

以上就是我们需要的结果了

得到结果

接下来就是排序,并计算圆心,画出坐标和面积了,代码比较简单就不截图了,直接给结果:

*重新排序
sort_region (RegionTrans1, SortedRegions, 'first_point', 'true', 'row')
*计算面积和圆心
area_center (SortedRegions, Area, Row, Column)
dev_set_draw ('margin')
dev_set_color ('green')
dev_display (Image)
dev_display (SortedRegions)
for Index := 0 to |Area| -1 by 1
dev_set_draw ('margin')
dev_set_color ('red')
dev_set_line_width (5)
set_tposition (WindowHandle, Row[Index], Column[Index])
write_string (WindowHandle, 'Area:' + Area[Index] +',origin:'+Row[Index] + ',' + Column[Index])
endfor
count_obj (SortedRegions,Number)
set_tposition (WindowHandle, 10,10)
write_string (WindowHandle, 'Total Number:' +Number)

得到结果

总结

初学者怎么知道这些算子有什么作用呢,这些参数该如何使用呢,需要使用哪些特征呢?

在开发环境中 HDevelop中 按F1 可以看到帮助,多使用帮助,也可以在网上看视频,多看自带的例子。动手写,才能有进步。

选中算子按F1可以看到帮助

在HDevelop中按 Ctrl + E 可以打开示例程序

halcon视觉入门钢珠识别的更多相关文章

  1. Halcon视觉入门芯片识别

    Halcon视觉入门芯片识别 需求 有如下图的一个摆盘,摆盘的方格中摆放芯片,一个格子中只放一个,我们需要知道每个方格中是否有芯片去指导我们将芯片放到空的方格中. 分析 通过图片分析得出 我们感兴趣的 ...

  2. halcon视觉入门扫盲篇

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

  3. 使用Python+OpenCV进行图像处理(二)| 视觉入门

    [前言]图像预处理对于整个图像处理任务来讲特别重要.如果我们没有进行恰当的预处理,无论我们有多么好的数据也很难得到理想的结果. 本篇是视觉入门系列教程的第二篇.整个视觉入门系列内容如下: 理解颜色模型 ...

  4. 没事别想不开做Halcon视觉工程师 halcon机器视觉如何学习?

    今天我们来听听看来自一个机器视觉工程师的唠叨和吐槽,在这之后,你还想学人工智能,还想学机器视觉?恭喜你,你对人工智能机器视觉是真爱了! 既然自己选择了这条路,那么无论前进路上有多坎坷,跪着也要走完. ...

  5. HALCON之喷码OCR识别案例

    一个喷码识别的案例 1 read_image (Image, 'D:/用户目录/Desktop/2.png') 2 3 rgb1_to_gray(Image, Image) 4 5 get_image ...

  6. HALCON视觉算子相关函数中文说明System(2)

    16.6  Parameters get_system_ 功能:根据HALCON系统参数获取关于当前的信息. set_system 功能:HALCON系统参数的设置. 16.7  Serial cle ...

  7. 3 TensorFlow入门之识别手写数字

    ------------------------------------ 写在开头:此文参照莫烦python教程(墙裂推荐!!!) ---------------------------------- ...

  8. Tesseract-ocr视觉学习-验证码识别及python import pytesseract使用

    Tesseract-OCR的简单使用与训练 最近看到某个网站提交数据要提交验证码,用tesseract自带的识别, 识别出来是什么鬼,0-9识别成了什么玩意! so决定自己训练下tesseract.. ...

  9. appium入门元素识别参考

    https://www.cnblogs.com/miniren/p/7365885.html#top

随机推荐

  1. 洛谷——P1980 [NOIP2013 普及组] 计数问题

    题目描述 试计算在区间 11 到 nn的所有整数中,数字x(0 ≤ x ≤ 9)x(0≤x≤9)共出现了多少次?例如,在 11到1111中,即在 1,2,3,4,5,6,7,8,9,10,111,2, ...

  2. [学习笔记] Oracle基础增删改查用法

    查询 select *|列名|表达式 from 表名 where 条件 order by 列名 select t.* from STUDENT.STUINFO t where t.stuname = ...

  3. [ vue ] xxxProject项目杂记

    2020.4.9 加入eCharts 2020.4.8 完成article的显示,其间碰到全局路由守卫写的有错误,导致跳转报错.已修复. 加入keep-alive功能,缓存视图数据 疑问:如果在全局组 ...

  4. Linux上天之路(十八)之自动化部署

    pexpect Pexpect 是 Don Libes 的 Expect 语言的一个 Python 实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的 Pyth ...

  5. C++高并发场景下读多写少的解决方案

    C++高并发场景下读多写少的解决方案 概述 一谈到高并发的解决方案,往往能想到模块水平拆分.数据库读写分离.分库分表,加缓存.加mq等,这些都是从系统架构上解决.单模块作为系统的组成单元,其性能好坏也 ...

  6. Elasticsearch安装与配置

    一.下载(华为云) https://mirrors.huaweicloud.com/elasticsearch/https://mirrors.huaweicloud.com/kibana/7.6.2 ...

  7. Spring Security OAuth2 完全解析 (流程/原理/实战定制) —— Client / ResourceServer 篇

    一.前言 本文假设读者对 Spring Security 本身原理有一定程度的了解,假设对 OAuth2 规范流程.Jwt 有基础了解,以此来对 SpringSecurity 整合 OAuth2 有个 ...

  8. 【爬虫】从零开始使用 Scrapy

    一. 概述 最近有一个爬虫相关的需求,需要使用 scrapy 框架来爬取数据,所以学习了一下这个非常强大的爬虫框架,这里将自己的学习过程记录下来,希望对有同样需求的小伙伴提供一些帮助. 本文主要从下面 ...

  9. 面试官问,Redis 是单线程还是多线程?我懵了

    我们平时看到介绍 Redis 的文章,都会说 Redis 是单线程的.但是我们学习的时候,比如 Redis 的 bgsave 命令,它的作用是在后台异步保存当前数据库的数据到磁盘,那既然是异步了,肯定 ...

  10. Golang单元测试框架整理

    目录 一.单元测试是什么 二.单元测试的意义 三.Golang单元测试框架 3.1 Golang内置testing包 3.1.1 简单的测试 3.1.2 Benchmark 基准测试 3.1.3 运行 ...