Использование EmguCV с C #, MS VS 2015. Цель состоит в том, чтобы распознать черные круги на белом листе (с небольшим количеством пыли). Радиусы окружностей - около 80 пикселей, нет соседних кругов.
Учитывая IntPtr ptrImg
содержит byte[]
с изображением в градациях серого (8 бит на выборку, один канал).
Есть код для определения кругов:
Mat mat = new Mat(height, width, DepthType.Cv8U, 1, ptrImg, width);
CvInvoke.FastNlMeansDenoising(mat, mat, 20);
return CvInvoke.HoughCircles(mat, HoughType.Gradient, 2.0, 120.0, 90, 60, 60, 100);
На самом деле, некоторые из кругов обнаружены нормально, но у некоторых есть радиус, определяемый сбоями, отличается от реального радиуса примерно на 5-7 пикселей; обнаруженная граница совпадает с реальной границей на одной стороне и отсутствует на противоположной стороне.
![top-right - radius more than real; bottol-left - radius less than real](https://i.stack.imgur.com/MWSvV.jpg)
Что я не прав? Может быть, мне нужно поиграть с dp, param1, param2? Что мне с ними делать?
P.S. Если я уберу шумоподавление, но добавлю бинаризацию по порогу, ситуация не улучшится:
![enter image description here](https://i.stack.imgur.com/UTyzH.jpg)