失败笔记本-HALCON篇-003
项目场景:
ok,学习来到了第三篇,这次依旧是跟着skcircle大哥学习。
这次是学习利用开运算进行目标检测:halcon例子:开运算进行目标检测
内容主要有两块:
- 小小练手,认识开运算算子,我们要将下图左侧那个尖尖提取出来
- 用开运算检测目标图案,要把下图中所有O元素提取出来,包括P中的O!哈?
1.内容一,提取尖尖
解决方案:
- 欧克,跟着大哥的思路走,首先我们打开图片,转换灰度,二值提取小流程走一套,现在这套流程我倍儿熟!
read_image (Image, '001.png')
rgb1_to_gray (Image, GrayImage)
threshold (GrayImage, Regions, 14, 45)
connection (Regions, ConnectedRegions)
这里有一个connection()算子要注意一下,主要作用是计算输入区域中的所有连通域,并将这些连通域分离成单个区域,意思就是可以把大region分开成独立可操作的小region。
然后就是检测粗暴的一步opening_circle(),直接圆形结构元素开运算:
opening_circle (ConnectedRegions, RegionOpening, 23.5)
效果如下:
看着非常好啊,直接把几个尖都取出来了,但是我们只要最左边那个。
- 先做差,把小尖尖提取出来,然后connection:
difference (Regions, RegionOpening, RegionDifference)
connection (RegionDifference, ConnectedRegions1)
select_obj (ConnectedRegions1, ObjectSelected, 21)
效果还可以啊,看一下:
都取出来了,这里大佬用了**select_obj()直接选择的所要的region啊,这里用select_shape ()**按照面积选一下也可以的。
- 最后再做差,就可以啦:
解决方案:
2.内容二,开运算目标检测
解决方案:
- 首先啊,把那个O元素取出来:
read_image (Image1, '002.png')
rgb1_to_gray (Image1, GrayImage1)
gen_rectangle1 (ROI_0, 266.403, 103.022, 314.086, 149.531)
reduce_domain (GrayImage1, ROI_0, ImageReduced)
threshold (ImageReduced, Regions2, 19, 42)
connection (Regions2, ConnectedRegions2)
skeleton (ConnectedRegions2, Skeleton)
注意:
reduce_domain算子的作用是将给定图像的定义域缩小到指定的区域。具体来说,它通过计算旧定义域与输入区域的交集来获取新的定义域,从而实现对图像进行裁剪或缩小处理。需要注意的是,reduce_domain算子并不改变图像的实际尺寸,即输出图像ImageReduced的尺寸大小与输入图像Image相同。
skeleton算子的作用是计算一个区域的骨架。骨架是指图像中所有细长连通区域的中心线,它能够表示图像中物体的主要结构信息。骨架的构造方式是将图像中的每个点看作是一个半径最大的圆的中心点,并且仍然完全包含在这个区域内。
- 然后直接一个opening():魔法!!!
threshold (GrayImage1, Regions1, 0, 245)
opening (Regions1, Skeleton, RegionOpening1)
看到没有,这就是魔法,所有的O全取出来了!
3.在窗口手绘region
dev_get_window (WindowHandle)
draw_region (Region, WindowHandle)
总结:
在003中,用到了以下算子:
opening()
opening_circle()
reduce_domain()
skeleton()
- 用开运算检测目标,对颜色不敏感,对形状大小及其敏感,又学到了魔法,nice!!!