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:45] – [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 842: Línea 855:
  
 <code python> <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 # Utilizamos otro clasificador
 eye_cascade = cv2.CascadeClassifier("../101/DATA/haarcascades/haarcascade_eye.xml") eye_cascade = cv2.CascadeClassifier("../101/DATA/haarcascades/haarcascade_eye.xml")
Línea 853: Línea 873:
    
     # El método anterior devuelve un objeto que utilizaremos     # El método anterior devuelve un objeto que utilizaremos
-    # para dibujar un rectángulo alrededor de la cara+    # para dibujar un rectángulo alrededor de los ojos
     for (x,y,w,h) in eyes_rects:     for (x,y,w,h) in eyes_rects:
         cv2.rectangle(face_img,(x,y),(x+w,y+h), (255,255,255), 10)         cv2.rectangle(face_img,(x,y),(x+w,y+h), (255,255,255), 10)
Línea 862: Línea 882:
  
 plt.imshow(result, cmap='gray') 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.1607611547.txt.gz · Última modificación: por tempwin