CONTENIDO
- Capturar un video
- Leer un video
- Guardar un video
En el post anterior vimos como cargar una imagen, visualizarla y guardar una nueva, pero ahora es tiempo de adentrarnos a la secuencia de imágenes, es decir a un video. A continuación podrás aprender como capturar, leer y guardar un video a usando Python y OpenCV. Así que ¡menos palabras y más programación!.
CAPTURAR UN VIDEO (REALIZAR UN VIDEO STREAMING)
Para poder realizar esta acción necesitaremos el siguiente código (si te parece un poco confuso, ¡tranquilidad!, te explico cada línea abajo).
import cv2 captura = cv2.VideoCapture(0) while (captura.isOpened()): ret, imagen = captura.read() if ret == True: cv2.imshow('video', imagen) if cv2.waitKey(1) & 0xFF == ord('s'): break else: break captura.release() cv2.destroyAllWindows()
Empezamos a desglosar el programa:
Línea 1: Importar OpenCV con import cv2
Línea 3: Asignamos a una variable (para hacer más sencillo el proceso, y no tener que escribir en cada momento la función) cv2.VideoCapture(0)
, la cual nos permitirá iniciar el proceso de captura del video.
El número dentro de los paréntesis indica que cámara se usa para la captura, si se tiene una cámara conectada se puede colocar 0 o -1. En el caso de que hubiese más cámaras conectadas y se deseara trabajar alguna de ellas se tendría que especificar con cual, 1, 2 o 3, por ejemplo.
Línea 4: Aquí tenemos la estructura de repetición while, la cual será infinita mientras se esté capturando el video hasta que sea presionada una tecla como veremos a continuación.
Línea 5: La función .read()
, en este caso captura.read()
, desempaqueta dos valores, el primero es una variable booleana, y el segundo la imagen en sí. A continuación brevemente las dos variables obtenidas en este programa:
ret: Esta variable booleana es True cuando SÍ se ha capturado una imagen, mientras que es False cuando NO se ha capturado una imagen con la cual trabajar.
imagen: En sí es la imagen con la cual se puede trabajar.
Línea 6: Este condicionante: if ret == True
, nos permite seguir si es que existe una imagen capturada, también se podría comparar con False, y aplicar break
, en caso que no se tenga la imagen.
Línea 7: Aquí se procede a visualizar la imagen, como lo vimos en el anterior post.
Línea 8: Este condicionante va a permitir salir del programa o terminar la visualización, hasta que sea presionada la tecla s. Se añade & 0xFF
, cuando la máquina en la que se está realizando el programa es de 64 bits.
Línea 9: Si durante la ejecución del programa se ha presionado la tecla s, entonces se activa break
, y sale del while.
Línea 10: Este esle
corresponde con el if
de la línea 6, y sale del proceso con break
.
Línea 11: Se libera la captura del video.
Línea 12: Se cierran las ventanas abiertas de la visualización.
GUARDAR UN VIDEO
Para grabar un video y guardarlo necesitamos de un programa similar al previo, veamos:
import cv2 captura = cv2.VideoCapture(0) salida = cv2.VideoWriter('videoSalida.avi',cv2.VideoWriter_fourcc(*'XVID'),20.0,(640,480)) while (captura.isOpened()): ret, imagen = captura.read() if ret == True: cv2.imshow('video', imagen) salida.write(imagen) if cv2.waitKey(1) & 0xFF == ord('s'): break else: break captura.release() salida.release() cv2.destroyAllWindows()
Analicemos las líneas nuevas:
Línea 4: Para grabar un video necesitamos de la función cv2.VideoWriter
, en ella especificamos el nombre del video con el que se guarda el video seguido de su extensión, el segundo argumento es el codec del video (si quieres más información puedes buscar en los docs de OpenCV). Como tercer argumento se indica el número de fps (frames per second / fotogramas por minuto), y finalmente se especifica el tamaño de los fotogramas (640,480)
, 640 pixeles de ancho y 480 de alto.
Línea 10: Dentro de los paréntesis de la función salida.write
, especificamos la imagen o fotograma que queremos que se almacene.
Línea 15: Se indica que la grabación finalice.
LEER UN VIDEO
El programa necesario para realizar la lectura de un video, es similar al de realizar un video stream, como vimos en primer lugar, ¿Quieres saber cuál es la diferencia?
import cv2 captura = cv2.VideoCapture('videoSalida.avi') while (captura.isOpened()): ret, imagen = captura.read() if ret == True: cv2.imshow('video', imagen) if cv2.waitKey(30) == ord('s'): break else: break captura.release() cv2.destroyAllWindows()
Línea 3: En vez de especificar el número de cámara que se utilizaba en el caso de realizar un video streaming, aquí lo que se hace es simplemente especificar entre comillas el nombre del video junto a su extensión. Recuerda que si el video está en una localización diferente a de tu programa, será necesario indicar toda la dirección.
NOTA: Pudiste haber notado que en cv2.waitKey
, se especificó 30 y no 1 como hemos visto hasta el momento. Con 30 el video se aprecia mejor con respecto a la velocidad del mismo. Por el contrario con 1, puede que tu video pase considerablemente rápido, esto es debido a que OpenCV quiere realizar el proceso lo más rápido posible sin importar el fps original del video.
Esto fue todo por este post, recuerda que puedes complementar la información con los videos de mi canal. Recuerda que podemos seguir aprendiendo juntos.
Hola esta muy bien lo explicado en el video y en la pagina, pero en mi caso necesito exportar más de un solo video por ejemplo desde el frame 1 al 38 y despues desde el frame 48 al 200. Me puedes dar una idea de como hacerlo xq de la manera q lo he echo siempre me exporta uno el primero.
Hola Darián, usa distintas variables para asignar al video que deseas guardar (salida1=cv2.VideoWriter…, salida2=cv2.VideoWriter….), y luego utiliza esas dos variables para almacenar los fotogramas (salida1.write(imagen1), salida2.write(imagen2)) y de igual manera para finalizar la grabación (salida1.release(),salida2.release()).
Muchas gracias me fue útil. Otra pregunta que queria hacerte es la siguiente con la variable de VideoCapture una vez q entro en el ciclo while para poder cargar imagen por imagen y reproducirlas o guardarlas como un video nuevo, tengo un problema y es que no me empieza la variable VideoCapture desde el primer frame. Como puedo hacer para que una vez q recorra toda la variable VideoCapture si quiero volver a recorrerla me empiece por el primer frame nuevamente ?. Es para un proyecto de tesis soy estudiante de la Universidad de Ciencias Informaticas de Cuba. Saludos y gracias de antemano
Me alegra mucho que te haya servido 🙂 Según tengo entendido, cuando se está capturando un video, la cámara debe tener un tiempo para que pueda encenderse y funcionar correctamente, ya que en un principio puede mostrar imágenes más oscuras.
Yo no trabajo directamente con la cámara sino con videos. También funciona de esa manera para esos videos ??
Dependería de los videos con los que estés trabajando. Lo que si OpenCV trata de realizar procesos lo más rápido posible, puede que en ese sentido se tenga la sensación que vaya muy rápido y no se alcance a apreciar los primeros fotogramas. Prueba haciendo que el procesamiento vaya más lento, en cv2.waitKey(1), reemplaza «1» con un valor más grande (por ejemplo 30), para que puedas apreciar el proceso de forma más lenta y puedas ver los fotogramas que va leyendo poco a poco.
hola gracias por tus aportes, sigo tu canal de youtube y he aprendido mucho, estoy realizando un proyecto con opencv, raspeberry, raspicam y qtcreator, por lo pronto solo capturar vídeo y reproducirlo fuera de raspebrry, pero cuando quiero visualizar el vídeo en algún reproductor como vlc, movimaker, etc este se ve en cámara lenta, existe alguna modificación para que esto no pase?? gracias
un error – menciono que este se ve en cámara lenta, pero NO es así el vídeo se reproduce en cámara rápida
Hola que tal, espero que te encuentres bien de salud, y primero que nada quiero felicitarte por tus vídeos la verdad que son muy buenas, siento que la pandemia no me esta afectando sigo aprendiendo muchas cosas atraves de ti, bueno mi unica duda o pregunta es como se formularia el codigo cuando se quiere usar una camara con ip para ser mas especifico una ESP32-cam, lo probé con «cv2.VideoCapture(url)» , con la url adentro del parentesis pero al ejecutar el programa solo hace un parpadeo y mi duda es aque se debe??? de antemano gracias
Hola Miguel, muchas gracias eres muy amable! Anteriormente probé leer un video streaming con una cámara IP, este fue el código que me ayudó: https://stackoverflow.com/questions/49978705/access-ip-camera-in-python-opencv
Solo tuve que modificar el argumento de cv2.VideoCapture, y lo demás queda igual al programa para leer un video.
Saludos cordiales, deliz día. Desde ya quiero felicitarte por la elaboración de tus videos, por la claridad y alto contenido informativo, explicativo.
Te molesto en esta ocación para preguntarte como se hace para mostrar un video un un tamaño determinado, o poder modificar la ventana del video con el uso del mouse.
Muchas gracias por tu amable atención.
Hola Gustavo, muchas gracias por valorar el contenido que realizo, de verdad me alegra mucho que te guste. Te cuento que para redimensionar una imagen o los fotogramas de un video suelo utilizar imutils ( https://www.youtube.com/watch?v=iI35ZTe5b3g&feature=youtu.be ), esta librería permite respetar la relación de aspecto de la imagen, redimensionándola según un algo o ancho. Si necesitas redimensionar la ventana de visualización puedes darle un vistazo a esta función: https://docs.opencv.org/master/d7/dfc/group__highgui.html#ga9e80e080f7ef33f897e415358aee7f7e
Espero que ya información sea de ayuda. Saludos!
Saludos cordiales, solucione lo que le pedia anteriormente, le dejo el código, (indicado con un comentario la linea que se agrego) por si a alguien le llega a interesar.
Se reduce la imagen a un tamaño especifico, más no he logrado poder hacerlo libremente con el cursor en la ventana del video, se agradece si le puede dar solución a este último planteamiento. Gracias.
import cv2
captura = cv2.VideoCapture(‘Video_de_prueba.mp4’)
while (captura.isOpened()):
ret, imagen = captura.read()
imagen = cv2.resize(imagen, (240, 224)) # linea agregada
if ret == True:
cv2.imshow(‘video’, imagen)
if cv2.waitKey(30) == ord(‘s’):
break
else: break
captura.release()
cv2.destroyAllWindows()
Hola , una pregunta , como haría para capturar una cámara pero no la mía, si no de https://www.skylinewebcams.com/
e incluirla al codigo .
buenas amiga una pregunta yo he usado tu código para activar la cámara pero no me funciona si me corre el programa pero no sale la nada me podrías ayudar me sale solo esto
========== RESTART: C:\Users\MARCO\Desktop\opencv con python\camara.py =========
================================ RESTART: Shell ================================
>>>
¡Muchas Gracias!
Con tus tutoriales, pude realizar mi proyecto de titulación y hoy nuevamente recurro para un proyecto en mi trabajo. Haces una gran contribución. !Sigue asi¡
Muchas gracias Andrés a ti!. Qué alegría que te hayan sido útiles en ese entonces y ahora. 🙂 Un abrazo.
Hola OMES quiero compartir una solución que me ha sido util ya que he tenido un inconveniente al guardar el videoSalida.avi:
Me guardaba el archivo.avi pero se guardaba mal ya que al reproducirlo se mostraba vacío, y a resultado de ello al momento de leerlo no pasaba nada.
Cambie esta línea exactamente al definir el fps y el size:
salida = cv2.VideoWriter(‘videoSalida.avi’,cv2.VideoWriter_fourcc(*’XVID’),20.0,(640,480))
Por lo siguiente:
# Establecer el número de fotogramas por segundo
fps = captura.get(cv2.CAP_PROP_FPS)
# Obtenga el tamaño del video
size = (int(captura.get(cv2.CAP_PROP_FRAME_WIDTH)),int(captura.get(cv2.CAP_PROP_FRAME_HEIGHT)))
# Genera un archivo de video vacío
# salida = cv2.VideoWriter(‘videoSalida.avi’, cv2.VideoWriter_fourcc(*’XVID’), fps, size)
Dato: No se si tenga que ver el sistema Operativo donde ejecutes el programa, ya que yo lo hize en Ubuntu 20.04. Use python3 y openCv 4.2.0
Espero a alguien le sea de ayuda.
Saludos Omesitos.
Muchas gracias Deyvisnvg! 🙂
Deyvisnvg,
Muchísimas gracias, te lo agradezco infinitamente, llevaba dos días con este problema (usando una camara ip) y no lograba resolver el problema aunque tampoco me marcaba error, solo aparecía el video con mensaje de error y 0KB.
Abrazos Devysing! Felicitaciones y Fanfarrias de mi parte! me faltan palabras para agradecerte! Gracias por COMPARTIR!
Muchisimas gracias por el aporte. Otra persona a la que haz ayudado y te lo agrace mucho.
Saludos desde Argentina.
Hola Gaby, una consulta ¿se pueden guardar el video y el video de sustracción de fondo al mismo tiempo?
Hola Abel, si necesitas almacenar dos visualizaciones, puedes concatenarlas como en este tutorial: https://youtu.be/Lh-bqvcAhfM Y de este modo, el resultado de esta concatenación puedes generar el video.
gracias por compartirnos tus conocimientos, sigue adelante.
quisiera consultarte, como hago para usar la Pi Camera v2 con este programa?
Hola Cristhian, muchas gracias. La última vez usé la raspberry pi con una Pi Camera, usé el mismo código que como si usara una webcam usb. Leyendo un videostreaming por ejemplo con cv2.VideoCapture.
Hola gracias por los tutoriales, El código ejecuta bien mis videos MP4 pero SIN sonido. A que se debe, que hago???
Hola Sergio, es debido a que OpenCV se encarga de procesamiento de imágenes y no del sonido del video.
Hola gracias por los tutoriales, El código ejecuta bien mis videos MP4 pero SIN sonido. A que se debe, que hago ???
Disculpa, sabes como redimensionar un video si este sale demasiado grande?
Y como saber cuanto mide de ancho y alto cada frame de video?
Hola Maty, puedes encontrar la información que necesitas en este video: https://www.youtube.com/watch?v=iI35ZTe5b3g 🙂
Primero de todo felicidades, generas un contenido fantástico.
Lo que te quiero preguntar es cómo guardarías los datos (x, y, w o y) en un documento de manera que se puedan trabajar con excel. Sea directamente en un excel o en un .csv separado por ;
Yo no lo estoy consiguiendo :/
Yo tengo algo así, pero w (ancho de rectangulo) no me varía
ExcelWorkbook = xlsxwriter.Workbook(«DadesVideo.xlsx»)
Excelsheet = ExcelWorkbook.add_worksheet()
Excelsheet.write(«A1», «Amplada»)
…
LlargadaVideo = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
for i in range(LlargadaVideo):
Excelsheet.write(i+1, 0, w)
…
ExcelWorkbook.close()
Gracias de antemano.
Hola Marc, puedes usar lo que describe este post: https://programminghistorian.org/es/lecciones/trabajar-con-archivos-de-texto
Gracias por tu contribucion desinteresada. En el siguiente enlace: https://www.youtube.com/watch?v=pyjKE4p1S78 esta un video que se reproduce en forma normal, pero cuando cuando lo abro desde python con opencv la imagen sale por encima de la imagen real, es decir es como si el lente de la camara estuviese enfocando hacia arriba. Cual puede ser el problema?
Hola Marco, puede que sean las dimensiones del video de entrada, este puede ser muy grande por lo que podrías redimensionarlo.
y como hacer lo mismo pero con un video con fondo verde? cambiarle el fondo por una imagen
Hola Jorge, puedes realizar algo como lo de este video: https://youtu.be/ae8VjfE5Vko
Gaby
Me uno a las diversas felicitaciones que recibes por tu tutoriales tan didácticos y entendibles para principiantes como yo.
Quería preguntarte lo siguiente: Cómo hago para leer un video y que se reproduzca también la música que viene con ese video. Porque sigo tu código y se reproduce el video bien, pero no la música.
Muy amable por tu respuesta, apenas puedas.
Muchas gracias por tus aportes me han servido bastante y los entiendo muy bien. solamente que tengo una duda, si quiero tomar un numero X de fotos en un lapso de 15 segundos con videocapture sin necesidad de estar dando clicks para que tome cada foto como podria hacerlo, es decir que tome una rafaga de fotos de manera automatica. te agradeceria mucho si me pudieras explicar como hacerlo.
Gabriela
Te felicito por tu gran aporte a la comunidad OpenCv
Tengo una inquietud: Corro este código que tienes acá y se reproduce bien el video sin problema pero sin sonidooooo.
Cómo hago para que se oiga la música asociada al video.?
Me podrías orientar por favor, Mil gracias de antemano y fuerte abrazo fraterno desde Colombia
Hola quiero primeramente felicitarte por tus aportes y el conocimiento que nos compartes, quiero consultarte ya que tu tienes más experiencia en la utilización de OpenCV, tengo un proyecto donde necesito capturar el video que es trasmitido por medio de un capturador USB, pero el proyecto está en un VPS y haciendo unas pruebas pude observar que no funciono la captura ya que no encontró nada que transmitir, mi pregunta es como o cuál debería ser mi arquitectura de aplicación para que funcione. tengo que construir una aplicación de manera local para capture y envíe el video a la aplicación en django en el VPS
Hola como estan? muchas gracias por tus videos, son intuitivos, faciles de entender y de seguir los pasos con tus explicaciones.
Consulta, por casualidad has realizado algun video o podrias mencionarme como abrir un video de youtube que esta transmitiendo constantemente en vivo con opencv? se puede? quise utilizar la libreria pafy, pero con resultados negativos :-(, desde ya muchas gracias.
hola, omes. Me podrías ayudar, estuvo explorando tu pagina y la mayoría son para videos, me gustaría que me enseñaras pero para tomar fotos, que códigos utilizarías