EmguCV和OpenCV中的HoughCircles有什么区别?

时间:2014-06-18 18:00:42

标签: c# python opencv emgucv

我尝试使用带有C#的EmguCV 2.2检测此图像中的圆圈,但没有任何运气。

enter image description here

将OpenCV与cv2 python包一起使用,以下代码正确找到上图中的8个圆圈:

img = cv2.imread('test2.png')   
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    circles = cv2.HoughCircles(gray, cv2.cv.CV_HOUGH_GRADIENT, 1, 10, param1=15, param2=10, minRadius=5, maxRadius=5)

为简洁起见,我省略了将圆圈绘制到img上的代码,但是作为参考输出 - 假设我使用cv2.circle用绿色填充每个找到的圆圈,看起来像:

enter image description here

但是,我似乎无法使用C#找到相同的圈子。

我已完全使用这些参数,但尝试使用以下代码并未在图像中找到任何圆圈:

var gray = new Image<Gray, byte>("test2.png");
var circles = gray.HoughCircles(
                accumulatorThreshold: new Gray(16), dp: 1,
                cannyThreshold: new Gray(9),
                minDist: 10, minRadius: 4, maxRadius: 6)[0];

任何使用C#查找这8个圈子的帮助都将非常感谢!!

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:4)

我使用以下代码查找Hough Circles

Image<Bgr, byte> Img_Result_Bgr = new Image<Bgr, byte>(Img_Source_Gray.Width, Img_Source_Gray.Height);
CvInvoke.cvCvtColor(Img_Source_Gray.Ptr, Img_Result_Bgr.Ptr, Emgu.CV.CvEnum.COLOR_CONVERSION.CV_GRAY2BGR);
Gray cannyThreshold = new Gray(12);
Gray circleAccumulatorThreshold = new Gray(26);
double Resolution = 1.90;
double MinDistance = 10.0;
int MinRadius = 0;
int MaxRadius = 0;

CircleF[] HoughCircles = Img_Source_Gray.Clone().HoughCircles(
                        cannyThreshold,
                        circleAccumulatorThreshold,
                        Resolution, //Resolution of the accumulator used to detect centers of the circles
                        MinDistance, //min distance 
                        MinRadius, //min radius
                        MaxRadius //max radius
                        )[0]; //Get the circles from the first channel
#region draw circles
foreach (CircleF circle in HoughCircles)
    Img_Result_Bgr.Draw(circle, new Bgr(Color.Red), 2);
#endregion

imageBox1.Image = Img_Result_Bgr;

这是Program Output

此外,由于这些圈子是分开的,我更愿意使用最小封闭圆圈方法来找到这些圆圈共同点。 Refer this link

轻松找到这些圈子的共同点:

  1. 查找此二进制图像的轮廓。
  2. 循环每个轮廓。
  3. 将轮廓点转换为点集合。
  4. 找到Point Collection的MinEnclosingCircle()。
  5. 准确地获得每个圈子的共同点。