Hay una serie de videos que estoy buscando procesar de diferentes videojuegos para detectar varios "estados" en ellos.
El primer juego que estoy abordando es cualquier edición de Super Street Fighter 4 .
En él, me gustaría detectar cuándo aparece la pantalla del personaje "vs". Aquí hay un ejemplo de un cuadro del video:
(tomado de la marca de ~ 10s de este video )
Si pudiera detectar el "vs", sería capaz de detectar que el cuadro de video es de hecho la pantalla "vs", lo que me permitiría buscar otra información (por ahora, digamos que lo usaré para detectar la marca de tiempo en el video donde el partido está por comenzar).
Dicho esto, esto es lo que se puede suponer acerca de los cuadros de los videos que voy a procesar (este no es el único video, hay miles, si no decenas o cientos de miles de videos, sino el problema de la escala en el procesamiento que muchos videos es un dominio completamente diferente):
- Preferiría (pero no es necesario) procesar la imagen con la resolución más baja posible con resultados confiables (resoluciones más bajas = tiempo de procesamiento más rápido). La imagen de arriba es de 480 x 270 píxeles (tomada de un video de YouTube con un
fmt
18 ) pero pueden venir en diferentes tamaños (obtuve videos de YouTube confmt
18 pero con dimensiones de 640 x 360 píxeles). - La mayoría de los videos serán de alimentación directa
- La mayoría de los videos tendrán una relación de aspecto de 16: 9
- El fondo rojizo estará animado, pero generalmente estará dentro de ese color rojo anaranjado (es llamas)
- A veces habrá una insignia que se desvanece dentro y fuera de la parte inferior de la "vs" para indicar una versión (que será importante, pero no en este momento), que podría ofuscar la "vs", así:
(tomado de la marca ~ 3s de este video ; también tenga en cuenta que lo anterior es una resolución de 640 x 360 píxeles)
- El tamaño y la posición del "vs" será más o menos el mismo (no lo he verificado aún, pero sé que no se mueve) en proporción a otros videos de alimentación directa
- Los personajes serán elegidos de un grupo de más de 30 en cada lado (en otras palabras, esas áreas del marco variarán)
- Los videos generalmente durarán entre dos y cuatro minutos, con entre 4,000 y 6,00 cuadros. Sin embargo, puede haber videos más largos (quizás dos horas) que tienen varios otros juegos y acción en vivo. Estos videos no son tan importantes, pero si una solución me dice dónde aparece un determinado juego en el video general más grande, genial
- La resolución nativa de las capturas es 720p, por lo que se puede tomar una imagen de referencia del "vs" en lo que se consideraría un tamaño "nativo".
En última instancia, estoy buscando codificar esta canalización en .NET, pero eso no es muy importante, la prueba de concepto es más importante aquí, así como una comprensión de las técnicas involucradas para poder traducirla y optimizarla para .NET así como para otros videos de otros juegos del mismo género (si puedo elegir los discriminadores significativos y videos de, por ejemplo, Ultimate Marvel vs. Capcom 3 , Street Fighter x Tekken , BlazBlue: Continuum Shift , etc.).
También estoy sumergiendo mis pies en Mathematica y tengo la versión casera 8.0, por lo que una prueba de conceptos en ese entorno es más que bienvenida.
fuente
Respuestas:
Si el "VS" es más o menos el mismo (salvo para algunas superposiciones de credenciales como en el segundo ejemplo), puede usar una correlación cruzada directa para detectar la presencia de la plantilla en su cuadro de video. Respondí una pregunta similar sobre cómo hacer esto en MATLAB en Stack Overflow. Puede usar algo como la herramienta "varita mágica" en Photoshop para seleccionar el "VS" del marco para crear una plantilla. Lo hice y binaré la imagen para obtener esta plantilla .
Al observar los diferentes canales de color (RGB) en sus dos imágenes, el canal rojo parece ser el mejor para detectar su plantilla.
Ahora puede realizar una correlación cruzada del canal rojo con su plantilla binarizada y debería obtener un pico en la ubicación de la plantilla. Elijo limitar y binarizar la plantilla roja también, aunque puedes detectarla sin hacerlo. Prefiero usar una función de distancia en lugar de valores de correlación cruda sin procesar, ya que tiende a ser un poco más robusto contra los falsos positivos. No sé C # /. NET, pero aquí hay un resumen del enfoque en Mathematica:
que te da lo siguiente. El punto blanco marca la región con la distancia mínima en cada una de las dos imágenes.
También puede construir sobre esto e implementar un criterio de umbral más robusto propio. Por ahora, solo resaltaré la detección en beneficio de otros:
Puede generar lo anterior con una función combinada:
Hay mucho potencial de mejora aquí. Soy un aficionado al sillón en el procesamiento de imágenes, por lo que no sé cuáles son los algoritmos más rápidos. Sin embargo, hay algunas cosas que podría considerar:
fuente