En este post explico como acceder a la webCam, reproducir y guardar un video usando la biblioteca openCV. También puedes ver el video relacionado con este tema en YouTube.
Acceder a la webCam con python y openCV
El siguiente programa describe como mostrar el contenido de la webCam, también aplica para cámaras externas, pero se debe modificar el valor en cv2.VideoCapture()
de acuerdo al puerto donde se conecte la cámara puede ser 1,-1 ,2 ,0, etc.
import cv2
, importar biblioteca openCVcapture = cv2.VideoCapture(0)
, crear un objetocapture
deVideoCapture(0)
- Tiene como argumento
0
para leer la webCam. También recibe valores como -1, 1, 2, etc si se conecta en otros puertos la cámara.
- Tiene como argumento
while (capture.isOpened()):
capture.isOpened()
DevuelveTrue
si la captura de video ya se ha inicializado.
ret, frame = capture.read()
, usa el objetocapture
para leer la información de la webCamframe
información del video frame por frameret
valor booleanoTRUE
siframe
es leído correctamente
if (cv2.waitKey(1) == ord('s')):
, sentencia if compara dos valores, si se cumple la condición termina el bucle.cv2.waitKey(1)
, si una tecla es presionada, regresa un valor de acuerdo al código ascii, mientras no se presione una tecla devuelve el valor de-1
ord('s')
la función ord recibe un caracter y devuelve un valor que representa a ese caracter.- La condición queda de la siguiente manera:
(cv2.waitKey(1) == ord('s'))
–>1110011 == 01110011
(Cuando se cuple, sale del bucle)
Usar
para cerrar el dispositivo de captura..realese
cv2.destroyAllWindows()
cerrar todas las ventanas
import cv2
capture = cv2.VideoCapture(0)
while (capture.isOpened()):
ret, frame = capture.read()
cv2.imshow('webCam',frame)
if (cv2.waitKey(1) == ord('s')):
break
capture.release()
cv2.destroyAllWindows()
Nota: En este ejemplo uso (cv2.waitKey(1) == ord('s'))
para salir del bucle. Algunos autores usan ((cv2.waitKey(1) & 0xFF) == ord('s'))
y en la siguiente sección explico el funcionamiento de esta sentencia.
Cómo funciona (cv2.waitKey(1) & 0xFF) == ord(‘s’)
En algunos post de la documentacion oficial de openCV se usa cv2.waitKey(1) & 0xFF
para salir del bulce, esta sentencia es una comparación entre dos valores igual que el ejemplo anterior pero añade 0xFF
.
if ((cv2.waitKey(1) & 0xFF) == ord('s'))
- (
cv2.waitKey(1) & 0xFF)
con&
realiza una operación ‘and’ de bit a bit (No confundir conAND
que realiza operacionesbooleanas
). Dependiendo de la tecla que se presionecv2.waitKey(1)
devolverá un entero- Si presionamos la tecla
s
en código ascii es115
y en binario1110011
. - Y
0xFF
se representa en binario así11111111
- Si presionamos la tecla
- La operación
&
de bit a bit queda de la siguiente manera si se presiona la letras
((cv2.waitKey(1) & 0xFF) == ord('s'))
((01110011 & 11111111) == 01110011)
1110011 == 01110011
- La condición se cumple y sale del bucle
Guardar un video con Python y openCV
Para guardar el video se debe agregar un objeto salida
de VideoWriter
y ahí establecer las características del video, así:
salida = cv2.VideoWriter('webCam.avi', cv2.VideoWriter_fourcc(*'XVID'), 10, (640,480))
También se usa el método .write
para poner cada frame en el video que se esta guardando.
salida.write(frame)
A continuación se describe el código que guarda un video desde la webCam
import cv2
capture = cv2.VideoCapture(0)
#objeto salida, contiene los parámetros para crear el video
salida = cv2.VideoWriter('webCam.avi', cv2.VideoWriter_fourcc(*'XVID'), 10, (640,480))
while (True):
ret, frame = capture.read()
cv2.imshow('frame',frame)
#Usar write para GUARDAR el video
salida.write(frame)
if (cv2.waitKey(1) == ord('s')):
break
salida.release()
capture.release()
cv2.destroyAllWindows()
Reproducir un video con python y openCV
El código para reproducir un video desde un directorio es similar al anterior, pero en lugar de colocar un valor como 0
en VideoCapture
, se debe asignar el nombre del video 'gato.avi'
(si se encuentra en la misma carpeta que el programa) o colocar la dirección en donde el video se encuentre. También se añade un bucle if (ret == True)
porque en algún momento el video se terminará y sin esta condición obtendremos un error porque no encontrará un frame que mostrar al final.
- Iportar la biblioteca openCV
capture = cv2.VideoCapture('gato.avi')
, crear un objetocapture
deVideoCapture(0)
- Tiene como argumento entre comillas el nombre del video. También se puede usar el path del video
cv2.VideoCapture('/home/noemi/Escritorio/reproducir_Videos/gato.avi')
- Tiene como argumento entre comillas el nombre del video. También se puede usar el path del video
while (capture.isOpened()):
capture.isOpened()
DevuelveTrue
si la captura de video ya se ha inicializado.
ret, frame = capture.read()
, usa el objetocapture
para leer la información de la webCamframe
información del video frame por frameret
valor booleanoTRUE
si elframe
es leído correctamente
if (ret == True)
, siret
esTrue
ejecutará lo que este dentro de la sentenciaif
.if (cv2.waitKey(30) == ord('s')):
, sentencia if compara dos valores, si se cumple la condición termina el bucle.cv2.waitKey(30)
, si una tecla es presionada, regresa un valor de acuerdo al código ascii, mientras no se presione una tecla devuelve-1
. Nota: algunos videos pueden reproducirse mas rápido o mas lento de acuerdo a las características como el bitrate, openCV tratará de reproducir el archivo rápido, para modificar eso se puede variar el valor decv2.waitKey(30)
ord('s')
la función ord recibe un caracter y devuelve un valor que representa a ese caracter.- La condición queda de la siguiente manera cuando se presiona la tecla
s
:(cv2.waitKey(1) == ord('s'))
–>01110011 == 01110011
capture.
para cerrar el dispositivo de captura.realese
cv2.destroyAllWindows()
cerrar todas las ventanas
import cv2
capture = cv2.VideoCapture('gato.avi')
while (capture.isOpened()):
ret, frame = capture.read()
if (ret == True):
cv2.imshow("Gato", frame)
if (cv2.waitKey(30) == ord('s')):
break
else:
break
capture.release()
cv2.destroyAllWindows()
A continuación dejo algunos post que usan el código para acceder a la webCam
Pingback: Guardar frames cada cierto tiempo con Python – openCV – Kipuna Ec
Pingback: No sobreescribir texto en una imagen en Python y openCV - Kipuna Ec
Pingback: Detector de bordes Canny con Python y OpenCV - Kipuna Ec