¿Alguna vez has visto la capa invisible de Harry Potter? ¿Fue maravilloso? ¿Alguna vez has querido usar esa capa? ¡¡En caso afirmativo!! luego, en esta publicación, construiremos la misma capa que usa Harry Potter para volverse invisible. Sí, no lo estamos construyendo de una manera real, pero se trata de trucos gráficos.
En esta publicación, aprenderemos cómo crear nuestra propia ‘capa de invisibilidad’ utilizando técnicas simples de visión por computadora en OpenCV . Aquí hemos escrito este código en Python porque proporciona una biblioteca exhaustiva y suficiente para construir este programa.
Aquí, crearemos esta experiencia mágica utilizando una técnica de procesamiento de imágenes llamada detección y segmentación de color . Para ejecutar este código, necesita un video mp4 llamado » video.mp4
«. Debe tener una tela del mismo color y ningún otro color debe ser visible en esa tela. Estamos tomando la tela roja. Si está tomando alguna otra tela, el código seguirá siendo el mismo pero con cambios mínimos.
¿Por qué rojo? ¿El verde es mi favorito?
Claro, podríamos haber usado el verde, ¿no es el rojo el color del mago? Bromas aparte, los colores como el verde o el azul también funcionarán bien con algunos cambios en el código.
Esta técnica es opuesta al Green Screening . En la pantalla verde, eliminamos el fondo, pero aquí eliminaremos el marco de primer plano. Así que comencemos nuestro código.
Algoritmo:
1. Capture y almacene el marco de fondo [Esto se hará durante algunos segundos]
2. Detecte la tela de color rojo usando el algoritmo de segmentación y detección de color.
3. Segmente la tela de color rojo generando una máscara. [usado en el código]
4. Genere la salida aumentada final para crear un efecto mágico. [ vídeo.mp4 ]
A continuación se muestra el código:
import cv2 import numpy as np import time # replace the red pixels ( or undesired area ) with # background pixels to generate the invisibility feature. ## 1. Hue: This channel encodes color information. Hue can be # thought of an angle where 0 degree corresponds to the red color, # 120 degrees corresponds to the green color, and 240 degrees # corresponds to the blue color. ## 2. Saturation: This channel encodes the intensity/purity of color. # For example, pink is less saturated than red. ## 3. Value: This channel encodes the brightness of color. # Shading and gloss components of an image appear in this # channel reading the videocapture video # in order to check the cv2 version print(cv2.__version__) # taking video.mp4 as input. # Make your path according to your needs capture_video = cv2.VideoCapture("video.mp4") # give the camera to warm up time.sleep(1) count = 0 background = 0 # capturing the background in range of 60 # you should have video that have some seconds # dedicated to background frame so that it # could easily save the background image for i in range(60): return_val, background = capture_video.read() if return_val == False : continue background = np.flip(background, axis = 1) # flipping of the frame # we are reading from video while (capture_video.isOpened()): return_val, img = capture_video.read() if not return_val : break count = count + 1 img = np.flip(img, axis = 1) # convert the image - BGR to HSV # as we focused on detection of red color # converting BGR to HSV for better # detection or you can convert it to gray hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) #-------------------------------------BLOCK----------------------------# # ranges should be carefully chosen # setting the lower and upper range for mask1 lower_red = np.array([100, 40, 40]) upper_red = np.array([100, 255, 255]) mask1 = cv2.inRange(hsv, lower_red, upper_red) # setting the lower and upper range for mask2 lower_red = np.array([155, 40, 40]) upper_red = np.array([180, 255, 255]) mask2 = cv2.inRange(hsv, lower_red, upper_red) #----------------------------------------------------------------------# # the above block of code could be replaced with # some other code depending upon the color of your cloth mask1 = mask1 + mask2 # Refining the mask corresponding to the detected red color mask1 = cv2.morphologyEx(mask1, cv2.MORPH_OPEN, np.ones((3, 3), np.uint8), iterations = 2) mask1 = cv2.dilate(mask1, np.ones((3, 3), np.uint8), iterations = 1) mask2 = cv2.bitwise_not(mask1) # Generating the final output res1 = cv2.bitwise_and(background, background, mask = mask1) res2 = cv2.bitwise_and(img, img, mask = mask2) final_output = cv2.addWeighted(res1, 1, res2, 1, 0) cv2.imshow("INVISIBLE MAN", final_output) k = cv2.waitKey(10) if k == 27: break
Producción:
Puede verificar el código fuente en el repositorio del proyecto github, para ingresar videos y más detalles, aquí
Referencia: http://datasciencenthusiast.com/?p=71
Publicación traducida automáticamente
Artículo escrito por Vidhayak_Chacha y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA