Dentro del desarrollo del portal de vídeos media.upv.es para la Universidad Politécnica de Valencia, trabajé en el sistema de análisis y extracción de diapositivas de vídeos. Se trata de una herramienta que recibe un vídeo de una ponencia como entrada y es capaz de detectar en qué instantes de tiempo el ponente ha cambiado de diapositiva.
Esta herramienta está adaptada al formato de grabación institucional que se realiza en los estudios de grabación, y está hecho a medida para ello, pero también es parametrizable para que pueda ajustarse a otros tipos de vídeo.
Descripción
El software está desarrollado en C++, y utiliza la biblioteca OpenCV para realizar operaciones de análisis de imagen, y libavcodec para decodificación de vídeo.
Partimos de la premisa de que el vídeo tiene una zona dedicada a diapositivas, y otra donde se coloca el ponente. En el caso concreto de los vídeos del portal, el profesor se encuentra a la derecha de la imagen, y la presentación ocupa la parte izquierda y central, ocupando ésta las dos terceras partes de la imagen.
El primer filtro consiste en definir un área de procesamiento que se corresponda con el área de las diapositivas. Este filtro se utiliza para no tener en cuenta los movimientos del ponente a la hora de detectar un cambio de diapositiva. Se especifica como parámetro de entrada, de manera que sea configurable para que pueda utilizarse en otros tipos de vídeos.
A partir de la zona de diapositivas, la detección del cambio se realiza comparando las imágenes de el fotograma actual, con la imagen del siguiente fotograma a procesar. En primer lugar, obtenemos el canal de luminancia de ambas imágenes. Este canal es más representativo del cambio de diapositivas, y además puede extraerse directamente del fotograma del vídeo, ya que los vídeos no suelen codificarse en espacio de color RGB.
A continuación se realiza una resta a nivel de píxel de ambas imágenes. Si las imágenes son iguales, el resultado será una imagen en negro:
Si las imágenes son distintas, el resultado será una imagen con la diferencia entre ambos fotogramas:
Una vez que tenemos la imagen generada con la diferencia de ambos fotogramas, se calcula el histograma. El histograma se utiliza mucho en fotografía y vídeo, porque representa la proporción entre valores claros y oscuros de la imagen: a la izquierda están representados los píxeles negros de la imagen, a la derecha los blancos, y entre un extremo y otro se representan todos los niveles de grises. Una imagen negra tendría un histograma donde todas las muestras estarían a la izquierda, mientras que en una imagen blanca todas las muestras estarían a la derecha.
Calculando el histograma de la diferencia entre ambas imágenes, podemos saber cual es la proporción de píxeles oscuros y claros, y así podemos definir un umbral a partir del cual asumimos que la diapositiva ha cambiado:
Imagen sin cambios: la mayor parte del histograma está a la izquierda, en la zona del negro:
Imagen con cambios: el histograma presenta una cierta curva fuera de la zona del negro:
El umbral de detección se define como un área del histograma, que puede especificarse como parámetros del programa. Si algún valor del histograma entra en la zona umbral, entonces detectamos un cambio.
Cuando se detecta un cambio de fotograma, se toma una captura del fotograma nuevo en espacio de color RGB, y se guarda como una imagen en un formato definido como parámetro.
Al terminar de procesar el vídeo, se genera un archivo JSON con un índice de los instantes de tiempo en los que se han generado los fotogramas, las capturas de la imagen del vídeo correspondientes con estos fotogramas y los nombres de los archivos de imagen asociados a cada instante de tiempo.
Estos datos se utilizan para generar la lista de diapositivas asociadas a cada vídeo dentro del portal media.upv.es.
Disponibilidad
Este proyecto es de código abierto y puede su código fuente puede obtenerse a través de Github: