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());
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!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