背景
这是我的 Emgu.CV 代码,用于获取图像并绘制其中找到的圆圈(主要来自 Emgu.CV.Examples 解决方案中的 ShapeDetection 项目的代码,该解决方案随 EmguCV 下载提供):
//Load the image from file
Image<Bgr, Byte> img = new Image<Bgr, byte>(myImageFile);
//Get and sharpen gray image (don't remember where I found this code; prob here on SO)
Image<Gray, Byte> graySoft = img.Convert<Gray, Byte>().PyrDown().PyrUp();
Image<Gray, Byte> gray = graySoft.SmoothGaussian(3);
gray = gray.AddWeighted(graySoft, 1.5, -0.5, 0);
Image<Gray, Byte> bin = gray.ThresholdBinary(new Gray(149), new Gray(255));
Gray cannyThreshold = new Gray(149);
Gray cannyThresholdLinking = new Gray(149);
Gray circleAccumulatorThreshold = new Gray(1000);
Image<Gray, Byte> cannyEdges = bin.Canny(cannyThreshold, cannyThresholdLinking);
//Circles
CircleF[] circles = cannyEdges.HoughCircles(
cannyThreshold,
circleAccumulatorThreshold,
4.0, //Resolution of the accumulator used to detect centers of the circles
15.0, //min distance
5, //min radius
0 //max radius
)[0]; //Get the circles from the first channel
//draw circles (on original image)
foreach (CircleF circle in circles)
img.Draw(circle, new Bgr(Color.Brown), 2);
这是图像:
问题
好的,所以我知道阈值
ThresholdBinary
是多少。由于我从灰度图像中获取二进制图像,因此它是图片中灰度的强度。这是因为图片中灰度圆圈的强度为 150 到 185。我假设这与 的第一个参数相同HoughCircles
。我不知道的是 circleAccumulatorThreshold、累加器的分辨率和最小距离(第 2、第 3 和第 4 个参数到
HoughCircles
)是什么,或者应该有什么值。我显然没有正确的值,因为图片中的圆圈没有正确“houghed”。我的第二个问题是,有没有更好的方法来找到圆圈?我需要能够在多种类型的光中检测到这个圆圈(即圆圈颜色强度可能很低,如 80 或更低)并在图片中获得它的尺寸。匹配圆圈的最佳方法是什么?我应该让圆圈变成另一种颜色并在原始图像中查找该颜色吗?还有其他想法吗?
谢谢