Как определить черный цвет в видеокамере с помощью OpenCV? - PullRequest
0 голосов
/ 12 февраля 2019

Мне нужно обнаружить черные объекты в видео в реальном времени.Я получил код в интернете для обнаружения синих объектов.Поэтому я изменил верхнее и нижнее значение hsv в соответствии с цветовым кодом bgr (неясно, как преобразовать bgr в hsv), но он не обнаруживает черный объект в видео. Код, использующий обнаружение синего цвета:

import cv2 
import numpy as np  

cap = cv2.VideoCapture(0)  

while(1):        
    _, frame = cap.read()  
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) 
    lower_red = np.array([110,50,50]) 
    upper_red = np.array([130,255,255]) 
    mask = cv2.inRange(hsv, lower_red, upper_red) 
    res = cv2.bitwise_and(frame,frame, mask= mask) 
    cv2.imshow('frame',frame) 
    cv2.imshow('mask',mask) 
    cv2.imshow('res',res) 
    k = cv2.waitKey(5) & 0xFF
    if k == 27: 
        break

cv2.destroyAllWindows() 
cap.release() 

вывод для синего цвета: исходное изображение: blue

masked blue

blue detection

Код, который я использую для черного цвета: `

import cv2 
import numpy as np  

cap = cv2.VideoCapture(0)

while(1):        
    _, frame = cap.read()  
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) 
    lower_red = np.array([0,0,0]) 
    upper_red = np.array([0,0,0]) 
    mask = cv2.inRange(hsv, lower_red, upper_red) 
    res = cv2.bitwise_and(frame,frame, mask= mask) 
    cv2.imshow('frame',frame) 
    cv2.imshow('mask',mask) 
    cv2.imshow('res',res)  
    k = cv2.waitKey(5) & 0xFF
    if k == 27: 
        break

cv2.destroyAllWindows() 
cap.release() 

Результат: original image

masked black

result

Ничего не отображается в результате черного.Я думаю, что проблема в преобразовании HSV, но я не уверен.А на обнаруженном голубом изображении неточности, что приводит к шуму.Как добиться обнаружения черного и уменьшить шум?.

1 Ответ

0 голосов
/ 12 февраля 2019

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

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 15, 255, cv2.THRESH_BINARY_INV)

изменять значение 15, пока не получите разумные результаты.Более низкое значение приведет к сохранению только более темных пикселей.Если вы хотите извлечь местоположение пикселей, вы также можете получить контуры, например

image, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

, а затем нарисовать контур обратно на исходный кадр с помощью:

frame = cv2.drawContours(frame, contours, -1,(0,0,255),3)

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

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
gray = 255-gray
ret, thresh = cv2.threshold(gray, 225, 255, cv2.THRESH_BINARY_INV)
image, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
frame = cv2.drawContours(frame, contours, -1,(0,0,255),3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...