Python OpenCV: flujo óptico denso

Requisitos previos: Python OpenCV , escala de grises

El flujo óptico es el movimiento de objetos entre fotogramas consecutivos de la secuencia, causado por el movimiento relativo entre la cámara y el objeto. Puede ser de dos tipos: flujo óptico disperso y flujo óptico denso.

Flujo óptico denso

El flujo óptico denso calcula el vector de flujo óptico para cada píxel del cuadro, lo que puede ser responsable de su baja velocidad, pero conduce a un resultado más preciso. Se puede usar para detectar movimiento en los videos, segmentación de video, estructura de aprendizaje a partir del movimiento. Puede haber varios tipos de implementaciones de flujo óptico denso. El siguiente ejemplo seguirá el método Farneback junto con OpenCV.

Método Franeback

El primer paso es que el método aproxima las ventanas de los cuadros de imagen mediante un polinomio cuadrático con la ayuda de la transformación de expansión polinomial. A continuación, observando cómo se transforma el polinomio bajo el estado de movimiento. es decir, para estimar campos de desplazamiento. Se calcula el flujo óptico denso, después de una serie de refinamientos.

Para la implementación de OpenCV, la magnitud y la dirección del flujo óptico de una array de canales 2D de vectores de flujo se calculan para el problema del flujo óptico. Se visualiza el ángulo (dirección) del flujo por tono y la distancia (magnitud) del flujo por el valor de la representación de color HSV. La fuerza de HSV siempre se establece en un máximo de 255 para una visibilidad óptima.
El método definido es caclopticalFlowFarneback() .

A continuación se muestra la implementación.

import cv2 as cv
import numpy as np
  
  
# The video feed is read in as
# a VideoCapture object
cap = cv.VideoCapture("videoplayback.mp4")
  
# ret = a boolean return value from
# getting the frame, first_frame = the
# first frame in the entire video sequence
ret, first_frame = cap.read()
  
# Converts frame to grayscale because we
# only need the luminance channel for
# detecting edges - less computationally 
# expensive
prev_gray = cv.cvtColor(first_frame, cv.COLOR_BGR2GRAY)
  
# Creates an image filled with zero
# intensities with the same dimensions 
# as the frame
mask = np.zeros_like(first_frame)
  
# Sets image saturation to maximum
mask[..., 1] = 255
  
while(cap.isOpened()):
      
    # ret = a boolean return value from getting
    # the frame, frame = the current frame being
    # projected in the video
    ret, frame = cap.read()
      
    # Opens a new window and displays the input
    # frame
    cv.imshow("input", frame)
      
    # Converts each frame to grayscale - we previously 
    # only converted the first frame to grayscale
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
      
    # Calculates dense optical flow by Farneback method
    flow = cv.calcOpticalFlowFarneback(prev_gray, gray, 
                                       None,
                                       0.5, 3, 15, 3, 5, 1.2, 0)
      
    # Computes the magnitude and angle of the 2D vectors
    magnitude, angle = cv.cartToPolar(flow[..., 0], flow[..., 1])
      
    # Sets image hue according to the optical flow 
    # direction
    mask[..., 0] = angle * 180 / np.pi / 2
      
    # Sets image value according to the optical flow
    # magnitude (normalized)
    mask[..., 2] = cv.normalize(magnitude, None, 0, 255, cv.NORM_MINMAX)
      
    # Converts HSV to RGB (BGR) color representation
    rgb = cv.cvtColor(mask, cv.COLOR_HSV2BGR)
      
    # Opens a new window and displays the output frame
    cv.imshow("dense optical flow", rgb)
      
    # Updates previous frame
    prev_gray = gray
      
    # Frames are read by intervals of 1 millisecond. The
    # programs breaks out of the while loop when the
    # user presses the 'q' key
    if cv.waitKey(1) & 0xFF == ord('q'):
        break
  
# The following frees up resources and
# closes all windows
cap.release()
cv.destroyAllWindows()

Producción

Publicación traducida automáticamente

Artículo escrito por rajatrathi y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *