En este artículo, discutiremos cómo detectar un objeto de color monocromático usando python y OpenCV. Color monocromático significa luz de una sola longitud de onda. Usaremos el video, capturado usando una cámara web como entrada e intentaremos detectar objetos de un solo color, especialmente Azul. Pero puede detectar cualquier color si establece el rango correctamente, lo discutiremos más adelante.
Para lograrlo, es muy recomendable convertir los colores de formato RGB a HSV. HSV significa matiz, saturación y valor. Hue significa el color en sí mismo, técnicamente denota el ángulo en el modelo de color HSV.
Entendamos primero el modelo de color HSV. Imagina un cilindro, tiene una altura, un radio y un área de superficie curva. Tome la posición inicial del radio como referencia y mueva el radio en sentido contrario a las agujas del reloj hasta un ángulo θ, es decir, θ es el ángulo entre la posición actual del radio con su posición inicial. Si θ es de 0 grados, denota el color rojo, si θ es de 120 grados, denota verde, y así sucesivamente. La longitud del radio es la saturación del color y la altura significa el valor o V en HSV.
La idea principal es convertir la imagen RGB de entrada (BGR en el caso de OpenCV porque así es como se formatean las imágenes en este módulo) al formato HSV, lo que nos facilitará enmascarar el color específico fuera del marco. Es decir, a cualquier color en el rango HSV provisto se le dará un valor de 255 y otros serán simplemente 0, y como resultado, cada objeto con color en el rango especificado cambiará a blanco dejando el resto de la imagen, es decir, el fondo negro. .
Para mostrar el color necesitamos bit a bit y el marco actual con la máscara. Para esto, hay una función incorporada llamada bitwise_and()
syntax: result = cv2.bitwise_and(pic1, pic2, mask)
donde pic1 y pic2 son las imágenes de entrada y la otra es una máscara. Se puede pensar en una máscara como una forma recortada aplicada a una imagen para que solo la parte recortada sea visible.
Implementación:
Primero, cree un objeto de captura de video OpenCV después de importar el módulo requerido usando los siguientes dos códigos:
import cv2 import numpy as np
Luego inicie un ciclo while infinito para leer cada cuadro leído por la cámara web. Convierta cada cuadro del formato BGR al formato HSV usando la función cv2.cvtColor() , toma el cuadro como la primera entrada y el tipo de conversión de color como la segunda entrada.
syntax: cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
Después de eso, especifique el límite inferior y superior del color azul (o cualquier color que prefiera). Al crear dos arrays NumPy con el límite inferior y superior deseado como [H, S, V]. Estas dos arrays NumPy se utilizarán como argumentos en la función de umbral, es decir, la función cv2.inRange() . Que toma tres argumentos, fuente de imagen, límite inferior y límite superior.
syntax: cv2.inRange(source, lower_limit, upper_limit)
La función cv2.inRange() establece todos los valores que se encuentran dentro del rango en 255 y el resto en 0. La salida de esta función será nuestra máscara. Finalmente, pasar esta máscara en la función bitwise_and mencionada anteriormente producirá el resultado deseado. La salida se da a continuación.
Código:
Python3
import cv2 import numpy as np cap = cv2.VideoCapture(0) while 1: ret,frame =cap.read() # ret will return a true value if the frame exists otherwise False into_hsv =cv2.cvtColor(frame,cv2.COLOR_BGR2HSV) # changing the color format from BGr to HSV # This will be used to create the mask L_limit=np.array([98,50,50]) # setting the blue lower limit U_limit=np.array([139,255,255]) # setting the blue upper limit b_mask=cv2.inRange(into_hsv,L_limit,U_limit) # creating the mask using inRange() function # this will produce an image where the color of the objects # falling in the range will turn white and rest will be black blue=cv2.bitwise_and(frame,frame,mask=b_mask) # this will give the color to mask. cv2.imshow('Original',frame) # to display the original frame cv2.imshow('Blue Detector',blue) # to display the blue object output if cv2.waitKey(1)==27: break # this function will be triggered when the ESC key is pressed # and the while loop will terminate and so will the program cap.release() cv2.destroyAllWindows()
Producción:
Publicación traducida automáticamente
Artículo escrito por rajarshiban13 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA