opencv2: обнаружение окружности не обнаруживает очевидные - PullRequest
1 голос
/ 25 сентября 2019

Проблема

Я пытаюсь использовать opencv2 для обнаружения контроллеров движения PlayStation Move в неподвижных изображениях .В попытке увеличить контраст между сферами и фоном, я решил изменить входное изображение, чтобы автоматически масштабировать уровень яркости между средним уровнем изображения и 96 для каждого канала выше, а затем при преобразовании в оттенки серого, взяв вместо этого максимальное значениепреобразования по умолчанию, так как некоторые сферы насыщены, но не "ярки".

Однако мои лучшие попытки настройки параметров, похоже, не работают, обнаруживая круги, которых там нет, над очевидными.

Что я могу сделать, чтобы повысить точность обнаружения?Как вы думаете, какие еще улучшения или алгоритмы я мог бы использовать?

Образцы

В порядке от лучшего к худшему:

2 палочки, 1 обнаруженная палочка (показаны все 2 обнаруженных круга) enter image description here

2 палочки, 1 палочка обнаружена с множеством несуществующих кружков (показаны 4 верхних круга) Come on, those hands aren't that round.

1 палочка (на темном фоне), всего 6 кругов, самый низкий из которых является правильным (показаны все 6 кругов) You know what's rounder than a ball? A foot.

1 Жезл (на темном фоне),Всего обнаружено 44 круга, ни один из которых не является этим Жезлом (показывает все 44 круга) ...Why?

Я использую этот вызов функции:

cv2.HoughCircles(img_gray,cv2.HOUGH_GRADIENT,
    dp=1, minDist=24, param1=90, param2=25,
    minRadius=2, maxRadius=48)

Все изображенияизменить размер и обрезать до 640x480 (разрешение глаза PS3).Размытие не выполняется.

Ответы [ 2 ]

4 голосов
/ 25 сентября 2019

Я думаю, что крутые круги - неправильный подход для вас, так как вы на самом деле не ищете круги.Вы ищете круглые области с сильной интенсивностью.Вместо этого используйте, например, обнаружение BLOB-объектов, я связал руководство:

https://www.learnopencv.com/blob-detection-using-opencv-python-c/

При обнаружении BLOB-объектов вам необходимо установить параметры, чтобы получить правильную высокоинтенсивную круговую область.

2 голосов
/ 26 сентября 2019

Как сказал другой пользователь, крутые круги здесь не лучший подход, потому что крутые круги ищут только идеальные круги.в то время как ваша цель "круглая", но не круг (из-за размытости, размытия / отражения, шума и т. д.)

Я предлагаю преобразовать изображение в HSV, затем выполнить фильтрацию по оттенку / цвету и интенсивностям, чтобы получить двоичный файлПорог вместо непосредственного использования градаций серого (это поможет удалить фон и шум и ограничит область поиска)

, затем с помощью findContours () (быстрее, чем обнаружение BLOB-объектов), проверьте наличие контуров с высокой округлостью и ожидаемого размера / диапазона диапазонаи, возможно, даже твердость.

area = cv2.contourArea(contour)
perimeter = cv2.arcLength(contour,True)
circularity = 4*np.pi*area / (perimeter**2)
solidity = area/cv2.contourArea(cv2.convexHull(contour))

вашей самой большой проблемой будет слияние контура шара с фоном из-за низкой контрастности.так что, возможно, какой-то адаптивный порог может помочь

...