Фон
Вот мой код Emgu.CV для получения изображения и рисования найденных в нем кружков (в основном это код из проекта ShapeDetection в решении Emgu.CV.Examples, который поставляется с загрузкой 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
) или какие значения должны идти туда. У меня, очевидно, нет правильных значений, потому что круг на картинке не «правильно заштрихован».
Мой второй вопрос: есть ли лучший способ найти круг? Мне нужно иметь возможность обнаруживать этот круг во многих типах света (то есть интенсивность цвета круга может быть низкой, например, 80 или ниже) и получать его размеры на рисунке. Как лучше всего сочетать круг? Должен ли я сделать круг другого цвета и посмотреть на исходное изображение для этого цвета? Есть еще идеи?
Спасибо