halcon中sort_region标定板之9点标定mark点各方向排序
目录
做的视觉处理项目多了也遇到了很多麻烦事,也少不了掉几根头发
有次项目处理的过程中对精度要求高,但是来料大,视野范围受限等问题
采用了单工位多相机进行视觉处理
这个过程就是让两个相机的图像坐标绑定到同一块标定板上
这个过程就用到了常用的九点标定法
但是由于机构问题的安装的相机方向有点差异,导致
标定板上面的坐标带有方向
想到2个解决方法:
①是旋转旋转图像,让他们方向一致即可—(推荐)
实现功能的halcon算子
rotate_image (, ImageRotate, 90, 'constant')
还可以是相机自带的采图镜像转换
②就是不旋转,标定的时候,获取的点重新排列----于是便有了下面的排列方式
*二值化处理--只获取标定板上面的Mark点
threshold (ImageReduced, Region, 0, 150)
*填充显示--黄色显示
dev_set_color ('yellow')
dev_set_draw ('fill')
*分割图像,将mark点整体分割
connection (Region, ConnectedRegions)
*去噪---面积筛选,只允许150-99999
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 150, 99999)
*获取面积及mark区域中心--刚好9个
area_center (SelectedRegions, Area, Row, Column)
*设置字体显示的颜色
dev_set_color ('black')
*序号显示--不排序显示
for Index := 1 to |Area| by 1
set_tposition (3600, Row[Index-1], Column[Index-1])
write_string (3600, Index)
endfor
set_display_font (3600, 16, 'mono', 'true', 'false')
disp_continue_message (3600, 'black', 'true')
*按F5继续
dev_close_window ()
dev_open_window (Row1, Column1, 512, 512, 'black', WindowHandle)
dev_display (Image1)
dev_set_color ('pink')
*排序之后在显示row先使用行值,column先使用列值排序--可以看到使用column排序的时候不稳定
sort_region (SelectedRegions, SortedRegions, 'first_point', 'true', 'column')
area_center (SortedRegions, Area1, Row3, Column3)
dev_set_color ('black')
for Index := 1 to |Area1| by 1
set_tposition (3600, Row3[Index-1], Column3[Index-1])
write_string (3600, Index)
endfor
*为了解决排序的问题我打算换一种先求一列的或者一行的,然后在排序
dev_close_window ()
dev_open_window (Row1, Column1, 512, 512, 'black', WindowHandle)
dev_display (Image1)
dev_set_color ('blue')
*这样子是以列排序,从左上角开始,那么可以从做小角开始吗?也可以
*左下角√,右下角√,右上角√
*行排序,左上角,右上角,左下角√,右下角也是可以的
*差不多就是这个道理--这样排序就相对稳定许多,用上两个for循环
sort_region (SelectedRegions, SortedRegions, 'first_point', 'false', 'row')
for Index1 := 1 to 3 by 1
dev_set_color ('red')
*选择第Index1列的第1个
select_obj (SortedRegions, ObjectSelected1, 1+ 3*(Index1-1))
*选择第Index1列的第2个
select_obj (SortedRegions, ObjectSelected2, 2+ 3*(Index1-1))
*选择第Index1列的第2个
select_obj (SortedRegions, ObjectSelected3, 3+ 3*(Index1-1))
*这样就筛选出第Index1列了,用上数组,循环3此就是区分开3列
*将每列的形成一个整体
union2 (ObjectSelected1, ObjectSelected2, RegionUnion)
union2 (RegionUnion, ObjectSelected3, RegionUnion1)
*将整体再次分割
connection (RegionUnion1, ConnectedRegions1)
*再次排序--用上row值排序
sort_region (ConnectedRegions1, SortedRegions1, 'first_point', 'true', 'column')
area_center (SortedRegions1, Area2, Row4, Column4)
*写序号
dev_set_color ('black')
for Index2 := 1 to 3 by 1
set_tposition (3600, Row4[(Index2-1)], Column4[(Index2-1)])
write_string (3600, Index2+(Index1-1)*3)
endfor
endfor
PS:关注收藏,不迷路,分享项目小难点。