Обнаружение цвета неэффективно для изображений с веб-камеры

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

Вот цифровое изображение поверхности: Оригинал изображения арены

Теперь я распечатал эту арену на гибком диске (без этих двух цветных кругов) и вручную разместил на ней цветные круглые монеты. Но после захвата его изображения через веб-камеру с разрешением 1,3 МП определение цвета не сработало и дало ложные результаты.

Вот распечатанная арена, снятая веб-камерой:

изображение печатной арены с веб-камеры

Почему цвета не распознаются? Нужно ли выполнять постобработку изображения с веб-камеры? Я попытался повысить резкость изображения с помощью cv2.filter2D, но это тоже не сработало.

Вот фрагмент для обнаружения красных кругов из моего кода Python:

ip_image=cv2.imread("image.png")
kernel = np.array([[-1,-1,-1],[-1,9,-1],[-1,-1,-1]])
ip_image=cv2.filter2D(ip_image,-1,kernel)
#cv2.imshow("Hi",ip_image)
hsv=cv2.cvtColor(ip_image,cv2.COLOR_BGR2HSV)
red_low=np.array([0,255,255])
red_up=np.array([10,255,255])
mask0= cv2.inRange(hsv,red_low,red_up)
red_low=np.array([170,255,255])
red_up=np.array([180,255,255])
mask1=cv2.inRange(hsv,red_low,red_up)
mask_red=mask1+mask0
r_img= ip_image.copy()
r_img[np.where(mask_red==0)] = 0
gray_img0 = cv2.cvtColor(r_img,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(gray_img0,0,255,0)
M = cv2.moments(thresh)
rX=int(M["m10"] / M["m00"])
rY=int(M["m01"] / M["m00"])
cv2.circle(ip_image,(rX,rY), 17, (255,255,255), 2)
cv2.imshow("Output",ip_image)

Кроме того, четвертый параметр в cv2.threshold() при установке на «0» правильно работает с цифровым изображением, а с изображением с веб-камеры выдает ошибку деления на ноль в строке:

rX=int(M["m10"]/M["m00"])

person Aniruddha789    schedule 25.12.2019    source источник
comment
Есть как минимум три возможных проблемы с точностью цветопередачи снятой фотографии: 1. Цвет света не солнечный (выглядит зеленоватым, но я могу ошибаться). 2. У веб-камеры плохая калибровка цвета. 3. Алгоритм автоматического баланса белого (автоматическая балансировка цвета) дал сбой (алгоритм эвристический и имеет тенденцию к сбою). В целом точность цветопередачи фотографии проблематична, во многих случаях производители камер изменяют цвета, чтобы они выглядели лучше. Я попытался применить ручной баланс белого: Исправленное изображение. Проверьте, помогает ли это.   -  person Rotem    schedule 26.12.2019
comment
Цвета на втором изображении отличаются от цветов на первом. Проверьте, какие значения RGB видит ваша камера для этих монет, и на основе этого определите порог.   -  person Cris Luengo    schedule 26.12.2019
comment
ваши пороги насыщенности и интенсивности слишком высоки для любых реальных изображений (вы принимаете только 255 для обоих). Установите более низкую насыщенность и интенсивность ниже!   -  person Micka    schedule 26.12.2019
comment
Я попытался сделать снимок с лучшей перспективы (от центра вверху), улучшил условия освещения. Я также попытался найти точные значения hsv красного цвета, а затем использовал для них диапазон +-10 в пороговом значении, но все равно не повезло!   -  person Aniruddha789    schedule 27.12.2019


Ответы (2)


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

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

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

введите здесь описание изображения

Как видите, некоторые области имеют очень похожие цвета. Я использую немного более продвинутую функцию сходства цветов для обработки сложных случаев. По сути, я указал красный и зеленый цвета с некоторыми пороговыми значениями. Delta E будет правильной отправной точкой. Давайте посмотрим на реальные формы:

введите здесь описание изображения

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

В любом случае, любая реальная сцена потребует от вас очень внимательного отношения к цветам:

введите здесь описание изображения

(посмотреть в действии)

Аналогичная проблема:

Проблема с распознаванием людей по цвету одежды при не сильном освещении

person Renat Gilmanov    schedule 02.01.2020
comment
не могли бы вы поделиться кодом для вышеуказанных операций, которые вы сделали ?! - person Aniruddha789; 22.06.2020
comment
Извините, нет кода для обмена, я использовал инструмент графического интерфейса, чтобы предоставить что-то вроде PoC. Это сегментация на основе цвета, основанная на дельта-E. - person Renat Gilmanov; 27.06.2020

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

Теперь некоторые другие части изображения тоже могут пережить пороговое значение. В этой ситуации вы можете отфильтровать эти нежелательные части с помощью методов анализа формы, таких как детектор круга Хафа, или на основе их размеров.

person MH304    schedule 26.12.2019