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:

Figura 1: Imagen de entrada
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:

Figura 2: Izq. Imagen de entrada. Der. Imagen aplicada cv2.flip con flipCode=0
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.

Figura 3: Izq. Imagen de entrada. Der. Imagen aplicada cv2.flip con flipCode=1
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):

Figura 4: Izq. Imagen de entrada. Der. Imagen aplicada cv2.flip con flipCode=-1
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.
#infoOmes






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!