Detecção de várias cores em tempo real usando Python-OpenCV
Para que um robô visualize o ambiente, junto com a detecção do objeto, a detecção de sua cor em tempo real também é muito importante.
Por que isso é importante? : Alguns aplicativos do mundo real
- Em carro com direção automática, para detectar os sinais de trânsito.
- A detecção de várias cores é usada em alguns robôs industriais, para realizar tarefas de pick-and-place na separação de objetos de cores diferentes.
Esta é uma implementação de detecção de várias cores (aqui, apenas as cores vermelho , verde e azul foram consideradas) em tempo real usando a linguagem de programação Python.
Bibliotecas Python usadas:
Descrição do Fluxo de Trabalho:
-
Etapa 1: Entrada: Capture vídeo pela webcam.
Etapa 2: Leia o fluxo de vídeo em quadros de imagem.
Etapa 3: Converta o imageFrame em BGR (espaço de cores RGB representado como três matrizes de vermelho, verde e azul com valores inteiros de 0 a 255) para espaço de cores HSV (hue-saturation-value). Matiz descreve uma cor em termos de saturação , representa a quantidade de cor cinza nessa cor e o valor descreve o brilho ou intensidade da cor. Isso pode ser representado como três matrizes no intervalo de 0-179, 0-255 e 0-255, respectivamente.
Etapa 4: defina o intervalo de cada cor e crie a máscara correspondente.
Etapa 5:Transformação Morfológica: Dilatação, para remover ruídos das imagens.
Etapa 6: bitwise_and entre o quadro da imagem e a máscara é realizada para detectar especificamente aquela cor particular e separar outras.
Etapa 7: Crie um contorno para as cores individuais para exibir a região colorida detectada de maneira distinta.
Etapa 8: Saída: Detecção das cores em tempo real.
Abaixo está a implementação.
import
numpy as np
import
cv2
webcam
=
cv2.VideoCapture(
0
)
while
(
1
):
_, imageFrame
=
webcam.read()
hsvFrame
=
cv2.cvtColor(imageFrame, cv2.COLOR_BGR2HSV)
red_lower
=
np.array([
136
,
87
,
111
], np.uint8)
red_upper
=
np.array([
180
,
255
,
255
], np.uint8)
red_mask
=
cv2.inRange(hsvFrame, red_lower, red_upper)
green_lower
=
np.array([
25
,
52
,
72
], np.uint8)
green_upper
=
np.array([
102
,
255
,
255
], np.uint8)
green_mask
=
cv2.inRange(hsvFrame, green_lower, green_upper)
blue_lower
=
np.array([
94
,
80
,
2
], np.uint8)
blue_upper
=
np.array([
120
,
255
,
255
], np.uint8)
blue_mask
=
cv2.inRange(hsvFrame, blue_lower, blue_upper)
kernal
=
np.ones((
5
,
5
),
"uint8"
)
red_mask
=
cv2.dilate(red_mask, kernal)
res_red
=
cv2.bitwise_and(imageFrame, imageFrame,
mask
=
red_mask)
green_mask
=
cv2.dilate(green_mask, kernal)
res_green
=
cv2.bitwise_and(imageFrame, imageFrame,
mask
=
green_mask)
blue_mask
=
cv2.dilate(blue_mask, kernal)
res_blue
=
cv2.bitwise_and(imageFrame, imageFrame,
mask
=
blue_mask)
contours, hierarchy
=
cv2.findContours(red_mask,
cv2.RETR_TREE,
cv2.CHAIN_APPROX_SIMPLE)
for
pic, contour
in
enumerate
(contours):
area
=
cv2.contourArea(contour)
if
(area >
300
):
x, y, w, h
=
cv2.boundingRect(contour)
imageFrame
=
cv2.rectangle(imageFrame, (x, y),
(x
+
w, y
+
h),
(
0
,
0
,
255
),
2
)
cv2.putText(imageFrame,
"Red Colour"
, (x, y),
cv2.FONT_HERSHEY_SIMPLEX,
1.0
,
(
0
,
0
,
255
))
contours, hierarchy
=
cv2.findContours(green_mask,
cv2.RETR_TREE,
cv2.CHAIN_APPROX_SIMPLE)
for
pic, contour
in
enumerate
(contours):
area
=
cv2.contourArea(contour)
if
(area >
300
):
x, y, w, h
=
cv2.boundingRect(contour)
imageFrame
=
cv2.rectangle(imageFrame, (x, y),
(x
+
w, y
+
h),
(
0
,
255
,
0
),
2
)
cv2.putText(imageFrame,
"Green Colour"
, (x, y),
cv2.FONT_HERSHEY_SIMPLEX,
1.0
, (
0
,
255
,
0
))
contours, hierarchy
=
cv2.findContours(blue_mask,
cv2.RETR_TREE,
cv2.CHAIN_APPROX_SIMPLE)
for
pic, contour
in
enumerate
(contours):
area
=
cv2.contourArea(contour)
if
(area >
300
):
x, y, w, h
=
cv2.boundingRect(contour)
imageFrame
=
cv2.rectangle(imageFrame, (x, y),
(x
+
w, y
+
h),
(
255
,
0
,
0
),
2
)
cv2.putText(imageFrame,
"Blue Colour"
, (x, y),
cv2.FONT_HERSHEY_SIMPLEX,
1.0
, (
255
,
0
,
0
))
cv2.imshow(
"Multiple Color Detection in Real-TIme"
, imageFrame)
if
cv2.waitKey(
10
) &
0xFF
=
=
ord
(
'q'
):
cap.release()
cv2.destroyAllWindows()
break
Resultado:
As postagens do blog Acervo Lima te ajudaram? Nos ajude a manter o blog no ar!
Faça uma doação para manter o blog funcionando.
70% das doações são no valor de R$ 5,00...
Diógenes Lima da Silva