En OpenCV las imagen que se leen desde un dispositivo se adquieren en espacio de color BGR, en este espacio de color la imagen este dividida en 3 canales cada uno de ellos representa en azul el verde y el rojo respectivamente. El espacio de color RGB funciona de la misma manera excepto por que el orden de los canales esta invertido.
El problema con los espacio de color RGB y BGR consiste en la información del color esta presente en los 3 canales de la imagen lo cual hace mas difícil realizar un filtrado. Para esto convertimos la imagen al espacio de color HSV en el cual la información que representa el color se encuentra en un solo canal(Hue)
hsv_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
Una vez que tenemos la imagen un formato HSV podremos generar otra imagen que solo posea los píxeles en un determinado intervalo.
lower_bound = np.array([cv2.getTrackbarPos("LowH", "controls"), cv2.getTrackbarPos("LowS", "controls"),
cv2.getTrackbarPos("LowV", "controls")])
upper_bound = np.array([cv2.getTrackbarPos("HighH", "controls"), cv2.getTrackbarPos("HighS", "controls"),
cv2.getTrackbarPos("HighV", "controls")])
Código completo :
__author__ = 'carlos'
import cv2
import sys
import numpy as np
# callback, no usado por ahora.
def nothing(x):
pass
def main():
# todas las camaras conectadas tienen un ID, el 0 representa la primera.
cap = cv2.VideoCapture(0)
# WINDOW_NORMAL permite redimensionar las ventanas
cv2.namedWindow("frame", cv2.WINDOW_NORMAL)
cv2.namedWindow("hsv", cv2.WINDOW_NORMAL)
cv2.namedWindow("thr", cv2.WINDOW_NORMAL)
# ventana que solo posee los controles, es posible colocarlos en las que fueron declaradas anteriormente.
cv2.namedWindow("controls", cv2.WINDOW_NORMAL)
# trackbars
cv2.createTrackbar("LowH", "controls", 0, 179, nothing) # Hue [0 - 179]
cv2.createTrackbar("HighH", "controls", 0, 179, nothing)
cv2.createTrackbar("LowS", "controls", 0, 255, nothing) # Saturation [0 - 255]
cv2.createTrackbar("HighS", "controls", 0, 255, nothing)
cv2.createTrackbar("LowV", "controls", 0, 255, nothing) # Value [0 - 255]
cv2.createTrackbar("HighV", "controls", 0, 255, nothing)
while True:
success, frame = cap.read()
if not success:
print("error reading web cam", file=sys.stderr)
# cambia el espacio de color de la imagen
hsv_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
lower_bound = np.array([cv2.getTrackbarPos("LowH", "controls"), cv2.getTrackbarPos("LowS", "controls"),
cv2.getTrackbarPos("LowV", "controls")])
upper_bound = np.array([cv2.getTrackbarPos("HighH", "controls"), cv2.getTrackbarPos("HighS", "controls"),
cv2.getTrackbarPos("HighV", "controls")])
# realiza el filtrado
thresholded_frame = cv2.inRange(hsv_frame, lower_bound, upper_bound)
cv2.imshow("frame", frame)
cv2.imshow("hsv", hsv_frame)
cv2.imshow("thr", thresholded_frame)
# finaliza el programa al presionar la tecla scape.
k = cv2.waitKey(5) & 0xFF
if k == 27:
break
if __name__ == '__main__':
main()
Ejemplo :
En el próximo tutorial veremos como seguir la trayectoria de un objeto en la imagen.
Dentro de git se encuentra una versión en C++ del código anterior.
Git : https://github.com/CarlosAndres12/OpencvTut
Enlaces :
HSV : http://infohost.nmt.edu/tcc/help/pubs/colortheory/web/hsv.html
Tutorial : http://opencv-srf.blogspot.com/
Post a Comment
0 comments
Dear readers, after reading the Content please ask for advice and to provide constructive feedback Please Write Relevant Comment with Polite Language.Your comments inspired me to continue blogging. Your opinion much more valuable to me. Thank you.