近期测试一个电容测高的项目,对电容两端测高。
每次需要对电容两端测高,求得高度差,进行管控
遇到一下问题:
1、原图为32位的深度图,通过halcon打开,因为高度信息太小,图像一片黑
2、将深度图转为灰度图后,如何能自动识别电容,并在两端创建ROI区域
先解决第一个问题:
思路本质在于将深度图信息数据进行拉伸,然后将拉伸信息后的图像转为byte
第一种:基于线性变换将高度信息进行变换,高度信息低时拉高,过高时降低
然后将其格式转为byte,最后将对比度拉伸。
scale_image (Image, ImageScaled, 20, -100)
convert_image_type (ImageScaled, ImageConverted, 'byte')
scale_image_max (ImageConverted, ImageScaleMax)
第二种思路:将高度信息内(lowValue, highValue)拉伸成0-255,对应第一种思路第一个和第三个算子,然后将其转为byte。
scale_image_range (Image, ImageScaled, lowValue, highValue)
convert_image_type (ImageScaled, ImageConverted, 'byte')
上述两种效果实测,效果提升明显。
再解决第二个问题:
1)设置阈值分割出电容、驱动器和背景,再临近分割
threshold (ImageReduced, Region, lowThreshold, highThreshold)
connection (Region, ConnectedRegions)
2)电容和驱动器高度类似,转为灰度后,也相近,剔除干扰项
select_shape (ConnectedRegions, SelectedRegions, ['area','anisometry'], 'and', [MINArea,MINRab], [MAXArea,MAXRab])
基于区域面积和长短轴比值筛选,区域面积可过滤噪声,长短轴比值过滤电路板上的驱动器(电容为长方形,驱动器为正方形,长短轴比值不一样)
3)定位到电容区域两端并生成ROI
*输入区域、输出矩形区域宽高
*输出区域outputRegion1、outputRegion2
inputRegion:=ObjectSelected
width:=2
height:=2
*获得电容的中心点
area_center (inputRegion, Area, Row, Column)
*计算电容与水平方向的夹角
orientation_region (ObjectSelected, Phi)
*知道区域中心点和到中心点距离
*求出电容两端自动生成区域的中心点
tanx:=sin(Phi)/cos(Phi)
roiX1:=Row+(distance*tanx/sqrt(1+(tanx*tanx)))
roiX2:=Row-(distance*tanx/sqrt(1+(tanx*tanx)))
resXTuple[Index]:=roiX1
resXTuple[Index+1]:=roiX2
roiY1:=Column+(distance/sqrt(1+(tanx*tanx)))
roiY2:=Column-(distance/sqrt(1+(tanx*tanx)))
resYTuple[Index]:=roiY1
resYTuple[Index+1]:=roiY2
gen_rectangle2 (outputRegion1, roiX1, roiY1, rad(Phi), width, height)
gen_rectangle2 (outputRegion2, roiX2, roiY2, rad(Phi), width, height)
4)对两端区域进行测高,高度做差返回两端极差,对标极差,进行管控。