Herramientas de usuario

Herramientas del sitio


informatica:programacion:python:modulos:opencv

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
informatica:programacion:python:modulos:opencv [2020/12/10 15:37] – [Detección de caras] tempwininformatica:programacion:python:modulos:opencv [2020/12/10 16:30] (actual) – [Optical Flow] tempwin
Línea 133: Línea 133:
 </code> </code>
  
 +Podemos convertirlo en una función para utilizarlo más cómodamente:
 +
 +<code python>
 +def display(img):
 +    dig = plt.figure(figsize=(10,8))
 +    ax = fig.add_subplot(111)
 +    new_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
 +    ax.imgshow(new_img)
 +    
 +# Para usarla:
 +img = cv2.imread("imagen.jpg")
 +display(img)
 +</code>
 ===== Imágenes en OpenCV ===== ===== Imágenes en OpenCV =====
  
Línea 786: Línea 799:
 Cuando la imagen pasa todos los clasificadores, se puede concluir que se ha detectado una cara. Cuando la imagen pasa todos los clasificadores, se puede concluir que se ha detectado una cara.
  
-El problema de este método es que necesita un conjunto muy grande de información. La parte buena es que OpenCV viene con ficheros XML pre-entrenados para Haar.+El problema de este método es que necesita un conjunto muy grande de información. La parte buena es que OpenCV [[https://github.com/opencv/opencv/tree/master/data/haarcascades|viene con ficheros XML pre-entrenados para Haar]].
  
 <code python> <code python>
Línea 817: Línea 830:
 result = detect_face(nadia) result = detect_face(nadia)
  
 +# Mostramos la imagen resultante con el rectángulo sobre la cara
 plt.imshow(result, cmap='gray') plt.imshow(result, cmap='gray')
 +</code>
 +
 +Si no se detectasen las caras correctamente o hubiese duplicidades, se puede jugar con el factor de escala o el parámetro de vecinos:
 +
 +<code python>
 +# Mejora
 +def adj_detect_face(img):
 + 
 +    face_img = img.copy()
 + 
 +    face_rects = face_cascade.detectMultiScale(face_img, scaleFactor = 1.2, minNeighbors=5)
 + 
 +    # El método anterior devuelve un objeto que utilizaremos
 +    # para dibujar un rectángulo alrededor de la cara
 +    for (x,y,w,h) in face_rects:
 +        cv2.rectangle(face_img,(x,y),(x+w,y+h), (255,255,255), 10)
 + 
 +    return face_img
 +</code>
 +
 +==== Detección de ojos ====
 +
 +<code python>
 +import cv2
 +import numpy as np
 +import matplotlib.pyplot as plt
 +%matplotlib inline
 +
 +nadia = cv2.imread("../101/DATA/Nadia_Murad.jpg", 0)
 +
 +# Utilizamos otro clasificador
 +eye_cascade = cv2.CascadeClassifier("../101/DATA/haarcascades/haarcascade_eye.xml")
 +
 +# Función para detectar los ojos y pintar un recuadro
 +def detect_eyes(img):
 + 
 +    face_img = img.copy()
 + 
 +    eyes_rects = eye_cascade.detectMultiScale(face_img)
 + 
 +    # El método anterior devuelve un objeto que utilizaremos
 +    # para dibujar un rectángulo alrededor de los ojos
 +    for (x,y,w,h) in eyes_rects:
 +        cv2.rectangle(face_img,(x,y),(x+w,y+h), (255,255,255), 10)
 + 
 +    return face_img
 +    
 +result = detect_eyes(nadia)
 +
 +plt.imshow(result, cmap='gray')
 +</code>
 +
 +<WRAP center round tip 60%>
 +Igual que en la detección de caras, podemos jugar con los argumentos del método ''detectMultiScale'' para mejorar los resultados
 +</WRAP>
 +
 +
 +==== Detección de caras en vídeo ====
 +
 +<code python>
 +import cv2
 +import numpy as np
 +import matplotlib.pyplot as plt
 +%matplotlib inline
 +
 +# Capturamos vídeo de la primera fuente del PC
 +cap = cv2.VideoCapture(0)
 +
 +# Función de detección de imágenes
 +def detect_face(img):
 +    
 +    face_img = img.copy()
 +    
 +    face_rects = face_cascade.detectMultiScale(face_img)
 +    
 +    for (x,y,w,h) in face_rects:
 +        cv2.rectangle(face_img,(x,y),(x+w,y+h), (255,255,255), 10)
 +        
 +    return face_img
 +
 +while True:
 +
 +    ret, frame = cap.read(0)
 +    
 +    frame = detect_face(frame)
 +    
 +    cv2.imshow('Video Face Detector', frame)
 +    
 +    k = cv2.waitKey(1)
 +    
 +    if k == ord('q'):
 +        break
 +        
 +cap.release()
 +
 +cv2.destroyAllWindows()
 +</code>
 +
 +===== Seguimiento de objetos =====
 +
 +Técnicas:
 +
 +  * Optical Flow
 +  * MeanShift y CamShift
 +
 +==== Optical Flow ====
 +
 +Los métodos de OpenCV parten de un conjunto de puntos y un frame y luego intenta encontrar esos puntos en el siguiente frame.
 +
 +Dos algoritmos:
 +
 +  * Lucas-Kanade
 +  * Gunner Farneback: si queremos seguir todos los puntos de un vídeo.
 +
 +<code python>
 +cap = cv2.VideoCapture(0)
 +
 +ret, prev_frame = cap.read()
 +
 +# Primer frame
 +prev_gray = cv2.cvtColor(prev_frame, cv2.COLOR_BGR2RGB)
 +
 +# Puntos a seguir
 +prevPts = cv2.goodFeaturesToTrack(prev_gray, mask = None, **corner_track_params)
 +
 +mask = np.zeros_like(prev_frame)
 +
 +while True:
 +
 +    ret, frame = cap.read()
 +    
 +    frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
 +    
 +    # Calculamos el optical flow entre frames
 +    nextPts, status, err = cv2.calcOpticalFlowPyrLK(prev_gray, frame_gray, prevPts, None, **lk_params)
 +    
 +    good_new = nextPts[status == 1]
 +    good_prev = prevPts[status == 1]
 +    
 +    for i, (new, prev) in enumerate(zip(good_new, good_prev)):
 +        
 +        x_new, y_new = new.ravel()
 +        x_prev, y_prev = prev.ravel()
 +        
 +        mask = cv2.line(mask, (x_new, y_new), (x_prev, y_prev), (0,255,0),3)
 +        
 +        frame = cv2.circle(frame, (x_new, y_new), 8, (0,0,255), -1)
 +        
 +        
 +    img = csv2.add(frame, mask)
 +    cv2.imshow('tracking', img)
 +    
 +    k = cv2.waitKey(30) & 0xFF
 +    
 +    if k == ord('q'):
 +        break;
 +        
 +    prev_grey = frame_gray.copy()
 +    prevPts = good_new.reshape(-1, 1, 2)
 +
 +cv2.destroyAllWindows()
 +cap.release()
 </code> </code>
informatica/programacion/python/modulos/opencv.1607611061.txt.gz · Última modificación: por tempwin