Schneller ungefährer optischer Fluss / Bildverschiebung


9

Ich muss erkennen, wie schnell eine Kamera schwenkt (entweder horizontal / vertikal), um den Bediener zu warnen, langsamer zu werden.

Das gesamte Bild bewegt sich als Block, ich brauche keine tatsächliche Richtung (obwohl H oder V ein Bonus wäre) und ich brauche nur eine ungefähre Größe - dh. wird ausgelöst, wenn mehr als 'N' Pixel zwischen den Frames verschoben werden.

Bilder sind große und im Allgemeinen einheitliche kontrastarme Szenen. Ich habe keine offensichtlichen Highlights zu verfolgen. Ich muss es in Echtzeit (60 fps) und ohne die gesamte CPU nutzen.

Die Niave-Lösung besteht darin, einen RoI in der Mitte auszuwählen, Kanten zu finden, die Ähnlichkeit zwischen Bildpaaren zu berechnen, eines der Bilder um ein Pixel nach links / rechts / oben / unten zu verschieben, zu wiederholen - Minima zu finden.

Ich fragte mich, ob es eine intelligentere Lösung gab.

Antworten:


3

Wenn Sie nach einer einfachen Methode suchen , müssen Sie wahrscheinlich die Standardalgorithmen für die Bewegungsschätzung anwenden, die in der MPEG-Klasse von Komprimierungscodecs sehr ausgereift sind. Sie sind leicht zu verstehen und ich denke, Sie werden eine Menge gebrauchsfertiger Codes bekommen. Dieser Algorithmus erzeugt Block für Block einen Bewegungsvektor - und dann können Sie den bekanntesten Cluster finden und die durchschnittliche Richtung und Größe des Bewegungsvektors ermitteln.

MPEG4 - hat ein weiteres Schlüsselkonzept namens " Global Motion Compensation ", eine Technik, die versucht, zuerst Kamerabewegungen und Schwenks abzuschätzen und zu kompensieren. Das Schöne ist, dass solche Methoden je nach Komplexität einfacher oder erschöpfender sein können. Hier ist ein Beispielpapier und ein anderes Papier für dasselbe.

Im Allgemeinen ist das Schwenken der Kamera und die Bewegungsschätzung ein ziemlich etablierter Forschungsbereich. Hier ist eine Referenz: Papier und ein anderes Papier .

Zu diesem Thema. Sie finden sowohl strenge und genaue Algorithmen als auch einfache und schnelle.


Wenn ich mich bequem in eine MPEG-Bibliothek einbinden kann, die gut wäre, erinnere ich mich, dass GMC in Mpeg Kritik hatte. Ich dachte, es wäre ein gemeinsamer Bereich wegen der Stabilisierungsalgorithmen der Kamera
Martin Beckett

Sie können MPEG-Algorithmen definitiv einbinden (oder vielmehr extrahieren). Sie können FFMPEG als Bibliothek verwenden und diese extrahieren - dies kann jedoch schwierig werden. Alternativ können Sie lesen ordentlich Code von MSSG zu extrahieren.
Dipan Mehta

In Bezug auf die Kritik an GMC ist es mehr als vielversprechend, die Bitrate drastisch zu reduzieren und eine objektbasierte Codierung zu erstellen . Es ist jedoch nicht wirklich schwer, die Bewegungsparameter der Kamera abzuschätzen.
Dipan Mehta

danke, ich werde mir MSSG ansehen. Ich benutze ffmpeg, aber es ist keine einfache Bibliothek, Dinge einfach herauszuholen!
Martin Beckett

3

Dies mag eine langsame, schreckliche Lösung sein, aber Sie könnten eine FFT-basierte Kreuzkorrelation nachfolgender Frames durchführen und dann den Peak finden, um den Versatz zwischen Frames zu identifizieren. Möglicherweise nur für eine kleine Teilmenge des Bildes, um Prozessorzyklen zu sparen.

Es würde nicht mit Rotation oder drastischen Szenenwechseln von einem Bild zum nächsten funktionieren, und es gibt wahrscheinlich bessere Methoden. Dies ist eine Art "Ich habe einen Hammer, damit alles wie ein Nagel aussieht" -Lösung. Ich denke, dies ist genau wie Ihre naive Lösung, außer dass keine Kantenerkennung erforderlich ist und die FFT es viel schneller macht, als jeweils ein Pixel explizit zu verschieben.

Diese Frage ist ähnlich, und niemand schlägt etwas anderes als Kreuzkorrelation vor. Vielleicht ist es also nicht so schlimm: Verwenden Sie MATLAB, um den Versatz zwischen aufeinanderfolgenden Bildern zu berechnen


Danke, es ist leicht anzunehmen, dass FFT langsam ist, aber ich kann ein kleines 2 ^ n-Fenster machen. ps. Nur für die Suche stackoverflow.com/questions/1100100/…
Martin Beckett

3

Eine Möglichkeit, die Geschwindigkeit und die Richtung zu schätzen, besteht darin, eine "lokale" Flussschätzung von z. B. vier Fenstern in der Bildmitte vorzunehmen. Die Lucas-Kanade-Differentialmethode geht davon aus, dass die Verschiebung ungefähr konstant ist und daher als Gleichung gelöst werden kann.

Meine Schritt-für-Schritt-Anleitung wäre also:

  1. Holen Sie sich ein Pixelfenster in die Bildmitte, z. B. 20x20
  2. Berechnen Sie die Gradienten Ix und Iy.
  3. Teilen Sie das Verlaufsfenster in vier Teile, z. B. 4x10x10.
  4. Lösen Sie die vier linearen Gleichungen der kleinsten Quadrate mit dem nächsten Frame.
  5. Durchschnitt der vier Geschwindigkeitsvektoren.

Dies bestimmt die Richtung und Geschwindigkeit. Sie können jedoch ein gewichtetes Fenster verwenden, um es robuster zu machen. Schauen Sie sich die Lucas-Kanade-Methode für ihre Erweiterungen an.


0

Ich denke, Kreuzkorrelation ist ein guter Ansatz, um den Versatz zu finden. Wenn Sie dies jedoch sehr schnell tun möchten, können Sie versuchen, ihn auf eine einzige vertikale und eine einzige horizontale Scanlinie (dh durch die Bildmitte) zu beschränken. Wenn Sie die Kreuzkorrelation zwischen den Scanlinien in beiden Frames berechnen, erhalten Sie eine Annäherung an den horizontalen und vertikalen Versatz.


Dies mag funktionieren, aber wenn es diagonal geschwenkt wird, funktioniert es nicht gut, selbst wenn es beim seitlichen Schwenken nur ein wenig auf und ab geht. Ich denke, ein rechteckiger Teilbereich in der Bildmitte wäre besser.
Endolith
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.