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