|  | 
 
 
 楼主|
发表于 2025-4-28 15:00:45
|
显示全部楼层 
| using System; using HalconDotNet;
 
 namespace HalconHighPrecisionCircleFit
 {
 class Program
 {
 static void Main(string[] args)
 {
 // 图像路径
 string imagePath = "bump_image.png";
 
 // 1. 读入图像
 HImage image = new HImage(imagePath);
 
 // 2. 转灰度
 HImage gray;
 HOperatorSet.Rgb1ToGray(image, out gray);
 
 // 3. 高斯去噪 (sigma=1.5)
 HImage smooth;
 HOperatorSet.GaussImage(gray, out smooth, 1.5);
 
 // 4. 亚像素精度 Canny 边缘提取 (aperture=1, low=50, high=150)
 HRegion edges;
 HOperatorSet.EdgesSubPix(smooth, out edges, "canny", 1, 50, 150);
 
 // 5. Hough 圆变换检测 (sigma=3, threshold=50, minDist=20, maxDist=200, rMin=5, rMax=30)
 HRegion roughCircles;
 HOperatorSet.HoughCircle(edges, out roughCircles,
 "greys",  // 基于灰度投票
 3,        // 高斯平滑半径
 50,       // 投票阈值
 20,       // 圆心最小间距
 200,      // 最大投票距离
 5,        // 最小半径
 30        // 最大半径
 );
 
 // 6. 用 FitCircleContourXld 做高精度拟合
 HObject preciseCircles;
 HTuple rowC, colC, radC, startPhi, endPhi;
 HOperatorSet.FitCircleContourXld(roughCircles, out preciseCircles,
 "algebraic",  // 拟合算法
 2,             // 拟合迭代次数
 5,             // 最小点数
 20,            // 最大点间隔
 3,             // 最小弧长
 2,             // 最大重叠
 0.05,          // 最大拟合误差
 out rowC, out colC, out radC, out startPhi, out endPhi
 );
 
 // 7. 可视化结果
 // 创建一个窗口,大小同图像
 HWindow window = new HWindow(0, 0, image.Width, image.Height);
 window.DispObj(image);
 
 // 在原图上画出每个拟合的圆
 int count = rowC.Length;
 window.SetColor("green");
 for (int i = 0; i < count; i++)
 {
 window.DispCircle(rowC[i], colC[i], radC[i]);
 }
 
 Console.WriteLine($"检测到 {count} 个 bump 圆。");
 Console.WriteLine("按任意键退出。");
 Console.ReadKey();
 }
 }
 }
 
 | 
 |