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());