El algoritmo de detección de jugadas es algo que ha sufrido bastantes modificaciones para encontrar la forma más óptima de adaptarlo a las condiciones específicas de nuestra práctica.
Para intentar resumir el tema, voy a comentar las claves a tener en cuenta, y a explicaros el algoritmo final que hemos desarrollado.
El algoritmo de detección de jugadas se basa en un concepto muy simple: detectamos movimiento y esperamos a que haya pasado un tiempo sin movimiento. Hay que tener en cuenta que cuanto más acotada esté la zona de detección, más fiabilidad vamos a tener. Normalmente, el problema es que esta zona no puede ser acotada, ya que hay que detectar movimiento en todo el rango de visión. Pero en nuestro casi si que se podía acotar, ya que nosotros sólo queremos ver si hay movimiento en el tablero o no, no nos interesa el resto de la zona. Por tanto, nuestro algoritmo de detección se aplica siempre sobre la imagen del tablero ya tratada, no sobre la original obtenida por la webcam.
Lo primero es detectar movimiento. Para esto lo que hacemos es comparar la imagen actual umbralizada con la anterior umbralizada, para eliminar ruido y que se produzcan falsos positivos por el tema de la diferencia de iluminación. Nosotros hemos modificado un poco este concepto, y lo que hacemos es tener una imagen para comparar que se actualiza cada 5 frames. El por qué de esto y no comparar con el frame anterior, es que a veces la diferencia entre imágenes consecutivas es demasiado pequeña, pero entre 3, 4 o 5 frames es ya suficiente como para saber si hay movimiento o no. Podríamos poner más frames, ya que para detectar movimiento no nos importa, pero si nos perjudicaría para la “no detección de movimiento”, como veremos a continuación.
Lo segundo es, que una vez detectado movimiento, hay que esperar un número de frames sin movimiento. Cuando se ha producido movimiento, empezamos a contar frames sin movimiento. Cuando se llega a un número determinado de frames sin movimiento, es que se ha realizado una jugada. Cuantos más frames pongamos como condición, más lents será la detección, pero más fiable, y cuanto menos frames pongamos como condición, más rápida será la detección, pero menos fiable.
Y la gran pregunta es obligada: ¿cómo hacer un sistema de detección rápido pero fiable?
La repuesta es inmediata: haz un sistema de detección rápido, que no es fiable, y luego elimina los falsos positivos. Para detectar los falsos positivos es muy sencillo. ¿Os acordáis del post anterior, en la detección de fichas, que poníamos un límite superior de 25 px? Pues aqui está su aplicación: si una casilla blanca tiene más de pi r_max^2 de negro, es que hemos producido un falso positivo de detección de jugada. Seguramente el jugador todavía tiene el brazo encima del tablero. Para más seguridad, nosotros también miramos que las casillas negras no tengan un porcentaje considerable de blanco, ya que el jugador podría tener el brazo encima del tablero pero ir vestido de blanco (o un color claro).
Alternativas descartadas
Surgieron varias opciones para la detección de jugadas como poner un control mecánico que pulsar cada vez que se realiza una jugada, como se hace en ajedrez. Era más fiable, pero no cumplía con los requisitos del proyecto de realizar todo el reconocimiento mediante Visión Computacional.
** Como en el post anterior, subiré las imágenes y el código el próximo día.
No hay comentarios:
Publicar un comentario