OpenCV 的圆心和半径检测

问题描述 投票:0回答:1

我想检测圆心和半径。 (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 来找到它。

如何求圆心和半径?

c# opencv circe
1个回答
0
投票

可以使用霍夫圆检测圆,但您可能仍然需要调整图像的参数(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();
© www.soinside.com 2019 - 2024. All rights reserved.