list_files ('F:/CYG/VirtualProject/C#example/From_check_holes_01/OK', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
for Index := 0 to |ImageFiles| - 1 by 1
read_image (Image, ImageFiles[Index])
dev_close_window()
get_image_size(Image, W, H)
dev_open_window (0, 0, W/5, H/5, 'black', WH)
dev_set_draw('fill')
dev_set_colored(12)
dev_display(Image)
*区域生长,掩膜高宽、灰度差、单区最小面积
regiongrowing(Image,Regions,1,1,3,1000000)
*闭运算,消孔
closing_circle(Regions,Regions_closing,40)
*找到目标矩形
select_shape(Regions_closing, SelectedRegions, ['rectangularity','area','column'],'and',[0.4,1000000,800],[0.8,5000000,2400])
*生成最小任意矩形
smallest_rectangle2(SelectedRegions, Row, Column, Phi, Length1, Length2)
gen_rectangle2(Rectangle, Row, Column, Phi, Length1, Length2)
dev_display(Rectangle)
*定义仿射变换矩阵
hom_mat2d_identity(HomMat2DIdentity)
hom_mat2d_rotate(HomMat2DIdentity, -Phi, Column, Row, HomMat2DRotate)
hom_mat2d_scale(HomMat2DRotate, 1, 1, Column, Row, HomMat2DScale)
affine_trans_image(Image, ImageAffineTrans, HomMat2DScale, 'constant', 'false')
affine_trans_region(Rectangle, RegionAffineTrans, HomMat2DScale, 'nearest_neighbor')
*获得矩阵角点
region_features(RegionAffineTrans, 'row1',row1)
region_features(RegionAffineTrans, 'column1',column1)
region_features(RegionAffineTrans, 'row2',row2)
region_features(RegionAffineTrans, 'column2',colume2)
*裁剪图像
crop_rectangle1(ImageAffineTrans, ImagePart, row1, column1, row2, colume2)
*显示裁剪后图像
dev_close_window()
get_image_size(ImagePart, Width, Height)
dev_open_window (0, 0, Width/3, Height/4, 'black', WindowHandle)
dev_set_colored(12)
dev_display(ImagePart)
* canny算子 XLD提取
edges_sub_pix(ImagePart, Edges, 'canny', 1, 10, 40)
* 找黑圈轮廓
select_shape_xld(Edges, SelectedXLD, ['circularity','area'],'and', [0.8,5000], [1.0,99999])
* 根据轮廓对象找圆的参数
fit_circle_contour_xld(SelectedXLD, 'algebraic', -1, 0, 0, 3, 2, Row1, Column1, Radius, StartPhi, EndPhi, PointOrder)
*旧算法(已有新方法提高识别率)
tuple_length(Row1,Length)
if(Length>4)
difference_value := Row1+Column1*2
for Index1 := Length-1 to 0 by -1
for Index2 := Index1-1 to 0 by -1
if(difference_value[Index2]-100<difference_value[Index1] and difference_value[Index1]<difference_value[Index2]+100)
tuple_remove(Row1, Index1, Row1)
tuple_remove(Column1, Index1, Column1)
tuple_remove(Radius, Index1, Radius)
tuple_remove(StartPhi, Index1, StartPhi)
tuple_remove(EndPhi, Index1, EndPhi)
tuple_remove(PointOrder, Index1, PointOrder)
break
endif
endfor
if(Length==4)
break
endif
endfor
endif
* dev_clear_window()
* dev_display(ImagePart)
dev_set_color ('green')
dev_set_draw ('margin')
gen_cross_contour_xld(Cross, Row1, Column1, 6, StartPhi)
*创建测量模型
PointOrder:=[gen_tuple_const(2,23),gen_tuple_const(2,23)]
create_metrology_model (MetrologyHandle)
*设置图像大小
set_metrology_model_image_size(MetrologyHandle, Width, Height)
*创建边缘测量ROI
add_metrology_object_circle_measure(MetrologyHandle, Row1, Column1, PointOrder, 20, 5, 1, 30, [], [], MetrologyCircleIndices)
*修改参数
*每个对象一个圆
set_metrology_object_param(MetrologyHandle, MetrologyCircleIndices, 'num_instances', 1)
*返回一致的圆,只有[亮->暗]或者[暗->亮]
set_metrology_object_param(MetrologyHandle, MetrologyCircleIndices, 'measure_transition', 'uniform')
*设置最低分数使结果更可靠
set_metrology_object_param(MetrologyHandle, MetrologyCircleIndices, 'min_score',.15)
*图像应用测量
apply_metrology_model(ImagePart, MetrologyHandle)
*获取结果
get_metrology_object_result(MetrologyHandle, MetrologyCircleIndices, 'all', 'result_type', 'all_param', Parameter)
get_metrology_object_result_contour(Contour, MetrologyHandle, 'all', 'all', 1.5)
get_metrology_object_measures(Contours, MetrologyHandle, 'all', 'all', Row2, Column2)
gen_cross_contour_xld(Cross1, Row2, Column2, 6, Phi)
for Index1 := 0 to 3 by 1
* 打印圆心、半径、圆心距数据
distance_pp(Parameter[Index1*3], Parameter[Index1*3+1], Parameter[0], Parameter[1], Distance1)
distance_pp(Parameter[Index1*3], Parameter[Index1*3+1], Parameter[3], Parameter[4], Distance2)
distance_pp(Parameter[Index1*3], Parameter[Index1*3+1], Parameter[6], Parameter[7], Distance3)
distance_pp(Parameter[Index1*3], Parameter[Index1*3+1], Parameter[9], Parameter[10], Distance4)
message:='圆心:['+ Parameter[Index1*3] + ' , ' + Parameter[Index1*3+1] + ']'
message[1]:='半径:'+Parameter[Index1*3+2]
message[2]:='圆心距:' + Distance1 + ' , ' + Distance2 + ' , ' + Distance3 + ' , ' + Distance4
disp_message(WindowHandle,message,'window',Parameter[Index1*3]/4,Parameter[Index1*3+1]/4,'blue','true')
endfor
*销毁测量对象
clear_metrology_model(MetrologyHandle)
endfor
原图:
识别结果