Erkennen eines festen Vorlagenbilds aus einem halbkonstanten Videobild


8

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:

Akuma gegen Ryu - SSF4
(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 fmt18 ), aber sie können in verschiedenen Größen vorliegen (ich habe YouTube-Videos mit fmt18, 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:

Sagat gegen Adon - SSF4: AE 2012
(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.


Ich bin gespannt, warum Sie andere Ansätze fordern. Haben Sie den von Yoda vorgeschlagenen Kreuzkorrelationsansatz ausprobiert? Es ist eine sehr einfache, natürliche Technik zur Lösung dieser Art von Problem, und ich denke, sie sollte für Sie gut funktionieren.
Jason R

@ JasonR Entschuldigung für die späte Antwort. Yoda und ich haben den Ansatz tatsächlich ausführlich besprochen und er funktioniert gut für die Situation, da er oben eng begrenzt ist (diese Technik berücksichtigt keine Scherung oder Translation). Trotzdem sind wir beide daran interessiert zu sehen, ob es andere gibt, die unterschiedliche Ansätze verfolgen, und ein Kopfgeld ist ein natürlicher Weg, dies zu fördern.
CasperOne

Antworten:


9

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.

Geben Sie hier die Bildbeschreibung ein

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:

image = Import["http://i.stack.imgur.com/7RwAh.png"];
ImageCorrelate[ Binarize[ColorSeparate[image][[1]], 0.1], vsTemplate, 
   NormalizedSquaredEuclideanDistance] // Binarize[#, 0.2] & // ColorNegate

das gibt Ihnen die folgenden. Der weiße Punkt markiert den Bereich mit dem Mindestabstand in jedem der beiden Bilder

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

NMN+M1

Sie können auch darauf aufbauen und selbst ein robusteres Schwellenwertkriterium implementieren. Im Moment werde ich nur die Erkennung zum Nutzen anderer hervorheben:

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Sie können das Obige mit einer kombinierten Funktion erzeugen:

detectVS[i_Image] := 
 Module[{mask = 
    ImageCorrelate[ Binarize[ColorSeparate[i][[1]], 0.1], vsTemplate, 
       NormalizedSquaredEuclideanDistance] ~Binarize~ 0.2 // 
     ColorNegate},

  ColorConvert[i, "Grayscale"]~ImageAdd~ 
   ImageMultiply[i, Image[mask]~Dilation~ DiskMatrix@100]
  ]

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:

  1. Wenn sich der VS in jedem Video ungefähr an derselben Stelle befindet, müssen Sie nicht mit dem gesamten Bild kreuzkorrelieren - Sie können einfach ein Feld in der Mitte auswählen und damit arbeiten.
  2. Dies kann eine teure Operation für jeden einzelnen Frame sein. Wenn Sie sich Ihr Video ansehen, haben Sie jedoch Frames im Wert von etwas mehr als 4 Sekunden, in denen der VS und die Charakternamen angezeigt werden. Daher würde ich vorschlagen, dass Sie einen Frame jede Sekunde oder höchstens alle 2 Sekunden analysieren, um sicherzustellen, dass Sie auf einem mit einem VS landen. Sobald Sie VS erkannt haben, können Sie mit der Verarbeitung jedes aufeinanderfolgenden Frames beginnen, um den nächsten Teil Ihrer Verarbeitung auszuführen.
  3. Dieser Prozess sollte in angemessenem Maße robust gegenüber Größenänderungen sein, dh Sie könnten Kreuzkorrelationen für kleine Bilder durchführen, benötigen jedoch eine passende Vorlage. Wenn Sie wissen, dass Ihre Bilder bestimmte Set- / Standardgrößen haben, können Sie für jede Vorlage Vorlagen erstellen und je nach Bildgröße die entsprechende Vorlage auswählen.
  4. Die Schwellenwerte, die ich gewählt habe, waren durch Versuch und Irrtum, aber sie scheinen für die beiden obigen Bilder zu funktionieren, und von den anderen verwandten Youtube-Videos werden sie wahrscheinlich für die meisten von ihnen funktionieren. Ein spezialisierterer Ansatz würde darin bestehen, es in Blöcke aufzuteilen und das Histogramm zu betrachten, um zu schließen, ob es zu VS gehört oder nicht - vielleicht ein Bayes'scher Klassifikator. Stellen Sie jedoch unbedingt sicher, dass Sie dies tun müssen , bevor Sie beginnen. Es scheint mir, dass es einfach genug ist, dass Sie es nicht brauchen.

Angesichts der Tatsache, dass es eine "native" Größe für das "vs" bei 720p gibt (siehe letzter Aufzählungspunkt zu der aktualisierten Frage), kann diese angesichts der Abmessungen des beobachteten Videos automatisch skaliert werden (ich nehme an), oder würde dies zu einer Verzerrung führen die Kreuzkorrelation ergibt zu viel?
CasperOne

@casperOne Sie sollten in der Lage sein, es zu verkleinern und es trotzdem zum Laufen zu bringen, solange Sie sicher sind, dass Ihre Testbilder nur verkleinert (dh nicht beschnitten) sind. Mein Anliegen war in Fällen, in denen die Bildgröße nicht so ist, wie sie sein soll. Wenn Sie beispielsweise ein 450x250-Bild hatten, das ursprünglich 480x270 sein sollte, aber ausgeschnitten wurde, führt eine Verkleinerung eines von 640x480 erhaltenen VS nicht zu einer guten Übereinstimmung (es könnte jedoch nahe genug sein). Wenn Sie jedoch wissen, dass alle diese Bilder 450 x 250 groß sein werden, können Sie einfach eine Vorlage aus einem dieser Frames verwenden.
Lorem Ipsum
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.