Requisito previo: adición y combinación de imágenes usando OpenCV en Python
En este artículo, le mostraremos cómo combinar de manera efectiva dos videos. Pero para eso, primero veremos qué es Alpha Blending.
Mezcla alfa
La mezcla alfa es una combinación curva de dos tonos que tiene en cuenta los impactos de transparencia en las ilustraciones por computadora. La estimación de alfa en el código de color va de 0,0 a 1,0, donde 0,0 se refiere a un tono completamente transparente y 1,0 se refiere a un tono completamente oscuro. La estimación del color subsiguiente cuando el color Value1 con un valor alfa de Alpha se dibuja sobre una base de color Value0 viene dada por:
Value = Value0(1.0 - Alpha) + Value1(Alpha)
La parte alfa se puede usar para mezclar segmentos rojos, verdes y azules de manera similar, como en RGBA de 32 bits, o, de nuevo, se pueden determinar tres cualidades alfa relacionadas con cada uno de los tonos esenciales para el cambio de tono espectral.
Ahora, lo segundo que usaremos es OpenCV, que es una biblioteca de funciones de programación que se enfoca en la visión por computadora en tiempo real. Pero, antes de seguir adelante, tomaremos nota de algunas cosas.
Puntos importantes
Para que nuestro programa funcione perfectamente, debe asegurarse de:
- La resolución y la velocidad de fotogramas de los dos videos de entrada deben ser exactamente iguales (en el código, usa el formato 1920 × 1080, así que utilícelo solo; de lo contrario, debe configurar los valores ‘h’, ‘w’ de acuerdo con una resolución de su entrada videos que veremos más adelante en el código)
- El código está escrito teniendo en cuenta que la duración del video de fondo es ligeramente mayor o igual que la duración del video de primer plano, por lo que es preferible que haga lo mismo con sus videos de entrada de fondo y de primer plano; de lo contrario, debe hacerlo. asigne el valor «ret» al fondo en lugar del primer plano que veremos más adelante en el código
- Cambie el nombre de sus archivos de video con un nombre único porque a veces puede causar un error si hay dos archivos de video con el mismo nombre y la ruta de los dos archivos de video de entrada también debe proporcionarse con precisión.
- El video de primer plano debe ser una combinación de un fondo de color sólido (preferiblemente color negro) y con algún movimiento del sujeto sobre él.
Metodología
Tomaremos dos videos como entrada, uno será nuestro video de fondo y el segundo será nuestro video de primer plano. El trabajo principal es eliminar el fondo de color sólido de este video en primer plano para que nos quede solo el sujeto (del video en primer plano) con su fondo transparente. Después de hacer este cambio, el video de primer plano se colocará en el video de fondo, lo que dará la ilusión de un solo video con algún efecto, pero en realidad habrá dos videos combinados. Esta magia se hace con la ayuda de OpenCV y Python.
Enfoque paso a paso
- Importar módulos requeridos
- Agregue rutas y capture ambos videos de entrada.
- Repita cada cuadro de ambos videos y combínelos usando Alpha Blending .
- Reproduce el video de salida generado.
Implementación
Aporte:
Vídeo en primer plano
Vídeo de fondo
Tenga en cuenta que el video de primer plano contiene solo las partículas con un fondo negro sólido, por lo tanto, para obtener mejores resultados, es preferible tomar videos de primer plano y videos de fondo como estos.
Python3
# importing necessary packages import numpy as np import cv2 # assigning path of foreground video path_1 = r"C://Users//Lenovo//Desktop//Python Workshop//z.mp4" fg = cv2.VideoCapture(path_1) # assigning path of background video path_2 = r"C://Users//Lenovo//Desktop//Python Workshop//v.mp4" bg = cv2.VideoCapture(path_2) h, w = 1080, 1920 while True: # Reading the two input videos # we have taken "ret" here because the duration # of bg video is greater than fg video, ret, foreground = fg.read() # if in your case the situation is opposite # then take the "ret" for bg video _, background = bg.read() # if foreground array is not empty which # means actual video is still going on if ret: # creating the alpha mask alpha = np.zeros_like(foreground) gray = cv2.cvtColor(foreground, cv2.COLOR_BGR2GRAY) alpha[:, :, 0] = gray alpha[:, :, 1] = gray alpha[:, :, 2] = gray # converting uint8 to float type foreground = foreground.astype(float) background = background.astype(float) # normalizing the alpha mask inorder # to keep intensity between 0 and 1 alpha = alpha.astype(float)/255 # multiplying the foreground # with alpha matte foreground = cv2.multiply(alpha, foreground) # multiplying the background # with (1 - alpha) background = cv2.multiply(1.0 - alpha, background) # adding the masked foreground # and background together outImage = cv2.add(foreground, background) # resizing the masked output ims = cv2.resize(outImage, (980, 540)) # showing the masked output video cv2.imshow('Blended', ims/255) # if the user presses 'q' then the # program breaks from while loop if cv2.waitKey(1) & 0xFF == ord('q'): break # if the actual video is over then there's # nothing in the foreground array thus # breaking from the while loop else: break print('Video Blending is done perfectly')
Producción:
Observe que en este video de salida podemos ver que la arena se mueve en el aire en un área desértica calurosa, que en realidad es la salida combinada del video de partículas (usado como primer plano) y el video del desierto (usado como fondo). Además, siempre puede presionar «q» desde su teclado para romper el bucle y salir del programa.
Entonces, de esta manera, puede combinar dos videos y, si se hace correctamente, este método también puede proporcionar una apariencia de edición profesional.
Publicación traducida automáticamente
Artículo escrito por saranshsahgal y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA