cv2.flip y Efecto ESPEJO en Python – OpenCV
En este post vamos a realizar el efecto espejo sobre un video stream, y solo nos va a llevar 2 líneas de código, luego de la imagen de entrada y por supuesto antes de la visualización. Para ello usaremos la función cv2.flip, que nos permite voltear o invertir una imagen horizontalmente, verticalmente y ambas. En un principio debemos saber como trabaja esta función, así que vamos por ello.
cv2.flip
Esta función nos pide que especifiquemos:
- Imagen o array de entrada
- flipCode (que especificará como voltear la imagen)
NOTA: Según la documentación de OpenCV, esta función puede voltear la imagen de tres formas, dependiendo si flipCode es igual, mayor o menor a 0.
Para poder probar cv2.flip vamos a emplear la siguiente imagen:
cv2.flip(imagen,0): Invierte horizontalmente
import cv2 imagen = cv2.imread('ave.jpg') flip0 = cv2.flip(imagen,0) cv2.imshow('flip0',flip0) cv2.waitKey(0)
En la línea 1 importamos OpenCV, luego leemos la imagen con cv2.imread
. En la línea 4 estamos aplicando la función cv2.flip
, para ello se ha establecido un flipCode de 0. Veamos a continuación la imagen de entrada y la imagen luego de ser aplicada esta función:
cv2.flip(imagen,1): Invierte verticalmente
import cv2 imagen = cv2.imread('ave.jpg') flip1 = cv2.flip(imagen,1) cv2.imshow('flip1',flip1) cv2.waitKey(0)
El código es similar al anterior, pero esta vez en la línea 4 el flipCode es igual a 1. Veamos como se ve la imagen original y aquella almacenada en flip1
.
cv2.flip(imagen,-1): Invierte la imagen tanto vertical como horizontalmente
import cv2 imagen = cv2.imread('ave.jpg') flip_1 = cv2.flip(imagen,-1) cv2.imshow('flip_1',flip_1) cv2.waitKey(0)
Esta vez el flipCode será igual a -1. Veamos como se ve la imagen obtenida en flip_1
(derecha):
Efecto espero en video Streaming
Ahora que estamos familiarizados con esta función veamos como realizar un efecto de espejo.
import cv2 cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() if ret == False: break #print('frame.shape=', frame.shape) anchoMitad = frame.shape[1] // 2 frame[:,:anchoMitad] = cv2.flip(frame[:,anchoMitad:],1) cv2.imshow('Frame',frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()
En esta ocasión explicaré las líneas 8 a la 11, ya que el resto del código ya lo he explicado más detalladamente en el post: Capturar, guardar y leer un video en OpenCV y Python
Línea 8: Aquí nos ayudamos de shape
para conocer el alto, ancho y número de canales de la imagen. Esta línea la utilicé para asegurarme de la posición en la que se encuentra el ancho de la imagen que utilizaré a continuación para dividir la imagen a la mitad y poder mostrar el efecto espejo.
Línea 9: Dado que se necesita encontrar la mitad del ancho, empleamos frame.shape[1] // 2
(utilicé //
ya que necesitamos que el resultado sea un entero).
Línea 10: Esta línea nos ayudará a reemplazar la imagen de la mitad a la izquierda, por lo que tenemos de la mitad a la derecha y es aquí donde aplicamos la función cv2.flip para invertir verticalmente usando un flipCode=1.
Veamos el resultado final (se reproducirá en el minuto 3:19):
Como has visto, este ha sido un procedimiento sencillo que además nos ayuda a darnos cuenta como funciona cv2.flip. Por ello, a continuación te dejo las infografías que he realizado en cuanto a esta función. Nos vemos en un siguiente post.
Hola, me sirvió mucho, pero no puedo hacer que en ves de mi cámara normal lo haga con otra que e puesto, me refiero a que se inicie la segunda cámara en vez de la primera
Hola Jorge, intenta cambiar el argumento de cv2.VideoCapture, en vez de 0 por 1 por ejemplo, para que elija la otra cámara.
Puedes probar con 2 también.
Enhorabuena por el blog! como se podria hacer para no partir la imagen? es decir, doblar el ancho de la imagen y asi hacer un espejo sin perder ni un pixel.
He intentado doblar los pixeles con la funcion que ensenyas anteriormente de recortar…. pero quiza solo funcione para recortar y no para anadir tambien pixeles.
Un saludo y gracias!