Я пытаюсь обнаружить большое количество маленьких кружков, которые находятся относительно близко друг к другу (всего около 20 пикселей друг от друга), используя OpenCV
, Мне удалось создать эту маску, используя cv::inRange()
а также cv::Canny()
,
Исходное изображение
маскировать
Тем не менее, когда я использую cv::HoughCircles()
только некоторые круги обнаруживаются точно. В настоящее время я использую cv::HoughCircles()
со следующими параметрами:
cv::HoughCircles(mat, circles, CV_HOUGH_GRADIENT, 2, mat.rows / 256, 100, 8, 2, 8);
Является ли этот метод недостаточно эффективным для обнаружения таких маленьких и близких окружностей, или мне просто нужно изменить параметры cv :: HoughCircles ()?
Кроме того, было бы полезно избавиться от «шума», окружающего массив окружностей в середине маски, потому что некоторые «ложные круги» обнаруживаются по краям маски. Есть ли простой способ сделать это?
Избавиться от шума:
Если вы можете быть уверены, что всегда будете иметь одинаковые параметры среды (например, расстояние от круга, яркость …), то вы можете замаскировать свое изображение сразу после обнаружения края Canny с помощью cvAnd; вот как будет выглядеть маска:
Обнаружение крутых кругов:
Теперь о HoughCircle. Во-первых, эта функция выполняет собственное обнаружение края Канни. Вы тоже делаете это перед звонком в HoughCircle. Это может повлиять на форму ваших кругов, потому что как работает Canny (то есть градиент интенсивности на бинарном изображении …).
Говоря о форме ваших кругов, ниже приведен крупный план того, как выглядят ваши «круги»; Я был бы очень впечатлен, если бы HoughCircle действительно обнаружил все или даже некоторые из них. Это не может дать ничего хорошего в Хаф пространство. Просто чтобы убедиться, установите последние два параметра в 0 (минимальный / максимальный радиус) и попытайтесь уменьшить минимальное расстояние между центрами. Но, честно говоря, я думаю, что вам нужно найти другой подход к вашей проблеме.
[РЕДАКТИРОВАТЬ]
Возможным подходом было бы выполнить маркировка подключенных компонентов (например, обнаружение BLOB-объектов). Насколько я знаю, это невозможно сделать просто с одним OpenCV, вам понадобится что-то вроде cvblob, это очень хорошая библиотека BLOB-объектов на основе OpenCV. В частности, вы можете быть заинтересованы в cvCentroid(CvBlob *blob)
,
ура
Хм, тебе действительно нужно определять их как круги? (в отличие от модели их в виде кругов).
Если это какой-то тип калибровочного шаблона, и вас интересует только оценка положения изображений центров, может быть гораздо эффективнее сначала обнаружить их как точечные объекты, а затем обработать каждый обнаруженный в отдельности — например, подгонка круга к капле белых пикселей в окрестности каждого обнаруженного объекта.