图像处理 Halcon 应用Blob分析识别水表指针
处理方法:Blob分析(解决函数orientation_region 方向不确定性)
将图像转化为三通道图像,选取图像的Saturation(颜色强度对比明显),进行灰度处理,
去掉其中的噪点,选择主要特征,应用connection分成不同的连通域(关键)
求中心求角度,显示指针与水平方向的角度
dev_update_window ('off')
dev_close_window ()
dev_open_window (0, 0, 800, 600, 'black', WH)
read_image (Image, 'watermeter2.jpg')
decompose3 (Image, Image1, Image2, Image3)
*分成三通道图像
trans_from_rgb (Image1, Image2, Image3, ImageResult1, ImageResult2, ImageResult3, 'hsv')
*转化为hsv
threshold (ImageResult2, Regions1, 150, 255)
*对显著图像进行灰度处理
erosion_circle (Regions1, RegionErosion1, 2)
*去噪点
connection (RegionErosion1, ConnectedRegions)
*分割
select_shape (ConnectedRegions, SelectedRegions, ['area','row'], 'and', [0,297.22], [4120.37,415.74])
*选取特征
shape_trans (SelectedRegions, RegionTrans, 'convex')
*平滑连通域
sort_region ( RegionTrans, SortedRegions, 'first_point', 'true', 'column')
*排列各个连通域
count_obj (SortedRegions, Number1)
*计数
dev_display (Image)
for i := 1 to Number1 by 1
select_obj (SortedRegions, ObjectSelected, i)
area_center ( ObjectSelected, Area, Row, Column)
*计算区域面积中心坐标
orientation_region (ObjectSelected, Phi)
*区域的方向
shape_trans (ObjectSelected, RegionTrans1, 'outer_circle')
area_center (RegionTrans1, Area1, Row1, Column1)
if (Row1>Row)
Phi:=-abs(Phi)
elseif(Row1<Row)
Phi:=abs(Phi)
endif
*orientation_region产生的角度,有正负两个方向,不能确定哪个方向,用if语句对正负做个判断
dev_set_color ('green')
set_display_font (WH, 15, 'mono', 'true', 'false')
set_tposition (WH, Row, Column)
write_string (WH,deg(Phi) )
*与X轴正向的夹角,指针在上为正,指针在下为负
endfor
count_obj (ObjectSelected, Number)
dev_update_window ('on')
在实际运行过程中,orientation_region算子产生的区域方向存在不确定性,如下图中(1)所示 ,可能产生方向1,也有可能方向2.
因此需要结合区域特征作一次方向判定,如下图中(2),区域特征的中心为(2)中的3,对区域最大外接圆产生圆心4,最终通过3与4 的关系来判断区域特征最终的方向。
最终运行结果:
与X轴正向的夹角,指针在上为正,指针在下为负