halcon(特征提取-孔识别)

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

原图:
在这里插入图片描述

识别结果
在这里插入图片描述

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值