UNIVERSITAT JAUME I II31 SISTEMAS INFORMÁTICOS INGENIERÍA INFORMÁTICA Curso 2009-2010 Memoria Técnica del Proyecto Localizador de las líneas de campo en un vídeo deportivo Proyecto presentado por el Alumno Carlos Sorribes Ojeda Dirigido por Raúl Montoliu Colás Castellón, a 18 de Septiembre de 2010 Resumen Este documento presenta la memoria de la asignatura sistemas informáticos (II31), asignatura troncal de segundo de ciclo de ingenierı́a informática de la Universidad Jaume I, que forma parte de la última etapa de formación de los alumnos que finalizan sus estudios. En esta asignatura se inicia al alumno en los aspectos de estudio, desarrollo, gestión y culminación de un proyecto de ingenierı́a informática mediante la realización de un trabajo de investigación y desarrollo, académicamente dirigido. El proyecto elegido consiste en la detección de las principales lı́neas que delimitan una cancha de baloncesto en un vı́deo deportivo. Adicionalmente también se ha desarrollado una interfaz gráfica que permita ajustar los parámetros iniciales para cada vı́deo de una manera cómoda. Para la realización de pruebas y análisis de resultados se han utilizado fragmentos de vı́deos de partidos de baloncesto pertenecientes a la liga ACB, que es la principal liga de baloncesto profesional de España. La aplicación que detecta las lı́neas de campo se ha desarrollado en C++ utilizando la librerı́a OpenCv para el tratamiento de los vı́deos e imágenes, mientras que la interfaz gráfica se ha desarrollado en Visual Basic .NET. Palabras Clave Visión por computador, análisis de vı́deos deportivos, detección de lı́neas, OpenCv 1 2 Índice general 1. Introducción 11 1.1. Motivación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.2. Conceptos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 1.3. Vista previa del trabajo realizado . . . . . . . . . . . . . . . . . . . . . . . . . 14 1.4. Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.5. Organización del documento . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 2. Planificación 19 2.1. Identificación de las tareas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.2. Planificación inicial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.3. Planificación real . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 3. Detección de las lı́neas de campo 23 3.1. Análisis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 23 Índice general 3.2. Diseño del algoritmo de detección de las lı́neas de campo en un vı́deo . . . . . . 25 3.3. Implementación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 3.3.1. Algoritmo que obtenga los pı́xeles pertenecientes a la lı́nea que se está buscando a partir de una imagen . . . . . . . . . . . . . . . . . . . . . . . 27 3.3.2. Algoritmo que ajuste a una recta a los puntos encontrados . . . . . . . . 31 3.3.3. Algoritmo que ajuste la zona de búsqueda de la lı́nea . . . . . . . . . . . 35 3.3.4. Algoritmo que recorte las lı́neas encontradas . . . . . . . . . . . . . . . 35 4. Aplicación gráfica 37 4.1. Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 4.2. Entorno de desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 4.3. Análisis de requisitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 4.4. Diseño . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 4.5. Resultado final . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 5. Pruebas y Resultados 49 5.1. Partido 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 5.2. Partido 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 6. Futuras ampliaciones 59 4 Índice general 7. Conclusiones 61 7.1. Conclusiones objetivas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 7.2. Conclusiones personales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 5 Índice general 6 Índice de figuras 1.1. Aspecto de una pista de baloncesto . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 1.2. Detección de las lı́neas de campo en un vı́deo deportivo . . . . . . . . . . . . . . . . . . 14 1.3. Pantalla principal de la aplicación LineDetectorGUI . . . . . . . . . . . . . . . . . . . . 15 1.4. Pantalla de configuración de los parametros iniciales del partido . . . . . . . . . . . . . . 15 2.1. Estimación de la duración de las tareas del proyecto . . . . . . . . . . . . . . . . . . . 21 2.2. Duración real de las tareas del proyecto . . . . . . . . . . . . . . . . . . . . . . . . . 22 3.1. Captura de uno de los vı́deos utilizados en el proyecto . . . . . . . . . . . . . . . . . . 24 3.2. Recorte de las lı́neas de la pista encontradas . . . . . . . . . . . . . . . . . . . . . . . 25 3.3. Zonas de búsqueda de las lı́neas de la pista . . . . . . . . . . . . . . . . . . . . . . . 27 3.4. Detalle de la lı́nea de banda superior . . . . . . . . . . . . . . . . . . . . . . . . . . 28 3.5. Máscaras utilizadas para la detección de las lı́neas de campo . . . . . . . . . . . . . . . 28 3.6. Ejemplo de funcionamiento del algoritmo . . . . . . . . . . . . . . . . . . . . . . . . 29 7 Índice de figuras 3.7. Ejemplo de funcionamiento del algoritmo . . . . . . . . . . . . . . . . . . . . . . . . 30 3.8. Ejemplo de ajuste por mı́nimos cuadrados a una recta . . . . . . . . . . . . . . . . . . 32 3.9. Ejemplo de ajuste por mı́nimos cuadrados a una recta con un falso positivo . . . . . . . . . 32 3.10. Distancia de los puntos a la recta . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 3.11. Segunda iteración del algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 3.12. Ajuste de la zona de búsqueda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 4.1. Diseño de la pantalla principal de LineDetectorGUI . . . . . . . . . . . . . . . . . . . . 39 4.2. Parámetros de la zona de búsqueda para la lı́nea de banda superior . . . . . . . . . . . . 41 4.3. Diseño de la pantalla de configuración . . . . . . . . . . . . . . . . . . . . . . . . . 42 4.4. Aspecto final de la pantalla principal de LineDetectorGUI . . . . . . . . . . . . . . . . . 43 4.5. Cuadro de diálogo para seleccionar la carpeta del partido . . . . . . . . . . . . . . . . . 43 4.6. Partido sin fichero de configuración . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 4.7. Partido con fichero de configuración . . . . . . . . . . . . . . . . . . . . . . . . . . 44 4.8. Pantalla de configuración . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 4.9. Cuadro de diálogo para seleccionar el archivo de vı́deo . . . . . . . . . . . . . . . . . . 45 4.10. Configuración guardada. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 4.11. Botón de Ejecutar activado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 8 Índice de figuras 4.12. Ejecución de LineDetector con el partido seleccionado. . . . . . . . . . . . . . . . . . . 47 5.1. Captura del partido Girona - Pamesa.(1) . . . . . . . . . . . . . . . . . . . . . . . . 51 5.2. Captura del partido Girona - Pamesa.(2) . . . . . . . . . . . . . . . . . . . . . . . . 52 5.3. Captura del partido Real Madrid - Pamesa.(1) . . . . . . . . . . . . . . . . . . . . . . 54 5.4. Captura del partido Real Madrid - Pamesa.(2) . . . . . . . . . . . . . . . . . . . . . . 55 5.5. Problemas en las transiciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 6.1. Ampliación del proyecto para averiguar la posición de los jugadores utilizando la posición de las lı́neas de la pista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 9 Índice de figuras 10 Capı́tulo 1 Introducción A lo largo de este capı́tulo se explicará cual es el hecho que nos ha movido a desarrollar este proyecto, se definirán una serie de conceptos para facilitar al lector la compresión del resto del documento y se expondrán los objetivos que se pretenden conseguir con la realización del proyecto. 1.1 Motivación El objetivo de este proyecto es implementar un serie de algoritmos que permitan detectar las principales lı́neas de un campo de baloncesto en un vı́deo perteneciente a un partido de baloncesto. Este proyecto forma parte de un proyecto más complejo que tendrı́a como objetivo conocer en que lugar del campo se encuentra un determinado jugador en cada instante del partido. A partir de esta información se podrı́an obtener estadı́sticas y patrones de movimiento de los jugadores que podrı́an ser utilizados por los cuerpos técnicos de los equipos de baloncesto para analizar tanto a su propio equipo como a los rivales. El problema que se encuentra a la hora de determinar la posición de cada jugador es que normalmente la posición de la cámara no es fija si no que se encuentra en movimiento, por lo que es necesario tener algún tipo de referencia para saber la posición de un jugador. Por este motivo es necesario poder determinar dónde se encuentran las lı́neas del campo. Ya que una vez encontradas se podrá saber la posición de un jugador en relación a las mismas. Delimitar las lı́neas del campo también evitará realizar calculos innecesarios ya que sólo se desea saber lo que 11 1.2. Conceptos ocurre dentro de la pista y el resto de la imagen que queda fuera de los lı́mites del campo puede ser ignorada. 1.2 Conceptos Baloncesto El baloncesto (del inglés basketball) es un deporte de equipo que consiste básicamente en introducir una pelota en un aro, del que cuelga una red. En algunas regiones se llama básquet, al castellanizar el término inglés para la palabra cesto. Se juega con dos equipos de cinco personas, durante 4 periodos o cuartos de 10 minutos cada uno. Al finalizar el segundo cuarto, se realiza un descanso, normalmente de 10 a 20 minutos según la reglamentación propia de campeonato al cual el partido pertenezca. [1] Pista de baloncesto Una pista de baloncesto tiene que ser una superficie dura, plana, rectangular y libre de obstáculos, con 15 m de ancho y 28 m de longitud. El campo está dividido en dos mitades iguales separados por la lı́nea denominada de medio campo y con un cı́rculo que parte del centro de la pista, el cı́rculo central mide 3,6 m diámetro. Para cada equipo, el medio campo que contiene la canasta que se defiende se denomina medio campo defensivo y el medio campo que contiene la canasta en la que se pretende anotar se denomina medio campo ofensivo. En los lados menores se sitúan los aros que están a 3,05 m de altura y se introducen 1,20 m dentro del rectángulo de juego. Paralela a la lı́nea de fondo encontramos la lı́nea de tiros libres, que se encuentra a 5,80 m de la lı́nea de fondo y a 4,60 m de la canasta. El cı́rculo donde se encuentra la lı́nea de tiros libres tiene un diámetro de 3,6 m. Todas las lı́neas miden 5 cm. de ancho. [2] A continuación se indica la denominación que se utilizará en este documento para hacer referencia a cada una de las lı́neas de la pista. Lı́neas de fondo. Son las lı́neas que delimitan la anchura de la pista. Lı́neas de banda o laterales. Son las lı́neas que delimitan la longitud de la pista. Visión por computador 12 1.2. Conceptos Figura 1.1: Aspecto de una pista de baloncesto La Visión por Computador (del inglés Computer Vision), es un subcampo de la inteligencia artificial. El propósito de la visión por computador es programar un computador para que “entienda” una escena o las caracterı́sticas de una imagen. Los objetivos tı́picos de la visión artificial incluyen: La detección, segmentación, localización y reconocimiento de ciertos objetos en imágenes (por ejemplo, caras humanas). La evaluación de los resultados (ej.: segmentación, registro). Registro de diferentes imágenes de una misma escena u objeto, i.e., hacer concordar un mismo objeto en diversas imágenes. Seguimiento de un objeto en una secuencia de imágenes. Mapeo de una escena para generar un modelo tridimensional de la escena; tal modelo podrı́a ser usado por un robot para navegar por la escena Estimación de las posturas tridimensionales de humanos. Búsqueda de imágenes digitales por su contenido. Estos objetivos se consiguen por medio de reconocimiento de patrones, aprendizaje estadı́stico, geometrı́a de proyección, procesado de imágenes, teorı́a de gráficos y otros campos. La visión artificial cognitiva está muy relacionada con la psicologı́a cognitiva y la computación biológica. 13 1.3. Vista previa del trabajo realizado 1.3 Vista previa del trabajo realizado El resultado principal del desarrollo de este proyecto ha sido una aplicación que nos permita detectar las principales lı́neas en una pista de baloncesto y ha recibido el nombre LineDetector. Como complemento para facilitar el uso de LineDetector se ha implementado también una interfaz gráfica que permita ajustar la configuración inicial de los vı́deos utilizados. Esta interfaz ha recibido el nombre de LineDetectorGUI A forma de presentación visual del trabajo realizado en este proyecto, se muestran a continuación algunas capturas de pantalla del resultado final de la aplicación. En la figura 1.2 se muestra el resultado de ejecutar la aplicación LineDetector sobre uno de los vı́deos que se han utilizado para la realización de las pruebas. Las lı́neas encontradas se muestran de color rojo sobreimpresionadas en el vı́deo original. Figura 1.2: Detección de las lı́neas de campo en un vı́deo deportivo En la figura 1.3 se muestra la pantalla principal de la aplicación LineDetectorGUI. Desde esta aplicación se puede ajustar la configuración inicial necesaria para el correcto funcionamiento de la aplicación que detecta las lı́neas de campo. LineDetectorGUI también permite lanzar la ejecución LineDetector. 14 1.3. Vista previa del trabajo realizado Figura 1.3: Pantalla principal de la aplicación LineDetectorGUI En la figura 1.4 se muestra la pantalla desde la cual se pueden cambiar los parámetros de configuración iniciales del vı́deo del partido. En el capı́tulo 4 se explicarán con mayor profundidad cada uno de estos parámetros. Figura 1.4: Pantalla de configuración de los parametros iniciales del partido 15 1.4. Objetivos 1.4 Objetivos Los principales objetivos que se desean conseguir con la realización de este proyecto son los siguientes: Diseñar e implementar una aplicación que detecte de forma automática las principales lı́neas de una pista de baloncesto en un vı́deo deportivo. Reducir el tiempo de ejecución de la aplicación lo mayor posible. Crear una interfaz gráfica que permita interactuar con la aplicación que detecta las lı́neas del campo de una forma fácil. Un objetivo importante en este proyecto, es que el código presentado este bien estructurado, que sea fácil de comprender y de utilizar. Hay que mencionar que el desarrollo de una interfaz gráfica no era uno de los objetivos iniciales del proyecto. Sin embargo, durante el desarrollo del proyecto se consideró de gran utilidad desarrollar una interfaz gráfica que permitiera realizar la configuración necesaria para cada vı́deo de una manera cómoda y ágil. 1.5 Organización del documento La estructura que presenta este documento es la siguiente: Capı́tulo 1 - Introducción. Es el capı́tulo actual y tiene como misión realizar una breve introducción al proyecto, indicando la motivación, objetivos y definiendo una serie de conceptos para facilitar la comprensión del resto del documento. Capı́tulo 2 - Planificación. En este capı́tulo se muestra la planificación inicial propuesta antes de iniciar la realización del proyecto y, la planificación real. Capı́tulo 3 - Detección de las lı́neas de campo. Este capı́tulo abarca el análisis, diseño e implementación de la aplicación que detecta las lı́neas del campo. 16 1.5. Organización del documento Capı́tulo 4 - Aplicación gráfica. En este capı́tulo se detalla el análisis, diseño e implementación de la interfaz gráfica desarrollada para este proyecto. Capı́tulo 5 - Pruebas y resultados. Este capı́tulo muestra los experimentos efectuados para comprobar el correcto funcionamiento de la aplicación desarrollada. Capı́tulo 6 - Futuras ampliaciones. Se analizarán las posibles mejoras y/o ampliaciones que se podrán realizar a la aplicación en el futuro. Capı́tulo 7 - Conclusiones. Se presentarán las conclusiones alcanzadas tras la realización del proyecto. 17 1.5. Organización del documento 18 Capı́tulo 2 Planificación En este capı́tulo se va a presentar la planificación realizada para este proyecto. En primer lugar se identificarán las tareas necesarias para la realización de este proyecto y posteriormente se estimará el tiempo necesario para su desarrollo. Finalmente se mostrará cuál ha sido el tiempo real dedicado a cada una de las tareas. 2.1 Identificación de las tareas A partir de los objetivos fijados para el proyecto se han identificado como necesarias para la realización del proyecto las tareas que se muestran el Cuadro 2.1 19 2.1. Identificación de las tareas Fase Planificación Análisis y diseño Implementación Experimentación Documentación Tareas Definición de los objetivos del proyecto Búsqueda e instalación del software necesario Definición de las tareas Estimación temporal de las tareas Análisis de requisitos Diseño del algoritmo de detección de las lı́neas del campo Detección de las lı́neas del campo Preparación de las pruebas Realización de las pruebas Conclusiones Realización de la memoria Preparación de la presentación del proyecto Presentación del proyecto Cuadro 2.1: Lista de tareas del proyecto 20 2.2. Planificación inicial 2.2 Planificación inicial En la figura 2.1 se muestra una estimación inicial de la duración de las tareas identificadas. Respecto al orden de ejecución de las tareas, como el proyecto ha sido realizado por una única persona, las tareas se han ejecutado en orden secuencial. Figura 2.1: Estimación de la duración de las tareas del proyecto 21 2.3. Planificación real 2.3 Planificación real Una vez finalizadas todas las tareas pertenecientes a la realización del proyecto la duración del mismo se ha visto aumentada de manera considerable. Esto es debido a que durante la realización del proyecto se detectó la necesidad de implementar una interfaz gráfica que permitiera ajustar la configuración de los vı́deos utilizados en el proyecto. En la figura 2.2 se muestra la nueva lista de tareas junto con la duración real de cada una. Figura 2.2: Duración real de las tareas del proyecto 22 Capı́tulo 3 Detección de las lı́neas de campo En este capı́tulo se detallarán las fases de análisis, diseño e implementación de la aplicación que detecta las lı́neas de campo. En un primer punto se analizarán los vı́deos utilizados en el proyecto para identificar patrones comunes en todos ellos referentes a las lı́neas. Con la información obtenida en el análisis, se diseñarán los algoritmos necesarios para el proyecto. 3.1 Análisis En primer lugar se han de definir algunos aspectos referentes a los vı́deos utilizados en este proyecto. Todos los vı́deos han sido grabados desde uno de los laterales de la pista y desde una posición fija. Sin embargo, la cámara realiza movimientos laterales, verticales y de zoom para seguir la acción del juego, ya que la imagen no muestra la pista entera. Analizando los vı́deos se observa que las lı́neas que se desea detectar no siempre aparecen en la imagen, pero cuando son visibles normalmente siempre se encuentran en la misma zona de la imagen. Por ejemplo, la lı́nea de banda inferior siempre se encuentra en la mitad inferior de la imagen. Esto propicia que no sea necesario recorrer toda la imagen para buscar cada una de las lı́neas, si no que sólo se deberá buscar en las zonas en las que sea mas probable que se encuentre la lı́nea. Con respecto a las lı́neas se observa que son siempre de color blanco y se diferencia claramente la zona que pertenece a la pista de la que se encuentra fuera de ésta. Incluso en la mayorı́a de los 23 3.1. Análisis casos las zonas interior y exterior de la pista tienen colores distintos. Por ejemplo en la figura 3.1 se puede ver como la lı́nea de banda superior siempre tiene arriba un color determinado, azul en este caso, y debajo tiene el color del parquet. La situación inversa ocurre con la lı́nea de banda inferior dónde tiene en la partes superior el color del parquet y en la parte inferior de color azul. Esto mismo también ocurrirá en las lı́neas de fondo. Figura 3.1: Captura de uno de los vı́deos utilizados en el proyecto Este hecho es muy importante ya que nos proporciona una serie de patrones o máscaras que deben cumplir las zonas de la pista que pertenezcan a una lı́nea. El hecho de que estos patrones sean distintos para cada una de las lı́neas también nos permitirá distinguir en cada caso cuál es la lı́nea encontrada. 24 3.2. Diseño del algoritmo de detección de las lı́neas de campo en un vı́deo 3.2 Diseño del algoritmo de detección de las lı́neas de campo en un vı́deo En primer lugar se ha de mencionar que un vı́deo se compone de una serı́e de imágenes (frames) independientes la una de la otra y que reproducidas a una cierta velocidad producen una sensación de movimiento. Dicho esto, se puede simplificar el problema que se desea resolver detectando las lı́neas del campo para cada una de las imágenes que componen un vı́deo. De igual manera, dentro de un frame la detección de cada una de las lı́neas se puede realizar de una manera individualizada. Por lo que el problema se reduce a encontrar una sola lı́nea en una imagen. Con el fin de mejorar el aspecto visual de la aplicación, también se implementará un algoritmo que se encargue de recortar las lı́neas encontradas. En la figura 3.2 se muestra el resultado que queremos obtener con el algoritmo que recorte las lı́neas encontradas. Figura 3.2: Recorte de las lı́neas de la pista encontradas 25 3.3. Implementación A continuación se muestra el algoritmo diseñado para la detección de las lı́neas de campo en un vı́deo deportivo. INPUT : NombreVideo : Nombre d e l vı́ d e o d e l p a r t i d o a a n a l i z a r OUTPUT: S a l i d a por p a n t a l l a BEGIN CrearVentana () V i d e o = A b r i r V i d e o ( NombreVideo ) f r a m e = ObtenerFrame ( V i d e o ) w h i l e ( f r a m e != NULL ) r e c t a B a n d a S u p e r i o r = DetectarLineaBandaSuperior ( frame ) r e c t a B a n d a I n f e r i o r = D e t e c t a r L i n e a B a n d a I n f e r i o r ( frame ) rectaFondoDerecha = DetectarLineaFondoDerecha ( frame ) r e c t a F o n d o I z q u i e r d a = D e t e c t a r L i n e a F o n d o I z q u i e r d a ( frame ) f r a m e = R e c o r t a r L i n e a s ( frame , r e c t a B a n d a S u p e r i o r , r e c t a B a n d a I n f e r i o r , rectaFondoDerecha , r e c t a F o n d o I z q u i e r d a ) MostrarImagen ( frame ) end w h i l e C e r r a r V i d e o ( Video ) CerrarVentana () END 3.3 Implementación El proceso de detección de cada una de las lı́neas se ha dividido en la implementación de varios algoritmos que realicen tareas menores, de modo que al unirlos, obtengamos un algoritmo más complejo que realice las acciones deseadas para esta parte del proyecto. Los algoritmos que se implementarán serán los siguientes: Algoritmo que obtenga los pı́xeles pertenecientes a la lı́nea que se está buscando a partir de una imagen. Algoritmo que ajuste a una recta a los puntos encontrados. Algoritmo que ajuste la zona de búsqueda de la lı́nea. 26 3.3. Implementación 3.3.1 Algoritmo que obtenga los pı́xeles pertenecientes a la lı́nea que se está buscando a partir de una imagen Como ya se ha mencionado anteriormente, tras visionar los vı́deos utilizados en este proyecto se ha observado que las lı́neas de la pista siempre se encontrarán sobre una zona de la imagen. Este hecho nos permite no tener que buscar sobre toda la imagen si no que podemos deshechar algunas zonas de la imagen. Por ejemplo, no será necesario buscar la lı́nea de fondo superior en la parte inferior de la imagen ya que es poco probable que se encuentre allı́. En el caso de que se encontrara en esa posición significarı́a que la cámara no está enfocando a la pista por lo que se tratarı́a de un trozo del vı́deo en el que no hay acción en la pista, por ejemplo en un tiempo muerto. Por lo tanto, cada una de las lı́neas tendrá asignada una zona de búsqueda dentro de la imagen. Esta zona de búsqueda será distinta para cada vı́deo ya que la posición en la que se encuentra la cámara será diferente. En la figura 3.3 se muestra una imagen en la que se pueden observar de color gris las zonas de búsqueda utilizadas para cada una de las lı́neas de la pista. Figura 3.3: Zonas de búsqueda de las lı́neas de la pista Este algoritmo tiene como objetivo obtener una lista con los pı́xeles que pertenecen a una lı́nea dentro de una imagen. Por lo tanto se deberá definir un método para poder determinar si un pı́xel pertenece a la lı́nea. Anteriormente se ha mencionado que las lı́neas del campo son siempre 27 3.3. Implementación de color blanco, por lo tanto una opción podrı́a ser identificar los pı́xeles de color blanco o de un color cercano a blanco. Esta opción no es la más adecuada ya que este método detectarı́a muchos puntos que son de color blanco pero que no pertenecen a la lı́nea, como publicidades o equipaciones de los equipos. También se ha mencionado anteriormente que la lı́nea diferencia claramente la zona interior y exterior de la pista que normalmente son de distinto color. En la figura 3.4 se puede ver como la lı́nea de banda superior tendrá siempre una zona de color azul seguida de una lı́nea blanca y finalmente otra zona del color del parquet. Figura 3.4: Detalle de la lı́nea de banda superior Llamaremos a estas imágenes máscaras y serán utilizadas para determinar si un pı́xel pertenece a la lı́nea. Obviamente cada una de las lı́neas necesitará como mı́nimo una máscara distinta y puede que alguna de las lı́neas necesite más de una máscara. La figura 3.5 muestra las máscaras utilizadas para la detección de las lı́neas de banda y la lı́nea de fondo derecha. Como se puede observar el color del interior de la pista en la lı́nea de fondo no es siempre el mismo por lo que se han tenido que utilizar dos máscaras distintas. Figura 3.5: Máscaras utilizadas para la detección de las lı́neas de campo 28 3.3. Implementación A continuación se muestra el algoritmo para obtener la lista de pı́xeles que forman parte de una lı́nea. INPUT : I m g O r i g e n : Frame d e l vı́ d e o M a s c a r a s [ ] : A r r a y con l a s i m á g e n e s de l a s m á s c a r a s de l a lı́ n e a C o l I n i c i o : Columna de l a imagen en l a que c o m i e n z a l a zona de b ú s q u e d a C o l F i n : Columna de l a imagen en l a que f i n a l i z a l a zona de b ú s q u e d a F i l a I n i c i o : F i l a de l a imagen en l a que c o m i e n z a l a zona de b ú s q u e d a F i l a F i n : F i l a de l a imagen en l a que f i n a l i z a l a zona de b ú s q u e d a Umbral : E r r o r máximo p e r m i t i d o p o r pı́ x e l OUTPUT: L i s t a P u n t o s : L i s t a con l o s p u n t o s d e t e c t a d o s BEGIN ListaPuntos = CrearListaVacia () for c = C o l I n i c i o to ColFin for f = F i l a I n i c i o to F i l a F i n f o r mask i n m a s c a r a s error = 0 f o r c c = 0 ; pC = c t o mask . Ancho f o r f f = 0 ; pF = f t o mask . A l t o e r r o r += C a l c u l a r E r r o r ( I m g O r i g e n [ pC ] [ pF ] , mask [ c c ] [ f f ] ) end f o r end f o r i f e r r o r < ( Umbral ∗ mask . Ancho ∗ mask . A l t o ) punto = C r e a r P u n t o ( c , f ) L i s t a P u n t o s . A g r e g a r ( punto ) end i f end f o r end f o r end f o r END Figura 3.6: Ejemplo de funcionamiento del algoritmo Supongamos el ejemplo que se muestra en la figura 3.6. Para calcular el error obtenido en el 29 3.3. Implementación subconjunto de pı́xeles marcado en negrita procederı́amos de la siguiente forma: ε = |a(1, 1) − m(1, 1)| + |a(1, 2) − m(1, 2)| + ... + |a(3, 3) − m(3, 3)| = 2 + 6 + 1 + 4 + 0 + 10 + 1 + 1 + 8 = 33 Para ese subconjunto de pı́xeles se ha obtenido un error con respecto a la máscara de 33 que dividido por el número de pı́xeles nos da un error promedio de 3,7. Si el error por pı́xel permitido fuera menor que 3,7 el pı́xel (2,2) serı́a uno de los detectados como parte de la lı́nea. A continuación se seguirı́a calculando el error del subconjunto formado por los pı́xeles del (1,2) al (3,4) y ası́ sucesivamente hasta el último subconjunto formado por los pı́xeles del (2,3) al (4,5). A continuación se muestra el resultado de ejecutar el algoritmo que obtenga los pı́xeles pertenecientes a la lı́nea que se está buscando a partir de una imagen. En la figura 3.7 aparecen de color verde los pı́xeles detectados como parte de una lı́nea. Figura 3.7: Ejemplo de funcionamiento del algoritmo 30 3.3. Implementación 3.3.2 Algoritmo que ajuste a una recta a los puntos encontrados Una vez tenemos una lista de los pı́xeles que pertenecen a una lı́nea debemos encontrar una recta que se ajuste a ese conjunto de puntos. El método que se ha utilizado en este proyecto ha sido el ajuste por mı́nimos cuadrados. El ajuste por mı́nimos cuadrados es una técnica de análisis numérico encuadrada dentro de la optimización matemática, en la que, dados un conjunto de pares se intenta encontrar la función que mejor se aproxime a los datos de acuerdo con el criterio de mı́nimo error cuadrático. En su forma más simple, intenta minimizar la suma de cuadrados de las diferencias ordenadas entre los puntos generados por la función y los correspondientes en los datos. En nuestro caso queremos ajustar una recta de la forma y = m ∗ x + n siendo, m= N Sxy − Sx Sy N Sxx − Sx Sx n= Sxx Sy − Sx Sxy N Sxx − Sx Sx donde, N . Número de puntos utilizados en el ajuste Sx . Suma de los valores de x. Sy . Suma de los valores de y. Sxx . Suma de los valores de x2 . Sxy . Suma de los valores de x ∗ y. En la figura 3.8 podemos observar un ejemplo de ajuste por mı́nimos cuadrados con una muestra de 8 puntos. Un problema con el que nos hemos encontrado durante la realización de este proyecto es que en ocasiones se detectan puntos que no pertenecen realmente a la lı́nea. Esto es lo que denominaremos falsos positivos o outliers. Estos falsos positivos pueden hacer que la recta calculada no se ajuste bien. En la figura 3.9 se muestra lo que ocurre cuando introducimos un punto que se 31 3.3. Implementación Figura 3.8: Ejemplo de ajuste por mı́nimos cuadrados a una recta Figura 3.9: Ejemplo de ajuste por mı́nimos cuadrados a una recta con un falso positivo aleja bastante del resto. Como se observa en la gráfica, la recta calculada en esta ocasión ya no se ajusta tanto a los puntos como lo hacı́a anteriormente. Para realizar el mejor ajuste posible de la recta intentaremos eliminar estos falsos positivos del conjunto de puntos detectados utilizando un ajuste por mı́nimos cuadrados iterativo. En primer lugar se calculará la recta de la misma forma que se ha indicado anteriormente. A continuación calcularemos la distancia que hay desde cada uno de los puntos hasta la recta encontrada descartando para la siguiente iteración los puntos que estén a una distancia mayor que un cierto valor umbral. Para calcular la distancia de un punto A y una recta R de la forma y = mx + n utilizaremos la fórmula 32 3.3. Implementación distancia(A, R) = |mAx − Ay + n| √ m2 + 1 Figura 3.10: Distancia de los puntos a la recta En la siguiente iteración se volverá a calcular la recta pero sin utilizar los puntos que hemos descartado anteriormente y tras calcular la recta se volverán a descartar los puntos más alejados. Se seguirá iterando hasta que no se produzca ningún cambio entre una iteración y la siguiente. Figura 3.11: Segunda iteración del algoritmo 33 3.3. Implementación A continuación se muestra el algoritmo de ajuste de una recta por mı́nimos cuadrados iterativo. INPUT : L i s t a P u n t o s : L i s t a con l o s p u n t o s d e t e c t a d o s MaxDist : D i s t a n c i a máxima de un punto a l a r e c t a OUTPUT: Recta BEGIN Recta = ( 0 , 0 ) rectaEncontrada = false ListaDescartados = CrearListaVacia () do{ cambios = f a l s e i f ( rectaEncontrada ) f o r punto i n L i s t a D e s c a r t a d o s i f D i s t a n c i a R e c t a P u n t o ( punto , R e c t a ) <= MaxDist L i s t a D e s c a r t a d o s . E l i m i n a r ( punto ) L i s t a P u n t o s . A g r e g a r ( punto ) end i f end f o r end i f Recta = AjusteMinimosCuadrados ( L i s t a P u n t o s ) f o r punto i n L i s t a P u n t o s i f D i s t a n c i a R e c t a P u n t o ( punto , R e c t a ) > MaxDist L i s t a P u n t o s . E l i m i n a r ( punto ) L i s t a D e s c a r t a d o s . A g r e g a r ( punto ) end i f end f o r } while ( cambios ) END 34 3.3. Implementación 3.3.3 Algoritmo que ajuste la zona de búsqueda de la lı́nea Ya se ha mencionado anteriormente que para detectar cada una de las lı́neas se utilizan zonas de búsqueda en lugar de recorrer toda la imagen. También hemos de tener en cuenta que entre dos fotogramas consecutivos que tienen lugar en un vı́deo, existen unas mı́nimas diferencias y por lo tanto la posición de las lı́neas variará muy poco entre ambos. Sabiendo esto, una vez hayamos encontrado una recta se reducirá su zona de búsqueda a 10 pı́xeles por encima y por debajo de la recta. En el caso de que no se haya encontrado una recta para esa lı́nea en la imagen se volverá a su zona de búsqueda original. Figura 3.12: Ajuste de la zona de búsqueda 3.3.4 Algoritmo que recorte las lı́neas encontradas Mediante los anteriores algoritmos se ha conseguido encontrar las rectas que definen cada una de las lı́neas del campo dentro de la imagen. Una recta por definición tiene una longitud infinita, pero eso no ocurre con las lı́neas de una pista de baloncesto. Cada una de las lı́neas tiene una longitud definida y finaliza cuando se produce la intersección con alguna de las otras lı́neas. Las lı́neas de banda tendrán como inicio y fin los puntos de corte con las lı́neas de fondo y viceversa. Para simular este comportamiento, una vez finalizado el proceso de detección de las lı́neas de la pista para un frame determinado se deberán calcular los puntos de corte de las rectas calculadas para lı́neas de fondo con las rectas de las dos lı́neas de banda y viceversa. Para calcular el punto de corte entre dos rectas supongamos las rectas y = m1 x + n1 y 35 3.3. Implementación y = m2 x + n2 . Estas rectas se cortarán en un punto único P (x, y), dónde la coordenada x del punto P será x= n2 − n1 m1 − m2 Para obtener la coordenada y del punto bastará con sustituir x por el valor calculado anteriormente en cualquiera de las dos rectas. 36 Capı́tulo 4 Aplicación gráfica 4.1 Objetivos El objetivo de esta tarea será diseñar y desarrollar una interfaz gráfica que ofrezca al usuario opciones para interactuar con las operaciones implementadas en el punto anterior. Al finalizar, se nos permitirá: Seleccionar un archivo de vı́deo Crear o modificar la configuración inicial de un vı́deo Lanzar la ejecución de la aplicación LineDetector con el vı́deo seleccionado anteriormente. Configurar los parámetros de ejecución de la aplicación LineDetector, fotogramas inicial y final de reproducción y modo de ejecución. 4.2 Entorno de desarrollo Para la realización de esta parte del proyecto se ha optado por utilizar el entorno de desarrollo Microsoft Visual Basic 2005. El lenguaje de desarrollo elegido es Visual Basic.NET. Se ha elegido 37 4.3. Análisis de requisitos este lenguaje de programación debido a que el alumno ya tenı́a conocimientos sobre el desarrollo de aplicaciones en Visual Basic.NET adquiridos en una estancia en prácticas realizada anteriormente. 4.3 Análisis de requisitos Cabe destacar que el desarrollo de una interfaz gráfica no formaba parte de la lista de tareas inicial del proyecto. Se optó por desarrollar esta interfaz con el objetivo principal de facilitar la utilización de la aplicación LineDetector ya que se trata de una aplicación de consola. Durante el análisis de requisitos se expusieron las necesidades que deberı́a cubrir la aplicación gráfica y se llegó a un acuerdo para intentar cubrirlas todas sin extender el proyecto más de lo necesario. A la hora de realizar el diseño de la interfaz, se debı́a tener en cuenta cuál era el objetivo principal de la aplicación, por lo tanto no se buscaba la realización de una interfaz compleja que fuera capaz de ofrecer grandes funcionalidades, sino que se perseguı́a la realización de una interfaz sencilla e intuitiva. 4.4 Diseño Pantalla Principal En la figura 4.1 se muestra un boceto del aspecto que debı́a tener la interfaz. Desde la pantalla principal de la aplicación lo primero que deberemos hacer será elegir el vı́deo que queremos cargar. Para esto se pulsará el botón (1) y se seleccionará la carpeta en la que se encuentra el vı́deo. En este momento el programa automáticamente buscará en esa misma carpeta el archivo de configuración de los parámetros iniciales. Este archivo debe tener el nombre config y seguir la estructura que se especificará más adelante. Al pulsar el botón (2) se abrirá la pantalla de configuración en la que nos permitirá crear una configuración para el partido o modificar una existente en el caso de que se hubiera creado anteriormente. El siguiente paso será seleccionar la ubicación del archivo ejecutable de LineDetector. Pulsando en el botón (3) se abrirá un cuadro de diálogo en el que podremos indicar a la aplicación la localización del archivo. 38 4.4. Diseño Figura 4.1: Diseño de la pantalla principal de LineDetectorGUI El siguiente paso será configurar los parámetros de ejecución de LineDetector. Podremos elegir el modo de ejecución de la aplicación entre Reproducir y grabar. Con el modo reproducir simplemente veremos por pantalla el resultado de la ejecución, mientras que si se elige el modo Grabar se guardará el resultado de la ejecución en un archivo de vı́deo. También se podrán configurar cuales serán los frames inicial y final del vı́deo. Esta funcionalidad es de bastante utilidad ya que en bastantes ocasiones hay trozos del vı́deo que no queremos analizar, como por ejemplo los calentamientos de los equipos previos al comienzo del partido. Una vez realizados los pasos explicados anteriormente al pulsar el botón Ejecutar(5) se lanzará el ejecutable de LineDetector que se ha seleccionado con la configuración indicada. Pantalla de configuración La pantalla de configuración se utilizará para crear y modificar el fichero de configuración que contiene los parámetros de cada una de las lı́neas que se desea detectar. Este fichero será un archivo de texto con la siguiente estructura: 39 4.4. Diseño Listing 4.1: Ejemplo de fichero de configuración Video = v i d e o . a v i I n i c i o Linea Nombre = banda s u p e r i o r Row 0 = 0 Row F = 0 Col 0 = 0 C o l F = 640 Limite I n f e r i o r = 0.0 , 100.0 Limite Superior = 0.0 , 300.0 Mascara = m a s k b a n d a s u p . j p g Fin Linea I n i c i o Linea Nombre = banda i n f e r i o r Row 0 = 0 Row F = 0 Col 0 = 0 C o l F = 640 Limite I n f e r i o r = 0.0 , 420.0 Limite Superior = 0.0 , 480.0 Mascara = m a s k b a n d a i n f 1 . j p g Fin Linea I n i c i o Linea Nombre = f o n d o d e r e c h a Row 0 = 100 Row F = 400 Col 0 = 0 Col F = 0 L i m i t e I n f e r i o r = 3 2 . 0 , −15000.0 L i m i t e S u p e r i o r = 3 2 . 0 , −20000.0 Mascara = m a s k f o n d o d e r 1 . j p g Mascara = m a s k f o n d o d e r 2 . j p g Fin Linea I n i c i o Linea Nombre = f o n d o i z q u i e r d a Row 0 = 100 Row F = 400 Col 0 = 0 Col F = 0 Limite I n f e r i o r = 32.0 , 0.0 L i m i t e S u p e r i o r = 3 2 . 0 , −5000.0 Mascara = m a s k f o n d o i z q 1 . j p g Mascara = m a s k f o n d o i z q 2 . j p g Fin Linea Como se puede observar en el código 4.1 lo primero que se debe especificar es el nombre del vı́deo a analizar. A continuación se especificarán los parámetros particulares de cada una de las lı́neas. Estos parámetros son los que nos permitirán crear las zonas de búsqueda para cada una de 40 4.4. Diseño las lı́neas. La configuración de cada lı́nea comenzará con la etiqueta Inicio Linea y finalizará al encontrar la etiqueta Fin Linea. A continuación se van a explicar los parámetros referentes a cada lı́nea: Row 0, Row F. Estos parámetros solo se utilizan en las lı́neas de fondo. Indican las filas inicial y final de la zona de búsqueda de la lı́nea. Col 0, Col F. Estos parámetros solo se utilizan en las lı́neas de banda. Indican las columnas inicial y final de la zona de búsqueda de la lı́nea. Limite Inferior, Limite Superior. Son dos rectas de la forma y = mx + n donde m es el primer parámetro y n el segundo. Serán dos rectas paralelas que determinarán la zona de búsqueda de la lı́nea. Mascara. Indica el nombre de la imagen que se utilizará como máscara para esa lı́nea. La etiqueta Mascara puede aparecer todas las veces que se necesiten ya que una misma lı́nea puede utilizar varias máscaras distintas. Figura 4.2: Parámetros de la zona de búsqueda para la lı́nea de banda superior En la figura 4.3 se muestra el boceto de la pantalla de configuración. En la parte superior deberemos indicar el nombre del vı́deo que se desea analizar. Al pulsar el botón (1) se abrirá un cuadro de diálogo para seleccionar el archivo de vı́deo que se desee. A continuación tendremos una pestaña (2) para cada una de las lı́neas. Dentro de cada pestaña se podrán modificar los valores de los parámetros de configuración de la lı́nea correspondiente. 41 4.5. Resultado final También se pueden cambiar las máscaras utilizadas en cada lı́nea. Para agregar una lı́nea pulsaremos el botón Agregar y seleccionaremos la imagen deseada en el cuadro de diálogo. Si lo que se desea es eliminar una de las máscaras se deberá seleccionar de (3) y pulsar el botón Quitar. Una vez se hayan configurado todos los parámetros se podrán almacenar pulsando el botón Guardar (4). Al pulsar este botón la aplicación generará automáticamente el fichero de configuración que deberá leer LineDetector. Figura 4.3: Diseño de la pantalla de configuración 4.5 Resultado final En este apartado vamos a mostrar el aspecto final de la interfaz gráfica que se ha desarrollado en el proyecto. Se mostrarán varias capturas de pantalla del programa para mostrar las distintas funcionalidades que ofrece. En la figura 4.4 se muestra el aspecto final de la pantalla principal de la interfaz. Como se puede observar el botón Ejecutar se encuentra deshabilitado porque aún no se ha cargado ningún partido ni se ha especificado la ubicación del ejecutable de LineDetector. Para cargar el partido deberemos seleccionar la carpeta en la que se encuentra el archivo de vı́deo desde el cuadro de diálogo que se muestra en la figura 4.5 42 4.5. Resultado final Figura 4.4: Aspecto final de la pantalla principal de LineDetectorGUI Figura 4.5: Cuadro de diálogo para seleccionar la carpeta del partido 43 4.5. Resultado final Una vez seleccionada la carpeta del partido, la aplicación automáticamente buscará en ese directorio el fichero de configuración del partido que deberá tener el nombre config. Si no se ha encontrado un fichero de configuración se mostrará un botón que permitirá acceder a la pantalla de configuración de partido. En caso de que se haya encontrado un fichero de configuración se permitirá su modificación . En las figuras 4.6 y 4.7 se muestran estos dos casos. Figura 4.6: Partido sin fichero de configuración Figura 4.7: Partido con fichero de configuración En la figura 4.8 se muestra el aspecto de la pantalla de configuración cuando no habı́a un fichero de configuración para ese partido. En el caso de que hubiera existido se hubiera cargado la información en esta pantalla. Lo primero que haremos será seleccionar el archivo de vı́deo del partido. Al pulsar el botón al lado de la etiqueta de vı́deo se abrirá un cuadro de diálogo para que se seleccione el archivo deseado(figura 4.9). Este cuadro de diálogo sólo permitirá seleccionar archivos que tengan extensión avi. 44 4.5. Resultado final Figura 4.8: Pantalla de configuración Figura 4.9: Cuadro de diálogo para seleccionar el archivo de vı́deo 45 4.5. Resultado final Una vez cargado el vı́deo se configurarán el resto de parámetros para cada una de las lı́neas cambiando entre las distintas pestañas. Para agregar las máscaras que sean necesarias en cada lı́nea pulsaremos el botón Agregar y seleccionaremos en el cuadro de diálogo la imagen que se desee. Al igual que en el otro cuadro de diálogo sólo se podrán seleccionar archivos con la extensión jpg. Cuando se hayan acabado de configurar todos los parámetros se podrán guardar los cambios realizados pulsando el botón Guardar (4.10). Figura 4.10: Configuración guardada. Figura 4.11: Botón de Ejecutar activado. Tras configurar los parámetros iniciales del partido se deberá seleccionar la ubicación del archivo ejecutable de LineDetector en un cuadro de diálogo. Tras seleccionar el archivo ejecutable se activará el botón de Ejecutar. 46 4.5. Resultado final Al pulsar el botón de Ejecutar se lanzará la ejecución del archivo ejecutable seleccionado indicándole los parámetros de reproducción seleccionados, modo de ejecución, frame de inicio y fin. Figura 4.12: Ejecución de LineDetector con el partido seleccionado. 47 4.5. Resultado final 48 Capı́tulo 5 Pruebas y Resultados En este capı́tulo se detallarán las pruebas realizadas para comprobar el correcto funcionamiento de los algoritmos desarrollados en el proyecto. Estas pruebas se han realizado utilizando vı́deos correspondiente a partidos de la liga ACB. 5.1 Partido 1 En este partido se ha utilizado la configuración inicial indicada a continuación: Listing 5.1: Configuración del partido Girona - Pamesa V i d e o = 003 0 2 5 g i r p a m 2 0 0 7 1 0 1 7 0 . a v i I n i c i o Linea Nombre = banda s u p e r i o r Row 0 = 0 Row F = 0 Col 0 = 0 C o l F = 640 Limite I n f e r i o r = 0.0 , 150.0 Limite Superior = 0.0 , 270.0 Mascara = m a s k b a n d a s u p 1 . j p g Mascara = m a s k b a n d a s u p 2 . j p g Mascara = m a s k b a n d a s u p 3 . j p g Fin Linea I n i c i o Linea Nombre = banda i n f e r i o r 49 5.1. Partido 1 Row 0 = 0 Row F = 0 Col 0 = 0 C o l F = 640 Limite I n f e r i o r = 0.0 , 400.0 Limite Superior = 0.0 , 480.0 Mascara = m a s k b a n d a i n f 1 . j p g Mascara = m a s k b a n d a i n f 2 . j p g Mascara = m a s k b a n d a i n f 3 . j p g Fin Linea I n i c i o Linea Nombre = f o n d o d e r e c h a Row 0 = 100 Row F = 400 Col 0 = 0 Col F = 0 L i m i t e I n f e r i o r = 3 2 . 0 , −15000.0 L i m i t e S u p e r i o r = 3 2 . 0 , −20000.0 Mascara = m a s k f o n d o d e r 1 . j p g Mascara = m a s k f o n d o d e r 2 . j p g Fin Linea I n i c i o Linea Nombre = f o n d o i z q u i e r d a Row 0 = 100 Row F = 400 Col 0 = 0 Col F = 0 Limite I n f e r i o r = 32.0 , 0.0 L i m i t e S u p e r i o r = 3 2 . 0 , −5000.0 Mascara = m a s k f o n d o i z q 1 . j p g Mascara = m a s k f o n d o i z q 2 . j p g Fin Linea A continuación se muestran algunas capturas de pantalla correspondientes a la ejecución de la aplicación con el partido entre Girona y Pamesa. 50 5.1. Partido 1 Figura 5.1: Captura del partido Girona - Pamesa.(1) 51 5.1. Partido 1 Figura 5.2: Captura del partido Girona - Pamesa.(2) 52 5.2. Partido 2 5.2 Partido 2 Listing 5.2: Configuración del partido Real Madrid - Pamesa V i d e o = mad pam . a v i I n i c i o Linea Nombre = banda s u p e r i o r Row 0 = 0 Row F = 0 Col 0 = 0 C o l F = 640 Limite I n f e r i o r = 0.0 , 100.0 Limite Superior = 0.0 , 300.0 Mascara = m a s k b a n d a s u p . j p g Fin Linea I n i c i o Linea Nombre = banda i n f e r i o r Row 0 = 0 Row F = 0 Col 0 = 0 C o l F = 640 Limite I n f e r i o r = 0.0 , 420.0 Limite Superior = 0.0 , 480.0 Mascara = m a s k b a n d a i n f 1 . j p g Mascara = m a s k b a n d a i n f 3 . j p g Fin Linea I n i c i o Linea Nombre = f o n d o d e r e c h a Row 0 = 100 Row F = 400 Col 0 = 0 Col F = 0 L i m i t e I n f e r i o r = 3 2 . 0 , −15000.0 L i m i t e S u p e r i o r = 3 2 . 0 , −20000.0 Mascara = m a s k f o n d o d e r 1 . j p g Mascara = m a s k f o n d o d e r 2 . j p g Fin Linea I n i c i o Linea Nombre = f o n d o i z q u i e r d a Row 0 = 100 Row F = 400 Col 0 = 0 Col F = 0 Limite I n f e r i o r = 32.0 , 0.0 L i m i t e S u p e r i o r = 3 2 . 0 , −5000.0 Mascara = m a s k f o n d o i z q 1 . j p g Mascara = m a s k f o n d o i z q 2 . j p g Fin Linea 53 5.2. Partido 2 Figura 5.3: Captura del partido Real Madrid - Pamesa.(1) 54 5.2. Partido 2 Figura 5.4: Captura del partido Real Madrid - Pamesa.(2) 55 5.2. Partido 2 Durante las pruebas realizadas se han encontrado problemas para detectar las lı́neas de fondo cuando se producen transiciones de una parte del campo a la otra. La calidad del vı́deo produce que las lı́neas se vean difuminadas y la aplicación no encuentra pı́xeles que coincidan con las máscaras de la lı́nea (figura 5.5). Este problema se intentó resolver añadiendo nuevas máscaras a las lı́neas de fondo pero no se consiguió mejorar el resultado. De todas formas este problema no es tan importante de cara al objetivo del proyecto ya que lo que se desea realmente es obtener la posición de las lı́neas cuando se realiza un ataque estático y no en la transición entre ataque y defensa. Figura 5.5: Problemas en las transiciones En general los resultados obtenidos con las pruebas realizadas son satisfactorios aunque existen momentos puntuales en los cuales no se localiza alguna de las lı́neas de la pista. Se han detectado algunas de las causas que pueden provocar este hecho: Calidad del vı́deo. Lógicamente la calidad con la que se ha grabado el partido afectará a la detección de las lı́neas. Como se mencionado anteriormente en las pruebas realizadas se han encontrado problemas con los movimientos laterales de la cámara que provocan que la imagen quede difuminada. 56 5.2. Partido 2 Iluminación de la pista puede cambiar de una zona del campo a otra. Este problema se puede resolver creando máscaras en las zonas con distinta iluminación. Cambios en la iluminación. Este problema es parecido al anterior pero se diferencia en que los cambios de iluminación son puntuales, creados por ejemplo por los flashes de las cámaras o por los reflejos de la publicidad en el parquet. Angulación de las lı́neas. La posición de las lı́neas con respecto a la cámara puede variar en las distintas zonas del campo. Por lo tanto se deberán crear distintas máscaras cuando se produzca este hecho. Con respecto al tiempo de ejecución de la aplicación hay que decir que dependerá en gran medida del número de máscaras utilizadas para cada lı́nea y del tamaño de las mismas. También cabe destacar que el tiempo empleado en procesar cada uno de los frames también puede cambiar ya que las zonas de búsqueda no siempre tendrán la misma superficie. En las pruebas realizadas los tiempos de ejecución promedio han sido aproximadamente de 0.8 segundos por frame para el partido 1 y de 0.5 segundos por frame para el segundo partido. Esta diferencia de tiempos se debe a que en el partido 1 ha sido necesario el uso de más máscaras porque no todas las zonas de la pista tenı́an la misma iluminación. 57 5.2. Partido 2 58 Capı́tulo 6 Futuras ampliaciones Como posibles ampliaciones tomando como punto de partida este proyecto, y con el fin de que este proyecto funcionara mejor, se podrı́a modificar el algoritmo para la detección de las lı́neas para intentar evitar los problemas encontrados en las transiciones entre ataque y defensa. Otra mejora a realizar serı́a la detección del resto de lı́neas que componen una pista de baloncesto como serı́an la lı́nea del centro del campo y las lı́neas que delimitan la zona. Como ya se ha mencionado anteriormente este proyecto serı́a el punto de partida de un proyecto de mayor tamaño que permitiera sacar estadı́sticas sobre cada uno de los jugadores durante un partido. Por ejemplo, serı́a interesante poder conocer la distancia recorrida por un jugador o las zonas del campo por las que se mueve. Para esto se considera esencial conocer la posición de las lı́neas del campo, ya que se utilizarı́an como referencia para saber la posición de los jugadores en el campo. 59 Figura 6.1: Ampliación del proyecto para averiguar la posición de los jugadores utilizando la posición de las lı́neas de la pista 60 Capı́tulo 7 Conclusiones 7.1 Conclusiones objetivas Se presenta un proyecto que consiste en el desarrollo de una aplicación capaz de detectar las lı́neas de una pista de baloncesto en un vı́deo deportivo. A su vez también se ha desarrollado una interfaz gráfica que permita al usuario trabajar con la aplicación anteriormente mencionada de una manera más cómoda. La aplicación desarrollada ha sido diseñada como parte inicial de un futuro proyecto que permita analizar un partido de baloncesto de forma automática y obtenga estadı́sticas de los jugadores, como por ejemplo la distancia recorrida o las zonas de la pista por las que se mueve. En la realización de este proyecto, se ha tenido total libertad en la toma de decisiones, tanto en la forma de trabajar, de elegir las tecnologı́as a utilizar, etcétera, para diseñar y dar solución a los problemas que se iban apareciendo a lo largo del proyecto. También se ha de mencionar que se ha intentado que el código desarrollado sea legible para facilitar futuras ampliaciones del proyecto. Tras la conclusión del proyecto, se puede afirmar que las aplicaciones desarrolladas cumplen con los requisitos planteados al principio de este. Los resultados obtenidos con los algoritmos implementados han sido buenos ya que se encuentran las lı́neas de la pista durante la mayor parte del tiempo. 61 7.2. Conclusiones personales 7.2 Conclusiones personales La realización de este proyecto me ha permitido conocer de cerca la realización al completo de un proyecto informático. El desarrollo de esta aplicación supuso una gran motivación debido a que previamente al desarrollo de este proyecto no habı́a realizado nada relacionado con la visión por computador durante mi formación académica. Debido a este hecho no estaba familiarizado con la librerı́a OpenCv utilizada en la realización de este proyecto. La elección de este proyecto ha propiciado que haya tomado contacto con un campo tan fascinante y novedoso como es la visión por computador, siendo consciente de las posibilidades de estudio y desarrollo que ofrece. 62 Bibliografı́a [1] Información sobre el Baloncesto. http://es.wikipedia.org/wiki/Baloncesto [2] Información sobre la pista de baloncesto. http://es.wikipedia.org/wiki/Baloncesto#La_cancha [3] Información sobre la visión por computador http://es.wikipedia.org/wiki/Visi%C3%B3n_artificial [4] Gary Bradsky, Adrian Kaehler. Learning OpenCV: Computer Vision with the OpenCV Library. Editorial O’Reilly. Primera edición, 2008. [5] OpenCv C++ Reference http://opencv.willowgarage.com/documentation/cpp/index.html [6] Ajuste por mı́nimos cuadrados. http://es.wikipedia.org/wiki/Regresi%C3%B3n_lineal [7] Ajuste de una recta por mı́nimos cuadrados. http://www.uv.es/jbosch/PDF/RectaMinimosCuadrados.pdf [8] Referencia de .NET Framework http://msdn.microsoft.com/es-es/library/t7yeed4c.aspx 63