halcon进化日记-0806halcon官方十大例程之识别圆
调查就像十月怀胎,解决问题就像一朝分娩,调查就是解决问题。——《毛选》
个人学习日记,如有错误欢迎批评,没错误的批评不接受。
00-问题
问题:那里去找代码?
实操:
- STEP1-主页面
- STEP2-快捷键CTRL+E
- STEP3-搜索框里面circles
得到:circles.hdev
同理可得:
[1]measure_circles.hdev,circles.hdev,union_cocircular_contours_xld.hdev,ball.hdev
01-代码拆解
1.1-看现象
F5按下后,可以看到圆的边缘,和直线的边缘。但是并非圆的所有部分都显示出来。
F2重头复位
关键部分打断点
F5再看一遍
所以该代码的功能就是:原图像上叠加显示了检测到的圆(白色)和分割的轮廓(彩色)
代码功能:图像中的边缘被分割成直线和圆。对于作为圆的一部分的边,估计圆参数并显示生成的圆。
1.2-看结构(模块)
主要:有一个for循环,需要进行重复操作。主要是进行遍历所有分割的轮廓,检测并拟合圆
其他特殊结构无。
所以整体模块流程如下:
- 读取图像(初始化窗口)
- 预处理并提取边缘区域(分割包含边的区域)
- 检测子像素级边缘(在包含边缘的图像的子域中,提取子像素精确边缘)
- 分割线段和圆弧(for 456 将圆拟合到作为圆弧的线段)
- 拟合并显示检测到的圆
- 显示所有分割的轮廓
1.3-看内容
1.初始化前3行代码没啥说的写法没用自适应换了一种写法。
2.图像预处理和边缘区域分割5行代码
a. 使用快速阈值方法提取灰度值在0-120之间的区域,0是靠近黑的
b. 获取区域的内部边界
c. 相对裁剪区域边界,各边保留5个像素
d. 使用半径为2.5的圆形结构元素对区域进行膨胀,膨胀操作
e. 将原始图像限制在膨胀后的区域,得到只包含边缘区域的图像
3.边缘提取和轮廓分割
a. 在子像素精度下提取边缘,使用Canny算法,参数2,20,60分别是sigma、低阈值和高阈值,其中数值为什么选取这个,这是其中的经验学习部分
b. 将边缘分割为线段和圆弧,参数控制分割的灵敏度等
c. 计算分割后的轮廓对象数量
d. 显示原始图像并设置显示参数
4.遍历所有分割的轮廓,检测并拟合圆
循环遍历所有轮廓对象,for循环的循环变量看出来的。
选择第1个轮廓对象
获取轮廓的全局属性'cont_approx'
另外加一个判断语句
如果属性值大于0,表示可能是圆弧或圆
拟合圆弧/圆,得到圆心
根据拟合参数生成完整的圆轮廓
显示拟合的圆
5.设置显示参数并显示所有分割的轮廓
02-总结
此代码实现了以下功能:
- 读取并显示图像
- 预处理图像以提取可能包含边缘的区域
- 使用子像素精度检测图像中的边缘
- 将边缘分割为线段和圆弧
- 对识别为圆弧的部分进行圆拟合
- 在原图上显示检测到的圆和所有分割的轮廓
参考文献:
[1] Halcon找圆系列(1)如何检测圆形
[2] https://blog.csdn.net/zyj8691/article/details/70420096
https://blog.csdn.net/zyj8691/article/details/70420096
本文来自博客园,作者:黛色星霜,转载请注明原文链接:https://www.cnblogs.com/ijiangnan/articles/19026061

浙公网安备 33010602011771号