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