2 de enero de 2011

Reproducir un video

Espero que la entrada anterior halla quedado completamente clara y se halla entendido como poder mostrar una imagen en python usando OpenCV. Los ejemplos que vienen con las librerias son una buena fuente de informacion para ver como funcionan en conjuntos con python, sin embargo algunos ejemplo son bastante complicados por lo que es bueno comenzar desde lo basico y asi poder entender ejemplo complejos mas adelante.

En esta entrada, el objetivo es realizar un programa que muestre un video en una ventana, la verdad no es algo muy complicado pero es necesario si queremos llegar a hacer algo mas complejo.

Primero tenemos que tener en cuenta si queremos obtener el video desde una camara o desde un archivo de video, aqui lo haremos de las dos formas

Resultado: 






Codigo:


Como vemos aparecen cosas nuevas y algunas aparecian en el ejemplo para mostrar una imagen, vamos a explicar las lineas que no habian aparecido antes.

capture= cv.CaptureFromCAM(1) - esta funcion sirve para capturar un video desde una camara, en este punto es bueno saber que un video no es mas sino una sucesion de imagenes. el argumento que le pasamos indica el indice de la camara que vamos a usar, y el video se va guardando en la variable capture.

#capture=cv.CreateFileCapture("C:\\parche.avi") - esta linea es un comentario, ya que, o capturamos el video desde la camara o capturamos el video desde un archivo. Al igual que con la imagen debemos especificar la ruta del archivo

while True:
    img = cv.QueryFrame(capture)
    cv.ShowImage("camera", img)
    if cv.WaitKey(30) == 27:
        break

 
Como un video es una sucesion de imagenes, debemos hacer un ciclo eterno que muestre una imagen cada tiempo determinado. la funcion cv.QueryFrame muestra el frame actual en el que esta el video y lo pone en la variable img despues hacemos lo mismo que en el ejemplo de mostrar fotos en el que usamos la funcion ShowImage y seleccionamos la ventana ya creada.

como tenemos que poner un tiempo para mostrar cada foto, usamos la funcion  cv.WaitKey en este caso le pasamos como argumento el valor 30, para mostrar la imagen cada 30ms, la funcion espera el tiempo que se le pasa como argumento para que se presione una tecla. Cuando se presiona una tecla la funcion toma el valor ASCII de la tecla que se presiono, en este ejemplo pregunto mediante un if cuando la funcion WaitKey tenga el valor 27 que corresponde a la tecla esc, rompe el ciclo while por medio de la instruccion break y se termina el programa

Aqui termina la entrada de este ejemplo, espero que halla quedado lo suficientemente claro, cualquier duda o comentario sera bien recibido.

Hasta luego

7 comentarios:

  1. Notar que en Linux, el numero de las cámaras comienzan en 0 y no en 1 (según el numero de cámaras conectadas, claro está).

    captura=cv.CaptureFromCAM(0)

    Linux usa V4L para capturar imágenes, por lo que una WebCam, una capturadora de tv, etc, es posible capturarlo desde ahí.

    ResponderEliminar
  2. Gracias por tu comentario. No sabia lo del indice en linux...

    ResponderEliminar
  3. gracias por el tuto amigo en el codigo de python para capturar de archivo la orden es
    capture=cv.CaptureFromFile("C:\\parche.avi")
    o asi fue que a mi me funciono

    saludos

    ResponderEliminar
  4. Rafael; pude acceder a la camara web, pero no puedo abrir el archivo avi. probe con distintos videos de distintas duraciones y nada...use capurefromfile y createfilecapture y nada, se cierra de una..Agregaste agun codec al sistema para que funcione???

    Gracias
    SAludos

    ResponderEliminar
  5. Gracias por tu comentario y con respecto al codec no había nada del otro mundo. Si el video reproduce en cualquier reproductor instalado no debería existir problema para usarlo aquí.

    Saludos

    ResponderEliminar
  6. Buenas noches. tengo una pregunta:
    esto funciona en Linux?
    Y otra: se requiere alguna librería o mídulo en especial?

    ResponderEliminar
  7. import cv2

    cap=cv2.VideoCapture() #Creamos la captura de video en el objeto 'cap'
    obj=cap.open('12.flv') #este método le asigna un true o false a 'obj'

    if obj==True:

    while(True):

    f,frame=cap.read() #frame obtiene los píxeles del fotograma actual
    if f==False: #f devuelve 'False' si llegamos al final del video
    break
    frame=cv2.resize(frame,(640,480)) #Indicador de resolución de pantalla**
    cv2.imshow('UNNOBA - LA COMPUTADORA - CURSO PREUNIVERSITARIO 2014',frame)
    ch=cv2.waitKey(20)

    if ch==27: #Con esto apagamos el video, es la tecla Esc (ASCII 27)**
    break
    cap.release() #liberamos el video almacenado como objeto cap

    cv2.destroyAllWindows()

    ResponderEliminar