Es gibt eine Reihe von Videos, die ich von verschiedenen Videospielen verarbeiten möchte, um verschiedene "Zustände" in ihnen zu erkennen.
Das erste Spiel, das ich in Angriff nehme, ist eine Ausgabe von Super Street Fighter 4 .
Darin möchte ich erkennen, wann der Bildschirm "vs" angezeigt wird. Hier ist ein Beispiel für einen Frame des Videos:
(aus ~ 10s markiert von diesem Video )
Wenn ich das "vs" erkennen könnte, könnte ich erkennen, dass es sich bei dem Videobild tatsächlich um den "vs" -Bildschirm handelt, auf dem ich nach anderen Informationen suchen kann (sagen wir, ich werde es vorerst verwenden, um es zu verwenden) Ermitteln Sie den Zeitstempel im Video, in dem das Spiel beginnen soll.
Das heißt, hier ist, was über die Frames aus den Videos, die ich verarbeiten werde, angenommen werden kann (dies ist nicht das einzige Video, es gibt Tausende, wenn nicht Zehntausende oder Hunderttausende von Videos, aber das Problem der Skalierung bei der Verarbeitung davon viele Videos sind eine ganz andere Domain):
- Ich würde es vorziehen (aber es ist nicht notwendig), das Bild mit der niedrigsten Auflösung mit zuverlässigen Ergebnissen zu verarbeiten (niedrigere Auflösungen = schnellere Verarbeitungszeit). Das obige Bild ist 480 x 270 Pixel groß ( aus einem YouTube-Video mit einer
fmt
18 ), aber sie können in verschiedenen Größen vorliegen (ich habe YouTube-Videos mitfmt
18, aber Abmessungen 640 x 360 Pixel). - Die meisten Videos werden direkt eingezogen
- Die meisten Videos haben ein Seitenverhältnis von 16: 9
- Der rötliche Hintergrund wird animiert, befindet sich jedoch im Allgemeinen in dieser orangeroten Farbe (es sind Flammen).
- Manchmal wird ein Abzeichen über dem unteren Teil des "vs" ein- und ausgeblendet, um eine Version anzuzeigen (die wichtig ist, aber momentan nicht), die das "vs" wie folgt verschleiern könnte:
(entnommen aus der ~ 3s-Markierung in diesem Video ; beachten Sie auch, dass die oben genannte Auflösung 640 x 360 Pixel beträgt)
- Die Größe und Position des "vs" wird im Verhältnis zu anderen Direkt-Feed-Videos ungefähr gleich sein (ich habe dies noch nicht überprüft, aber ich weiß, dass es sich nicht bewegt)
- Die Zeichen werden aus einem Pool von mehr als 30 auf jeder Seite ausgewählt (mit anderen Worten, diese Bereiche des Rahmens variieren)
- Die Videos sind in der Regel zwei bis vier Minuten lang und liegen zwischen 4.000 und 6,00 Bildern. Es kann jedoch längere Videos geben (möglicherweise zwei Stunden), in denen verschiedene andere Spiele und Live-Action eingeschnitten sind. Diese Videos sind nicht so wichtig, aber wenn mir eine Lösung sagt, wo ein bestimmtes Spiel im größeren Gesamtvideo auftaucht, ist das großartig
- Die native Auflösung der Aufnahmen beträgt 720p, sodass ein Basisbild des "vs" in einer Größe aufgenommen werden kann, die als "native" Größe angesehen wird.
Letztlich bin ich diese Pipeline in .NET - Code suchen, aber das ist nicht Super wichtig, die Proof-of-concept ist hier wichtiger als auch das Verständnis der beteiligten Techniken , so dass ich übersetzen kann und optimieren es für .NET sowie für andere Videos anderer Spiele des gleichen Genres (wenn ich die signifikanten Diskriminatoren heraussuchen kann, und Videos von beispielsweise Ultimate Marvel gegen Capcom 3 , Street Fighter x Tekken , BlazBlue: Continuum Shift usw.).
Ich tauche auch meine Zehen in Mathematica ein und habe Home-Version 8.0, daher ist ein Proof-of-Concepts in dieser Umgebung ebenfalls mehr als willkommen.
quelle
Antworten:
Wenn das "VS" ziemlich gleich ist (abgesehen von einigen Ausweisüberlagerungen wie im zweiten Beispiel), können Sie mithilfe einer einfachen Kreuzkorrelation das Vorhandensein der Vorlage in Ihrem Videorahmen erkennen. Ich habe eine ähnliche Frage dazu in MATLAB on Stack Overflow beantwortet . Sie können so etwas wie den "Zauberstab" in Photoshop verwenden, um den "VS" aus dem Rahmen auszuwählen und eine Vorlage zu erstellen. Ich habe dies getan und das Bild binärisiert , um diese Vorlage zu erhalten .
Wenn Sie sich die verschiedenen Farbkanäle (RGB) in Ihren beiden Bildern ansehen, scheint der rote Kanal der beste zu sein, um Ihre Vorlage zu erkennen.
Sie können jetzt den roten Kanal mit Ihrer binärisierten Vorlage kreuzkorrelieren und sollten einen Peak an der Position der Vorlage erhalten. Ich beschließe, die rote Vorlage ebenfalls zu schwellen und zu binarisieren, obwohl Sie sie erkennen können, ohne dies zu tun. Ich bevorzuge die Verwendung einer Distanzfunktion anstelle von rohen Kreuzkorrelationswerten, da diese gegenüber falsch positiven Ergebnissen tendenziell etwas robuster ist. Ich kenne C # /. NET nicht, aber hier ist ein Überblick über den Ansatz in Mathematica:
das gibt Ihnen die folgenden. Der weiße Punkt markiert den Bereich mit dem Mindestabstand in jedem der beiden Bilder
Sie können auch darauf aufbauen und selbst ein robusteres Schwellenwertkriterium implementieren. Im Moment werde ich nur die Erkennung zum Nutzen anderer hervorheben:
Sie können das Obige mit einer kombinierten Funktion erzeugen:
Hier gibt es viel Verbesserungspotential. Ich bin ein Sessel-Hobbyist in der Bildverarbeitung, daher weiß ich nicht, was die schnellsten Algorithmen sind. Es gibt jedoch einige Dinge, die Sie untersuchen könnten:
quelle