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.
quelle
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
quelle
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:
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.
quelle
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.
quelle