我想检测圆心和半径。 (C#、OpenCV2)
我尝试使用 Canny Edge、Laplace Edge、BinarizerMethod 来找到它。
我发现错误的位置和半径。
我该如何改进?
a_circle = new IplImage(src.Size, BitDepth.U8, 3);
Cv.Copy(src, a_circle);
a_gray = new IplImage(src.Size, BitDepth.U8, 1);
Cv.CvtColor(src, a_gray, ColorConversion.BgrToGray);
Cv.Smooth(a_gray, a_gray, SmoothType.Gaussian, 9);
CvMemStorage a_Storage = new CvMemStorage();
CvSeq<CvCircleSegment> circles = Cv.HoughCircles(a_gray, a_Storage, HoughCirclesMethod.Gradient, 1, 100, a_p_edge, a_p_center, 0, 0);
foreach (CvCircleSegment item in circles)
{
Cv.DrawCircle(a_gray, item.Center, (int)item.Radius, CvColor.White, 3);
point_radius = (int)item.Radius;
point_centerX = (int)item.Center.X;
point_centerY = (int)item.Center.Y;
}
我尝试使用 Canny Edge、Laplace Edge、BinarizerMethod 来找到它。
如何求圆心和半径?
可以使用霍夫圆检测圆,但您可能仍然需要调整图像的参数(dp、param1、param2 等)。 处理后的图像
参见文档:https://docs.opencv.org/3.4/d4/d70/tutorial_hough_circle.html
using OpenCvSharp;
using Mat originalImageColor = Cv2.ImRead("C:\\circle.png", ImreadModes.Color);
using Mat workerImage = Cv2.ImRead("C:\\circle.png", ImreadModes.Grayscale);
float dp = 0.1f;
int minDistance = 200;
int param1 = 60;
int param2 = 40;
int minRadius = 350;
int maxRadius = 500;
CircleSegment[] results = Cv2.HoughCircles(workerImage, HoughModes.Gradient, dp, minDistance, param1, param2, minRadius, maxRadius);
foreach(var result in results)
{
Cv2.Circle(originalImageColor, (int)result.Center.X, (int)result.Center.Y, (int)result.Radius, Scalar.Magenta[enter image description here][1], thickness: 3);
}
Cv2.ImShow("output", originalImageColor);
Cv2.WaitKey();