Está en la página 1de 4

Comentarios a la función ballCandidates.

m
Alex Vallmitjana enero 2018
Este documento es una breve descripción de la función ballCandidates.m que se utiliza
durante la ejecución del programa principal TennisTracker1.m. La función se llama a cada
fotograma y sirve para detectar candidatos a pelota en los objetos que se han movido
respecto al fotograma anterior. Los criterios para seleccionar candidatos son área (el
tamaño en píxeles) y eccentricitat (el grado de circularidad del objeto). Realmente el
parámetro importante es área, la excentricidad descarta pocos objetos y seguramente se
podría eliminar el filtro sin demasiados cambios.

1. Llamada de la Función

La función se llama a la línea 185 del código principal (Fig.1). La variable de entrada D es
una matriz que tiene el mismo tamaño que el fotograma que se está examinando en ese
momento donde sólo hay ceros (0) o unos (1). Unos corresponden a zonas que han
sobrevivido el umbral de movimiento determinado por la constante UMB aplicada sobre la
diferencia del fotograma actual con el fotograma acumulado de los pasados (línea 168 del
código madre). Son regiones que han cambiado respecto a los fotogramas anterior. Los
ceros son regiones que no han superado el umbral de movimiento, y por tanto que no han
cambiado respecto a los fotogramas anteriores.

Fig. 1: Llamada dentro del código madre.

2.Cuerpo de la Función

Debido a que la pista se ve con una perspectiva conocida y sabemos que el campo de
visión incluye la pista entera podemos saber con antelación el tamaño que debe tener una
pelota en función de su posición vertical. Un balón en la parte baja del fotograma debe
aparecer como un objeto mucho mayor que si la vemos en la parte alta del fotograma
debido a que la de abajo se encuentra mucho más cerca. La relación entre el tamaño y la
posición vertical está modelada como un polinomio de segundo grado, los coeficientes se
declaran al principio como constantes (Fig.2).

Fig. 2: Declaración de constantes.


Los coeficientes están declarados en una sola variable de 3 componentes,
correspondiente a los 3 coeficientes c, b y en el modelo que se ha usado:

A = c + by + ay2

Estamos diciendo que sabiendo la posición en píxeles medidos desde la parte superior
del fotograma y, podemos saber el área A que esperamos que tenga un balón en aquella
posición. Obviamente el modelo no contempla las pelotas que se separan mucho en la
dirección vertical (por ejemplo si el jugador más cercano tira el balón arriba para hacer el
servicio, ese balón aparecerá mucho mayor de lo esperado por su posición y). los tres
coeficientes c, b y a están puestos en este orden porque es el orden con el que se
declaran a la variable coef: el primero es el término independiente c, el segundo es el
término de primer orden b y el tercero es el término de segundo orden a. Cabe decir que
estos tres coeficientes han sido calculados por un fotograma respecto 1080pix en la
dirección vertical, deberían modificarse en función de esta magnitud.

Fig. 3: Matriz de etiquetas.


La siguiente línea (Fig.3) sirve para etiquetar cada objeto aislado dentro de la matriz
binaria de entrada D. Se llama a la función bwlabel, intrínseca de Matlab, que dada una
matriz binaria (sólo valores 0 o 1), devuelve una matriz del mismo tamaño con etiquetas
diferentes para cada región que está desconectada del resto. Así, a la nueva matriz, los
ceros se quedan igual, y los píxeles que tenían valor 1 son devueltos con una etiqueta
igual si están conectados y diferente si no. Como ejemplo en la figura 4 aparece una
posible entrada y salida de la función bwlabel. La salida contiene valores crecientes de 1
al número total de regiones, y la adjudicación de cada número a cada región es arbitraria
a efectos del código. El parámetro de entrada 4 sirve para determinar lo que se considera
conectado, si a 4 vecinos u 8 vecinos. En el ejemplo de la figura, las regiones 1 y 2 no se
consideran conectadas aunque que hay una conexión en diagonal entre la parte inferior
derecha de la región 1 y la superior izquierda de la región 2. Utilizando el parámetro de
entrada 8 en lugar de 4 estas dos regiones habrían salido con la misma etiqueta y el
número total de regiones sería 2.

