• halconsegment_contours_xld分割xld轮廓


    在HDevelop中

    dev_close_window ()
    read_image (Image, 'D:/bb/tu/7.jpg')
    rgb1_to_gray (Image, GrayImage)
    
    edges_sub_pix (GrayImage, Edges, 'canny', 1, 5, 10)
    segment_contours_xld (Edges, ContoursSplit, 'lines_circles', 5, 4, 2)
    *分割xld轮廓
    *参数1:需要进行分割的轮廓
    *参数2:分割后的轮廓tuple
    *参数3:分割轮廓的方式
    *       'lines'            将输入轮廓分割成线条
    *       'lines_circles'    将其分割成线条和圆弧
    *       'lines_ellipses'   将其分割成线条和椭圆弧
    *参数4:轮廓平滑的参数,可以抑制在折线逼近过程中过短的线段
    *       注意:不能等于0;最好大于等于3并且是奇数;建议值是5
    *参数5:第一次用Ramer算法(即用直线段递进逼近轮廓)时的MaxLineDist,在逼近完
    *       成之后,再用圆弧或椭圆弧对相邻分割线段进行拟合,如果拟合圆弧到轮廓的距
    *       离小于逼近线段到轮廓的距离,就用圆弧替代逼近线段,这个过程一致迭代直到
    *       所有的线段拟合完毕。
    *参数6:第二次逼近轮廓时的MaxLineDist
    *      只有当MaxLineDist2这种两步逼近算法效率较高,因为在第一次逼近过程中,递进
    *      逼近的直线段较少,因此较大直径的圆弧能够被高效的分割出来。在第二次逼近过程
    *      中,能够被小直径圆弧逼近的轮廓被找到,同时大直径圆弧的末端被重新定义
    
    count_obj (ContoursSplit, Number)
    *9
    
    gen_empty_obj (Lines)
    *实例化一个空对象
    gen_empty_obj(Circles)
    
    for I:=1 to Number by 1
        *遍历
        select_obj (ContoursSplit, ObjectSelected, I)
        get_contour_global_attrib_xld (ObjectSelected, 'cont_approx', Attrib)
        *返回XLD轮廓的全局属性名的值,全局属性是为每个轮廓定义的附加值
        *参数1:xld轮廓
        *参数2:全局属性名,包含如下:
        *       'regr_norm_row'
        *       'regr_norm_col'
        *       'regr_mean_dist'
        *       'regr_dev_dist'
        *       'cont_approx'
        *               可判断轮廓段的种类是直线、圆弧 还是 椭圆弧 具体如下:
        *               cont_approx = -1   对应XLD为直线,可以拟合为直线
        *               cont_approx = 0   对应XLD为圆,可以拟合为圆
        *               cont_approx = 1   对应XLD为椭圆,可以拟合为椭圆
        *       'bright_dark'
        *       'is_hole'
        *参数3:返回的属性值
        if(Attrib=-1)
            concat_obj (Lines, ObjectSelected, Lines)
            *两个区域组合成区域集
        else
            concat_obj (Circles, ObjectSelected, Circles)
        endif
        
    endfor
    
    get_image_size (GrayImage, Width, Height)
    dev_open_window(10,10,Width, Height,'black',WindowHandle)
    dev_display(Lines)
    
    dev_open_window(10,10,Width, Height,'black',WindowHandle1)
    dev_display(Circles)


    在QtCreator中

      HObject  ho_Image, ho_GrayImage, ho_Edges, ho_ContoursSplit;
      HObject  ho_Lines, ho_Circles, ho_ObjectSelected;
      HTuple  hv_Number, hv_I, hv_Attrib, hv_Width;
      HTuple  hv_Height, hv_WindowHandle, hv_WindowHandle1;
      ReadImage(&ho_Image, "D:/bb/tu/7.jpg");
      Rgb1ToGray(ho_Image, &ho_GrayImage);
    
      EdgesSubPix(ho_GrayImage, &ho_Edges, "canny", 1, 5, 10);
      SegmentContoursXld(ho_Edges, &ho_ContoursSplit, "lines_circles", 5, 4, 2);
      //分割xld轮廓
      //参数1:需要进行分割的轮廓
      //参数2:分割后的轮廓tuple
      //参数3:分割轮廓的方式
      //      'lines'            将输入轮廓分割成线条
      //      'lines_circles'    将其分割成线条和圆弧
      //      'lines_ellipses'   将其分割成线条和椭圆弧
      //参数4:轮廓平滑的参数,可以抑制在折线逼近过程中过短的线段
      //      注意:不能等于0;最好大于等于3并且是奇数;建议值是5
      //参数5:第一次用Ramer算法(即用直线段递进逼近轮廓)时的MaxLineDist,在逼近完
      //      成之后,再用圆弧或椭圆弧对相邻分割线段进行拟合,如果拟合圆弧到轮廓的距
      //      离小于逼近线段到轮廓的距离,就用圆弧替代逼近线段,这个过程一致迭代直到
      //      所有的线段拟合完毕。
      //参数6:第二次逼近轮廓时的MaxLineDist
      //     只有当MaxLineDist2这种两步逼近算法效率较高,因为在第一次逼近过程中,递进
      //     逼近的直线段较少,因此较大直径的圆弧能够被高效的分割出来。在第二次逼近过程
      //     中,能够被小直径圆弧逼近的轮廓被找到,同时大直径圆弧的末端被重新定义
    
      CountObj(ho_ContoursSplit, &hv_Number);
      //9
    
      GenEmptyObj(&ho_Lines);
      //实例化一个空对象
      GenEmptyObj(&ho_Circles);
    
      {
      HTuple end_val31 = hv_Number;
      HTuple step_val31 = 1;
      for (hv_I=1; hv_I.Continue(end_val31, step_val31); hv_I += step_val31)
      {
        //遍历
        SelectObj(ho_ContoursSplit, &ho_ObjectSelected, hv_I);
        GetContourGlobalAttribXld(ho_ObjectSelected, "cont_approx", &hv_Attrib);
        //返回XLD轮廓的全局属性名的值,全局属性是为每个轮廓定义的附加值
        //参数1:xld轮廓
        //参数2:全局属性名,包含如下:
        //      'regr_norm_row'
        //      'regr_norm_col'
        //      'regr_mean_dist'
        //      'regr_dev_dist'
        //      'cont_approx'
        //              可判断轮廓段的种类是直线、圆弧 还是 椭圆弧 具体如下:
        //              cont_approx = -1   对应XLD为直线,可以拟合为直线
        //              cont_approx = 0   对应XLD为圆,可以拟合为圆
        //              cont_approx = 1   对应XLD为椭圆,可以拟合为椭圆
        //      'bright_dark'
        //      'is_hole'
        //参数3:返回的属性值
        if (0 != (hv_Attrib==-1))
        {
          ConcatObj(ho_Lines, ho_ObjectSelected, &ho_Lines);
          //两个区域组合成区域集
        }
        else
        {
          ConcatObj(ho_Circles, ho_ObjectSelected, &ho_Circles);
        }
    
      }
      }
    
      GetImageSize(ho_GrayImage, &hv_Width, &hv_Height);
      SetWindowAttr("background_color","black");
      OpenWindow(10,10,hv_Width,hv_Height,0,"visible","",&hv_WindowHandle);
      HDevWindowStack::Push(hv_WindowHandle);
      if (HDevWindowStack::IsOpen())
        DispObj(ho_Lines, HDevWindowStack::GetActive());
    
      SetWindowAttr("background_color","black");
      OpenWindow(10,10,hv_Width,hv_Height,0,"visible","",&hv_WindowHandle1);
      HDevWindowStack::Push(hv_WindowHandle1);
      if (HDevWindowStack::IsOpen())
        DispObj(ho_Circles, HDevWindowStack::GetActive());

  • 相关阅读:
    PyPDF2 编码问题 PyPDF2.utils.PdfReadError Illegal character in Name Object
    使用PyPDF2结合pdfminer拆分PDF,并提取关键字重命名拆分出来的文件
    最全面的常用正则表达式大全
    idea setting
    java基础-静态,非静态(构造)代码块,类加载
    利用复制(分发订阅)延时计算业务数据
    sql server 数据库复制实现数据同步常见问题(不定期更新)
    api接口写好了?想过(Accept,Content-Type)?返回类型json|xml?
    install brew cask
    idea 找不到 没有 tomcat server
  • 原文地址:https://www.cnblogs.com/liming19680104/p/16007524.html
Copyright © 2020-2023  润新知