Il y a un certain nombre de vidéos que je cherche à traiter de différents jeux vidéo pour détecter divers "états" en eux.
Le premier jeu auquel je m'attaque est une édition de Super Street Fighter 4 .
Dans celui-ci, je voudrais détecter quand l'écran de caractère "vs" apparaît. Voici un exemple d' une image de la vidéo:
(extrait de la marque ~ 10s de cette vidéo )
Si je pouvais détecter le "vs", je serais alors en mesure de détecter que la trame de la vidéo est bien l'écran "vs", ce qui me permettrait de rechercher d'autres informations (pour l'instant, disons que je vais l'utiliser pour détecter l'horodatage dans la vidéo où le match est sur le point de commencer).
Cela dit, voici ce que l'on peut supposer des images des vidéos que je vais traiter (ce n'est pas la seule vidéo, il y a des milliers, sinon des dizaines ou des centaines de milliers de vidéos, mais la question de l'échelle dans le traitement qui de nombreuses vidéos est un domaine complètement différent):
- Je préférerais (mais ce n'est pas nécessaire) traiter l'image à la résolution la plus basse possible avec des résultats fiables (résolutions plus faibles = temps de traitement plus rapide). L'image ci-dessus est de 480 x 270 pixels (prise à partir d'une vidéo YouTube avec un
fmt
18 ) mais ils peuvent venir de différentes tailles (j'ai des vidéos YouTube avecfmt
18 mais avec des dimensions 640 x 360 pixels). - La plupart des vidéos seront alimentées directement
- La plupart des vidéos seront au format 16: 9
- Le fond rougeâtre sera animé, mais généralement dans cette couleur orange-rouge (ce sont des flammes)
- Parfois, il y aura un badge apparaissant dans la partie inférieure du "vs" pour indiquer une version (qui sera importante, mais pas pour le moment), qui pourrait obscurcir le "vs", comme ceci:
(tiré de la marque ~ 3s de cette vidéo ; notez également que ce qui précède est une résolution de 640 x 360 pixels)
- La taille et la position du "vs" vont être à peu près les mêmes (je n'ai pas encore vérifié cela mais je sais que cela ne bouge pas) proportionnellement aux autres vidéos à alimentation directe
- Les personnages seront choisis dans un pool de plus de 30 de chaque côté (en d'autres termes, ces zones du cadre varieront)
- Les vidéos durent généralement de deux à quatre minutes, avec entre 4 000 et 6 000 images. Cependant, il peut y avoir des vidéos plus longues (peut-être deux heures) avec divers autres jeux et des actions en direct. Ces vidéos ne sont pas aussi importantes, mais si une solution me dit où un certain jeu apparaît dans la vidéo globale plus grande, super
- La résolution native des captures est de 720p, donc une image de base du "vs" peut être prise à ce qui serait considéré comme une taille "native".
En fin de compte, je cherche à coder ce pipeline dans .NET, mais ce n'est pas super important, la preuve de concept est plus importante ici ainsi que la compréhension des techniques impliquées afin que je puisse le traduire et l'optimiser pour .NET ainsi que pour d'autres vidéos d'autres jeux du même genre (si je peux identifier les discriminants importants, et des vidéos de disons, Ultimate Marvel vs Capcom 3 , Street Fighter x Tekken , BlazBlue: Continuum Shift , etc.).
Je plonge également mes orteils dans Mathematica et j'ai la version familiale 8.0, donc une preuve de concept dans cet environnement est également la bienvenue.
la source
Réponses:
Si le "VS" est à peu près le même (sauf pour certaines superpositions de badges comme dans le deuxième exemple), vous pouvez utiliser une corrélation croisée simple pour détecter la présence du modèle dans votre image vidéo. J'ai répondu à une question similaire à ce sujet dans MATLAB sur Stack Overflow. Vous pouvez utiliser quelque chose comme l'outil "baguette magique" dans Photoshop pour sélectionner le "VS" dans le cadre pour créer un modèle. Je l'ai fait et binarisé l'image pour obtenir ce modèle .
En regardant les différents canaux de couleur (RVB) dans vos deux images, le canal rouge semble être le meilleur pour détecter votre modèle.
Vous pouvez maintenant intercorréler le canal rouge avec votre modèle binarisé et vous devriez obtenir un pic à l'emplacement du modèle. J'ai également choisi de seuiller et de binariser le modèle rouge, bien que vous puissiez le détecter sans le faire. Je préfère utiliser une fonction de distance plutôt que des valeurs de corrélation croisée brutes, car elle a tendance à être un peu plus robuste contre les faux positifs. Je ne connais pas C # /. NET, mais voici un aperçu de l'approche dans Mathematica:
ce qui vous donne ce qui suit. Le point blanc marque la région avec la distance minimale dans chacune des deux images
Vous pouvez ensuite utiliser ce qui précède dans votre prochaine étape comme vous le souhaitez. Notez que généralement, la corrélation croisée entraînera un surplomb. En d'autres termes (en utilisant un exemple 1D) si vous effectuez une corrélation croisée entre un signal à points et un signal à points, vous obtiendrez un résultat de point de long. L'implémentation de Mathematica s'occupe du surplomb pour vous. Cependant, je ne sais pas ce que fait C #, et vous voudrez peut-être garder cela à l'esprit (MATLAB ne le fait pas, et j'ai dû en tenir compte dans ma réponse liée ci-dessus).N M N+M−1
Vous pouvez également en tirer parti et implémenter un critère de seuillage plus robuste. Pour l'instant, je vais juste souligner la détection au profit des autres:
Vous pouvez générer ce qui précède avec une fonction combinée:
Il y a beaucoup de potentiel d'amélioration ici. Je suis un amateur de fauteuil au traitement d'image, donc je ne sais pas quels sont les algorithmes les plus rapides. Cependant, il y a quelques choses que vous pourriez examiner:
la source