cv2.flip y Efecto ESPEJO en Python – OpenCV

Por Administrador

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