2 de enero de 2011

Crear un barra de reproducción para un video

El objetivo de este ejemplo es reproducir un video y poner una barra para indicar la posición, se podria decir que es un primer intento de un reproductor de video, pero no lo es ya que la barra no se mueve sola a medida que avanza el video, pero si movemos la barra el video si se mueve.

Sola habra que agregar un par de cosas nuevas teniendo en cuenta que ya sabemos como mostrar un video en python.

Resultado:
Codigo:


Como pueden ver, el codigo para manejar un video por medio de una barra no es muy diferente al de mostrar el video, se le agrega solamente lo concerniente a la barra.

El codigo esta dividido por lineas punteadas para poder explicarlo mejor.

La primera sección, como podran notar es la linea para importar el modulo de OpenCV, en la segunda sección inicializo dos variables globales. Aunque en python no es necesario declarar ni inicializar variables, en este ejemplo lo hago ya que necesito que estas variables sean accesibles desde todo el programa por tanto las pongo en ese sitio para que sean globales. Les recomiendo hacer esto cuando siempre y cuando necesiten variables que vallan a ser accedidas desde cualquier metodo.

La siguiente seccion es la funcion que se ejecuta cada vez que la barra cambia de posición, vamos a dejar por el momento hasta ahi y mas adelante la siguo explicando.

La siguiente es mas conocida porque tiene instrucciones parecidas al anterior ejemplo, primero creamos la ventana, comenzamos a capturar el video y viene algo nuevo:

frames= cv.GetCaptureProperty(g_capture,cv.CV_CAP_PROP_FRAME_COUNT)

es mas sencillo de lo que parece a primera vista, esta linea la ponemos para saber cuantos frames tiene el video que acabamos de llamar, como ya explicamos antes, un video es una suceción de imagenes mostradas cierto intervalo de tiempo, este tiempo es lo suficientemente rapido como para que no nos demos cuenta que son imagenes diferentes pero no tan rapido como para que los movimientos se vean innaturales. un frames es cada imagen que compone un video. en este ejemplo la pelicula completa se compone de 158680 frames.

La funcion  cv.GetCaptureProperty  permite obtener propiedades de un video, es este caso cv.CV_CAP_PROP_FRAME_COUNT que no es mas sino el conteo de los frames del video. esta funcion pide dos arguementos, primero el video que en este caso es g_capture y segundo la propiedad que queremos obtener, en este caso el numero de frames.

por lo tanto esta linea obtiene el numero de frames del video parche.avi y mete ese numero en la variable frames.


cv.CreateTrackbar('barra','Imagen',g_slider_position,int(frames/10),onTrackBarSlide)


ahora viene propiamente la funcion para crear la barra, para esto se usa la funcion:
cv.CreateTrackbar
y como cualquier otra función necesita argumentos para trabajar, en este caso son:

- El nombre de la barra 
- El nombre de la ventana en la que se va a poner la barra
- La variable que contiene el valor inicial de la barra
- El valor maximo de la barra, osea hasta donde va a llegar
- La funcion que llama la barra cada vez que cambia de posicion.

Los tres primeros argumentos estan bastante claros, la barra se llama 'barra' : )... voy a poner 'barra' en la ventana 'Imagen', y el valor inicial de la barra es la variable global g_slider_position.
la confusion puede llegar en el valor maximo:  int(frames/10), se supone que el valor maximo deberia ser la variable frames solamente, pero aqui surgio un problema y es que como ya dije el video tenia aproximadamente 160000 frames, y la barra solo puede tener aproximadamente 18000 posiciones por lo que no se alcanza a cubrir todo el video, la solucionque hice fue que en vez de que la barra se mueva de a 1 en 1, se mueva de 10 en 10 asi no necesito las 160000 posiciones sino solamente 16000. la forma en que lo hago es muy obvia, frames/10 y para asegurarme que sea un entero lo pongo adentro de la funcion int() que me convierte cualquier tipo de numero a enteros.


El ultimo argumento es el nombre de la funcion que es llamada cada vez que la barra se mueve, en este caso la funcion se llama onTrackBarSlide que fue la tercera seccion que hicimos, por lo que ahora que ya sabemos para que se necesita esa funcion y cuando se ejecuta voy a pasar a explicarla bien.

def onTrackBarSlide (pos):
    cv.SetCaptureProperty(g_capture,cv.CV_CAP_PROP_POS_FRAMES,pos*10)

   
Esa es la declaracion de una funcion en python, el argumento de entrada que le paso se llama pos, y no es nada mas sino el valor numerico de la posicion de la barra. despues aparece la funcion cv.SetCaptureProperty  que viene siendo el opuesto a la que ya usamos que era cv.GetCaptureProperty, sino lo han descubierto ya, Get es obtener y Set es poner, entonces si con GetCaptureProperty obteniamos las propiedades del video, con SetCaptureProperty las configuramos.

Los argumentos que le paso a cv.SetCaptureProperty  son parecido a los que le pase a su funcion opuesta, primero el video al cual le voy a modificar sus propiedades, despues cv.CV_CAP_PROP_POS_FRAMES que es el frame actual del video, y el ultimo argumento es el valor del frame en el que voy a poner el video, normalmente deberia ser solamente la variable pos que es el valor de la bara, pero como habiamos hecho que la barra tuviera frames/10, aqui debemos multiplicar por diez para que no perdamos posiciones.


Bueno creo que eso es todo sobre lo que hay explicar del ejemplo, espero que halla quedado claro...

No hay comentarios:

Publicar un comentario