halcon-segment_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());
复制代码

 

 

 

 

 

posted @   天子骄龙  阅读(3141)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
历史上的今天:
2020-03-15 python-qrcode模块生成二维码
2019-03-15 python随机数random模块
2019-03-15 随机数random
2019-03-15 时间戳time
点击右上角即可分享
微信分享提示

目录导航