#摄像头内外环直径测量
dev_update_off ()
dev_get_window (WindowHandle)
read_image (inImage, 'C:/Users/njtl003/Desktop/111.bmp')
get_image_size (inImage, Width, Height)
rgb1_to_gray (inImage, GrayImage)
*筛选出黑色区域
fast_threshold (GrayImage, Region, 0, 100, 1)
closing_circle (Region, RegionClosing, 5.5)
connection (RegionClosing, ConnectedRegions)
fill_up (ConnectedRegions, RegionFillUp)
*选取面积较大的外环
select_shape_std (RegionFillUp, SelectedRegions, 'max_area', 70)
boundary (SelectedRegions, RegionBorder, 'inner')
gen_contour_region_xld (RegionBorder, Contours, 'border')
fit_circle_contour_xld (Contours, 'algebraic', -1, 0, 0, 3, 2, Row, Column, Radius, StartPhi, EndPhi, PointOrder)
*显示外环中心点
dev_set_colored (3)
dev_set_color ('red')
gen_cross_contour_xld (CrossOuter, Row, Column, 20, 0)
*选取内环
reduce_domain (GrayImage, SelectedRegions, ImageReduced)
threshold (ImageReduced, Region1, 180, 255)
opening_circle (Region1, RegionOpening, 7.5)
connection (RegionOpening, ConnectedRegions1)
select_shape (ConnectedRegions1, SelectedRegions1, 'circularity', 'and', 0.6, 1)
boundary (SelectedRegions1, RegionBorder1, 'inner')
gen_contour_region_xld (RegionBorder1, Contours1, 'border')
fit_circle_contour_xld (Contours1, 'algebraic', -1, 0, 0, 3, 2, Row1, Column1, Radius1, StartPhi1, EndPhi1, PointOrder1)
*显示内环中心点
dev_set_color ('green')
gen_cross_contour_xld (CrossInner, Row1, Column1, 20, 0)
*先判断内环和外环的中心是否在同一坐标点,创建仿射变换矩阵进行平移操作
if(Row!=Row1 and Column!=Column1)
hom_mat2d_identity (HomMat2DIdentity)
vector_angle_to_rigid (Row, Column, 0, Row1, Column1, 0, HomMat2D)
affine_trans_contour_xld (Contours, ContoursAffineTrans, HomMat2D)
area_center_xld (ContoursAffineTrans, Area, Row2, Column2, PointOrder2)
gen_cross_contour_xld (Cross, Row2, Column2, 20, 45)
endif
MeasureCPRow:=Row1
MeasureCPCol:=Column1
*以内环的中心点为测量中心分别计算中心点到内环的距离和到仿射后的外环的距离
distance_pc (Contours1, MeasureCPRow, MeasureCPCol, DistanceMin, DistanceMax)
distance_pc (ContoursAffineTrans, MeasureCPRow, MeasureCPCol, DistanceMin1, DistanceMax1)
DistanceOuter2InnerMean:=(DistanceMin1+DistanceMax1)/2-(DistanceMin+DistanceMax)/2
*显示测量箭头
gen_region_line (RegionLines, MeasureCPRow, MeasureCPCol, MeasureCPRow, MeasureCPCol+Width/2)
intersection_line_contour_xld (Contours1, MeasureCPRow, MeasureCPCol, MeasureCPRow, MeasureCPCol+Width/2, CrossInnerRow, CrossInnerCol, IsOverlapping)
intersection_line_contour_xld (Contours, MeasureCPRow, MeasureCPCol, MeasureCPRow, MeasureCPCol+Width/2, CrossOuterRow, CrossOuterCol, IsOverlapping)
gen_arrow_contour_xld (Arrow, CrossInnerRow, CrossInnerCol, CrossOuterRow, CrossOuterCol, 5, 20)
dev_display (inImage)
dev_display (Arrow)
Text:='内环到外环的平均距离为:'
dev_disp_text (Text+DistanceOuter2InnerMean, 'window', 257, 186, 'black', [], [])
##原图
##结果图