Fig. 4: La matriz binaria de la izquierda contiene un total de 17 elementos igual a 1. La


salida de bwlabel es una matriz del mismo tamaño con etiquetas diferentes en cada uno
de los elementos que pertenecen a una región desconectada del resto (fuente:
MathWorks).
Seguidamente se miden las propiedades relevantes de cada una de las regiones
independientes obtenidas (Fig.5) y se separan en variables independientes (Fig.6). En
este punto la variable A es un vector columna con tantas filas como regiones se ha
encontrado en la matriz de entrada y cada componente dice el número de píxeles que
ocupa la región correspondiente. La variable C es una matriz de dos columnas y tantas
filas como regiones, con las coordenadas X e Y del centroide de cada región (el centro de
gravedad o coordenada media). También se guarda a la variable Y la segunda columna de
modo que tenemos un vector con sólo la coordenada vertical de cada objeto. Finalmente
la variable E es un vector columna con la excentricidad de cada región (la excentricidad
de la elipse que más se parece al objeto en cuestión).

Fig. 5: Medida de propiedades de cada objeto encontrado

Fig. 6: Valores medidos para las propiedades de cada objeto.

El condicional que aparece entre estas dos líneas es para descartar la situación en que no
se ha detectado ningún objeto y ahorrar las llamadas a las funciones que calculan las
propiedades (Fig.7).

Fig. 7: Condicional de presencia de objetos.


La siguiente comando se encarga de calcular la ratio entre el tamaño esperado del objeto
si fuera una pelota en la posición en la que está y el tamaño que tiene (Fig.8). Así, la
variable Afac se calcula como un cociente entre el modelo aplicado a la variable Y (el
numerador es el tamaño esperado de una pelota a la posición del objeto) y la variable A
(el denominador es el tamaño medido del objeto). Hay que notar que este cociente se
hace para el vector entero, es decir que si había 100 objetos, el vector Y contenía 100
componentes, y el vector A también, de manera que el resultado del cociente es un vector
de ratios Afac con 100 componentes (por esta razón el símbolo de producto y división
tienen un punto delante, corresponde a hacer la operación componente a componente).
La ratio calculada es 1 cuando el objeto es exactamente igual en área que lo esperado
según el modelo, mayor que 1 si el objeto es más pequeño de lo esperado, y más
pequeña que 1 si el objeto es mayor.
Fig. 8: Cálculo de la ratio entre el tamaño esperado para un balón en la posición vertical
donde se encuentra el objeto detectado y el tamaño medido del objeto detectado.
Seguidamente se filtra según la ratio obtenida (Fig.9). La variable cand contiene ahora los
índices de las componentes Afac que cumplen que están entre los valores especificados.
En este caso se descarta objetos 4 veces más pequeños que el esperado y 10 veces
mayores que lo esperado.

Fig. 9: Filtrado según tamaño.


Finalmente se filtra según excentricidad (Fig.10). En este caso se aceptan objetos con
excentricidad menor que .95 (filtro poco restrictivo, sirve para descartar trozos de red).

Fig. 10: Filtrado según excentricidad.

3. Salida de la Función
La función devuelve la variable C, que es una lista de coordenadas, una por cada región.
En este punto la variable C contiene las coordenadas de todas las regiones, el pedido de
la línea 23 (Fig.11) se encarga de seleccionar sólo aquellas que han sobrevivido al filtro.
La llamada se hace haciendo indexación doble debido a que para el filtro de tamaño se ha
obtenido la lista de índice (Fig.9), y que para el filtro de excentricidad se ha obtenido los
índices de la lista de índices del filtro anterior.

Fig. 11: Lista de coordenadas de los objetos que han sobrevivido a los filtros.
Finalmente, para el caso de que no se encontró ningún objeto, la función devuelve una
variable C vacía. (Fig.12)

Fig. 12: En caso de que no había objetos detectados, la función devuelve una lista vacía.

También podría gustarte