halcon进化日记-0806halcon官方十大例程之识别圆

调查就像十月怀胎,解决问题就像一朝分娩,调查就是解决问题。——《毛选》

个人学习日记,如有错误欢迎批评,没错误的批评不接受。
00-问题
问题:那里去找代码?
实操:

  1. STEP1-主页面
  2. STEP2-快捷键CTRL+E
  3. 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循环,需要进行重复操作。主要是进行遍历所有分割的轮廓,检测并拟合圆
其他特殊结构无。

所以整体模块流程如下:

  1. 读取图像(初始化窗口)
  2. 预处理并提取边缘区域(分割包含边的区域)
  3. 检测子像素级边缘(在包含边缘的图像的子域中,提取子像素精确边缘)
  4. 分割线段和圆弧(for 456 将圆拟合到作为圆弧的线段)
  5. 拟合并显示检测到的圆
  6. 显示所有分割的轮廓
    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. 读取并显示图像
  2. 预处理图像以提取可能包含边缘的区域
  3. 使用子像素精度检测图像中的边缘
  4. 将边缘分割为线段和圆弧
  5. 对识别为圆弧的部分进行圆拟合
  6. 在原图上显示检测到的圆和所有分割的轮廓

参考文献:
[1] Halcon找圆系列(1)如何检测圆形
[2] https://blog.csdn.net/zyj8691/article/details/70420096
https://blog.csdn.net/zyj8691/article/details/70420096

posted @ 2025-08-06 23:23  黛色星霜  阅读(77)  评论(0)    收藏  举报