2011-05-06 18 views
7

Hola, estoy codificando un sistema de visión de robot de juego de ajedrez simple, estoy tratando de mejorar algunas investigaciones previas para permitir la cámara y se puede usar un juego de ajedrez estándar. para moverse durante el juego Hasta ahora puedo ubicar el tablero en una imagen adquirida mediante cámara web, y quiero detectar movimientos tomando la diferencia de imágenes sucesivas para determinar qué ha cambiado y luego uso la información previa sobre la ocupación del tablero para detectar movimientos.Detectando movimientos de ajedrez de diferencias de imagen sucesivas usando herramientas de OpenCV

Mi problema es que me parece que no puede detectar con fiabilidad los cambios en este momento, mi tubería actual es la siguiente: Restar dos imágenes -> Histograma igualar la imagen de diferencia -> erosionar y dilatan diferencia de imágenes para eliminar cambios menores -> hacer una copia binaria y no transformada de distancia -> Obtener la burbuja más grande (que corresponde al valor más alto después de DT y de relleno por inundación que blob) -> repetir otra vez hasta DT devuelve un valor suficientemente pequeño como para ignorar el cambio.

estoy cifrando todo esto en OpenCV y C++. pero mi inundación parece no llenar los blobs, por lo tanto, en la mayoría de los casos acabo de detectar un cambio. Lo intenté también usando cv::inpaint pero eso tampoco ayudó. Entonces mi pregunta es; ¿Estoy utilizando el enfoque incorrecto o de alguna manera turing puede hacer que la detección de cambios sea más confiable? En el caso de los primeros, ¿podría la gente sugerir rutas alternativas, preferiblemente codificables en C++/Python y/o OpenCV en un tiempo razonable?

gracias

Respuesta

3

El problema de conseguir un arreglo en el tablero y la detección de movimiento de las piezas puede ser resuelto de forma independiente, asumiendo que uno no se mueve el tablero a la vez que se mueve alrededor de piezas ..

algunas ideas sobre cómo me lo enfoque:

la detección de la orientación de la junta

tienes que ser capaz de manejar el tablero se hace girar en su lugar, como se también se movió mientras se mantenga un ángulo que le permita ver las piezas. Ayudaría si hubiera algo en la pizarra que pudieras identificar fácilmente (por ejemplo, un marcador en cada esquina), de modo que si pierdes la orientación (por ejemplo, alguien mueve la pizarra lejos de la cámara por completo) podrías encontrarla fácilmente de nuevo.

Para realizar un seguimiento de la placa, debe modelar la posición de la cámara con respecto a la placa en el espacio 3D. Este es el mismo problema que determinar la ubicación de la cámara que se mueve alrededor de una placa fija. Un problema de Egomotion. Una vez que resuelves eso, puedes pasar a la siguiente etapa, que es detectar movimiento y seguir objetos.

La detección de movimiento de las piezas

Esto probablemente la parte más simple del problema. Hay muchos algoritmos para la detección de objetos en video. Solo agregaría que puedes usar cuadros "clave". Lo que quiero decir con eso es identificar aquellos marcos en los que solo se ve el tablero antes y después de un solo movimiento. p.ej. no ves que la mano lo mueve oscureciendo las piezas, etc. Una vez que tienes el marco anterior/posterior, puedes descubrir qué se movió y dónde está ubicado en relación con el tablero.

Probablemente pueda salirse con la suya al no poder reconocer la forma de cada pieza si supone continuidad (es decir, que ha rastreado todos los movimientos desde la disposición inicial del tablero, lo cual es bien conocido).

+0

una última nota: aléjate de C++ para esto si pudiera. Probablemente lo haga mucho más rápido con Python.A menos, por supuesto, que encuentre una biblioteca realmente valiosa en C++ que solo tenga que usar. En ese caso, lo envolvería y lo usaría de python. –

+0

gracias por las sugerencias, no tengo miedo de abandonar completamente C++, puedo hacerlo todo con Python, estaba más interesado en la idea primero. Una de las limitaciones que tengo para la primera etapa es que la placa no necesita modificarse de ninguna manera (por lo que no hay marcadores o algo así), por lo tanto, realmente agradecería cualquier comentario teniendo esto en cuenta – makokal

+0

¿Puede confiar en los colores de ¿las piezas son negras/blancas? Si es así, puede hacer PCA en el tablero al principio e identificar los dos lados por su color. Pero a partir de ese momento tendrás que seguir el tablero para no perder la orientación. –

Cuestiones relacionadas