![](https://img2022.cnblogs.com/blog/1502586/202201/1502586-20220120221800438-786509633.png)
![](https://img2022.cnblogs.com/blog/1502586/202203/1502586-20220319091436960-1287173067.jpg)
在HDevelop中
dev_close_window ()
read_image (Image, 'D:/bb/tu/8.jpg')
rgb1_to_gray (Image, GrayImage)
edges_sub_pix (GrayImage, Edges, 'canny', 1, 5, 10)
*亚像素边缘
select_shape_xld (Edges, SelectedXLD, 'contlength', 'and', 367, 369)
segment_contours_xld (SelectedXLD, ContoursSplit, 'lines_ellipses', 5, 4, 2)
select_shape_xld (ContoursSplit, SelectedXLD1, 'contlength', 'and', 72, 77)
fit_ellipse_contour_xld (SelectedXLD1, 'fitzgibbon', -1, 0, 0, 200, 3, 2, Row, Column, Phi, Radius1, Radius2, StartPhi, EndPhi, PointOrder)
*对XLD轮廓做近似椭圆计算--拟合椭圆--获得椭圆数据
*参数1:输入xld轮廓
*参数2:椭圆拟合算法
* 'fhuber', 'fitzgibbon', 'focpoints', 'fphuber', 'fptukey', 'ftukey', 'geohuber', 'geometric', 'geotukey', 'voss'
*参数4:轮廓端点之间的最大距离被视为“闭合”
*参数9:Row椭圆中心的行坐标
*参数10:Column椭圆中心的列坐标
*参数11:Phi主轴方向
*参数12:Radius1大半轴的长度
*参数13:Radius2较小半轴的长度
*参数14:StartPhi起点的角度
*参数15:EndPhi终点的角度
*参数16:PointOrder沿边界的点顺序( 'negative'负序, 'positive'正序)
*注意:拟合时参数1只能包含一条xld
gen_ellipse_contour_xld (ContEllipse, Row, Column, Phi, Radius1, Radius2, StartPhi, EndPhi, 'positive', 1.5)
*创建椭圆弧的XLD轮廓
*参数1:生成的轮廓
*参数2:Row椭圆中心的行坐标
*参数3:Column椭圆中心的列坐标
*参数4:Phi主轴方向
*参数5:Radius1大半轴的长度
*参数6:Radius2较小半轴的长度
*参数7:StartPhi起点的角度
*参数8:EndPhi终点的角度
*参数9:PointOrder沿边界的点顺序( 'negative'负序, 'positive'正序)
*参数10:分辨率:相邻轮廓点之间的最大距离
get_image_size (GrayImage, Width, Height)
dev_open_window(10,10,Width, Height,'black',WindowHandle)
dev_display(SelectedXLD1)
dev_open_window(10,10,Width, Height,'black',WindowHandle1)
dev_display(ContEllipse)
![](https://img2022.cnblogs.com/blog/1502586/202203/1502586-20220319091543192-1566071650.png)
![](https://img2022.cnblogs.com/blog/1502586/202203/1502586-20220319091601186-1390724911.png)
在QtCreator中
HObject ho_Image, ho_GrayImage, ho_Edges, ho_SelectedXLD;
HObject ho_ContoursSplit, ho_SelectedXLD1, ho_ContEllipse;
HTuple hv_Row, hv_Column, hv_Phi, hv_Radius1;
HTuple hv_Radius2, hv_StartPhi, hv_EndPhi, hv_PointOrder;
HTuple hv_Width, hv_Height, hv_WindowHandle, hv_WindowHandle1;
ReadImage(&ho_Image, "D:/bb/tu/8.jpg");
Rgb1ToGray(ho_Image, &ho_GrayImage);
EdgesSubPix(ho_GrayImage, &ho_Edges, "canny", 1, 5, 10);
//亚像素边缘
SelectShapeXld(ho_Edges, &ho_SelectedXLD, "contlength", "and", 367, 369);
SegmentContoursXld(ho_SelectedXLD, &ho_ContoursSplit, "lines_ellipses", 5, 4, 2);
SelectShapeXld(ho_ContoursSplit, &ho_SelectedXLD1, "contlength", "and", 72, 77);
FitEllipseContourXld(ho_SelectedXLD1, "fitzgibbon", -1, 0, 0, 200, 3, 2, &hv_Row,
&hv_Column, &hv_Phi, &hv_Radius1, &hv_Radius2, &hv_StartPhi, &hv_EndPhi, &hv_PointOrder);
//对XLD轮廓做近似椭圆计算--拟合椭圆--获得椭圆数据
//参数1:输入xld轮廓
//参数2:椭圆拟合算法
// 'fhuber', 'fitzgibbon', 'focpoints', 'fphuber', 'fptukey', 'ftukey', 'geohuber', 'geometric', 'geotukey', 'voss'
//参数4:轮廓端点之间的最大距离被视为“闭合”
//参数9:Row椭圆中心的行坐标
//参数10:Column椭圆中心的列坐标
//参数11:Phi主轴方向
//参数12:Radius1大半轴的长度
//参数13:Radius2较小半轴的长度
//参数14:StartPhi起点的角度
//参数15:EndPhi终点的角度
//参数16:PointOrder沿边界的点顺序( 'negative'负序, 'positive'正序)
//注意:拟合时参数1只能包含一条xld
GenEllipseContourXld(&ho_ContEllipse, hv_Row, hv_Column, hv_Phi, hv_Radius1, hv_Radius2,
hv_StartPhi, hv_EndPhi, "positive", 1.5);
//创建椭圆弧的XLD轮廓
//参数1:生成的轮廓
//参数2:Row椭圆中心的行坐标
//参数3:Column椭圆中心的列坐标
//参数4:Phi主轴方向
//参数5:Radius1大半轴的长度
//参数6:Radius2较小半轴的长度
//参数7:StartPhi起点的角度
//参数8:EndPhi终点的角度
//参数9:PointOrder沿边界的点顺序( 'negative'负序, 'positive'正序)
//参数10:分辨率:相邻轮廓点之间的最大距离
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_SelectedXLD1, 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_ContEllipse, HDevWindowStack::GetActive());
![](https://img2022.cnblogs.com/blog/1502586/202201/1502586-20220120221242675-908265425.png)