Transform- und Rotationsmatrizen aus der Homographie extrahieren?

8

Ich habe 2 aufeinanderfolgende Bilder von einer Kamera und möchte die Veränderung in der Kamerapose schätzen:

Ich berechne den optischen Fluss:

%Vor%

und es sieht richtig aus, die Kamera bewegte sich nach links und oben: Jetzt möchte ich herausfinden, wie viel die Kamera bewegt und gedreht hat. Wenn ich meine Kameraposition erkläre und was sie sieht:

%Vor%

Wie berechne ich die neue Position und das Aussehen?

Wenn ich das alles falsch mache oder wenn es eine bessere Methode gibt, wären alle Vorschläge sehr willkommen, danke!

    
smirkingman 12.09.2011, 13:44
quelle

2 Antworten

5

Nun, was Sie betrachten, ist in einfachen Worten ein Pythagoras-Theorem-Problem a ^ 2 + b ^ 2 = c ^ 2. Wenn es jedoch um kamerabasierte Anwendungen geht, ist es nicht sehr einfach, genau zu bestimmen. Sie haben die Hälfte der Details gefunden, die Sie für "a" benötigen, aber das Finden von "b" oder "c" ist viel schwieriger.

Die kurze Antwort

Grundsätzlich kann es nicht mit einer einzigen Kamera gemacht werden. Aber es kann mit zwei Kameras erledigt werden.

Die langwierige Antwort (Ich dachte, ich würde das genauer erklären, kein Wortspiel beabsichtigt)

Ich werde es versuchen und erklären, sagen wir wählen zwei Punkte in unserem Bild und bewegen Sie die Kamera nach links. Wir wissen, dass der Abstand von der Kamera von jedem Punkt B1 20 mm und Punkt B2 40 mm beträgt. Nun nehmen wir an, dass wir das Bild verarbeiten und unsere Messung ist A1 ist (0,2) und A2 ist (0,4) diese sind auf B1 und B2 bezogen. Jetzt sind A1 und A2 keine Messungen; Sie sind Pixel der Bewegung.

Was wir jetzt tun müssen, ist die Multiplikation der Änderung in A1 und A2 mit einer berechneten Konstante, die die reale Weltdistanz bei B1 und B2 sein wird. HINWEIS: Jeder dieser Werte ist je nach Messung B * unterschiedlich. Dies alles bezieht sich auf den Blickwinkel oder häufiger als das Sichtfeld in der Fotografie in verschiedenen Entfernungen. Sie können die Konstante genau berechnen, wenn Sie die Größe jedes Pixels auf dem Kamera-CCD und die f-Nummer des in der Kamera vorhandenen Objektivs kennen.

Ich würde erwarten, dass dies nicht der Fall ist, also müssen Sie bei verschiedenen Entfernungen ein Objekt platzieren, von dem Sie die Länge kennen und sehen, wie viele Pixel es aufnimmt. Close up Sie können ein Lineal verwenden, um die Dinge zu vereinfachen. Mit diesen Messungen. Sie nehmen diese Daten und bilden eine Kurve mit einer Linie der besten Anpassung. Dabei ist die X-Achse die Entfernung des Objekts und die Y-Achse die Konstante des Verhältnisses von Pixel zu Entfernung, mit der Sie Ihre Bewegung multiplizieren müssen.

Wie wenden wir diese Kurve an? Nun, es ist raten Arbeit. Theoretisch ist das Maß der Bewegung A * umso größer, je näher das Objekt an der Kamera ist. In unserem Beispiel sind unsere Verhältnisse für A1 & gt; A2 sagen 5mm bzw. 3mm und wir würden jetzt wissen, dass Punkt B1 10mm (2x5mm) und B2 6mm (2x6mm) bewegt hat. Aber seien wir ehrlich - wir werden B nie wissen, und wir werden nie in der Lage sein zu sagen, ob sich eine Entfernung um 20 Pixel eines Objekts bewegt, das sich nicht weit bewegt oder ein weit entferntes Objekt weit entfernt ist. Aus diesem Grund verwenden Dinge wie die Xbox Kinect zusätzliche Sensoren, um Tiefeninformationen zu erhalten, die an die Objekte im Bild gebunden werden können.

Was Sie mit zwei Kameras versuchen könnten, da der Abstand zwischen diesen Kameras bekannt ist, kann die Bewegung genauer berechnet werden (effektiv ohne Verwendung eines Tiefensensors). Die Mathematik dahinter ist äußerst komplex und ich würde vorschlagen, einige Zeitschriftenartikel zu diesem Thema zu lesen. Wenn Sie möchten, dass ich die Theorie erkläre, kann ich es versuchen.

All meine Erfahrung basiert auf dem Entwurf von Hochgeschwindigkeits-Videoaufnahmen und Bildverarbeitung für meinen PHD. Vertrau mir, es kann nicht mit einer Kamera gemacht werden, tut mir leid. Ich hoffe, dass etwas davon hilft.

Prost

Chris

[EDIT]

Ich wollte einen Kommentar hinzufügen, aber das ist einfacher wegen der Fülle an Informationen:

Da es sich um die Kinect handelt, gehe ich davon aus, dass Sie für jeden Punkt relevante Tiefeninformationen haben, wenn Sie nicht herausfinden müssen, wie Sie diese erhalten.

Die Gleichung, mit der Sie beginnen müssen, bezieht sich auf das Sichtfeld ( FOV ):

o / d = i / f

Wo:

f ist gleich der Brennweite der Linse, die üblicherweise in mm angegeben wird (d. h. 18 28 30 50 sind Standardbeispiele)

d ist die Objektentfernung von der Linse, die von kinect-Daten erfasst wird

o ist die Objektdimension (oder das "Sichtfeld", das senkrecht zur optischen Achse steht und halbiert ist).

i ist die Bilddimension (oder "Feldblende", die senkrecht zur optischen Achse steht und halbiert ist).

Wir müssen i berechnen, wobei o für uns unbekannt ist, also für i (was eine diagonale Messung ist),

Wir werden die Größe des Pixels auf der CCD brauchen, das wird in Mikrometern oder μm, Sie müssen diese Informationen heraus finden, denn wir werden es als 14um nehmen, was Standard für eine Midrange-Flächenkamera ist. p>

Zuerst müssen wir also eine horizontale Dimension ausarbeiten ( ih ), die die Anzahl der Pixel der Breite der Kamera multipliziert mit der Größe des CCD-Pixels ist (Wir werden 640 x 320 verwenden )

also: ih = 640 * 14um = 8960um

%Vor%

Jetzt brauchen wir i vertikale Dimension ( iv ) gleicher Prozess aber Höhe

so: iv = (320 * 14um) / 1000 = 4.48mm

Nun wird i nach dem Satz des Pythagoras gefunden Pythagorasischer Satz a ^ 2 + b ^ 2 = c ^ 2

so: i = sqrt (ih ^ 2 _ iv ^ 2)

%Vor%

Nun nehmen wir an, wir haben ein 28 mm Objektiv. Auch hier muss dieser genaue Wert herausgefunden werden. Also wird unsere Gleichung neu geordnet, um uns o is:

zu geben

o = (i * d) / f

Denken Sie daran, dass o diagonal ist (wir nehmen an, dass das Objekt oder der Punkt 50 mm entfernt ist):

o = (10.02mm * 50mm) / 28mm

%Vor%

Nun müssen wir eine horizontale Dimension ( oh ) und eine vertikale Dimension ( ov ) ausarbeiten, da wir dadurch die Entfernung pro Pixel berechnen können, um die sich das Objekt bewegt hat . Nun, da FOV α CCD oder i direkt proportional zu o ist, berechnen wir ein Verhältnis k

k = i / o

%Vor%

so:

o horizontale Dimension ( oh ):

oh = ih / k

= 8,96 mm / 0,56 = 16 mm pro Pixel

o vertikale Dimension ( ov ):

ov = iv / k

= 4.48mm / 0.56 = 8mm pro Pixel

Jetzt haben wir die Konstanten, die wir benötigen, verwenden wir sie in einem Beispiel. Wenn sich unser Objekt bei 50 mm von Position (0,0) nach (2,4) bewegt, dann sind die Messungen im wirklichen Leben:

(2 * 16mm, 4 * 8mm) = (32mm, 32mm)

Wiederum ein Satz des Pythagoras: a ^ 2 + b ^ 2 = c ^ 2

Gesamtabstand = sqrt (32 ^ 2 + 32 ^ 2)

%Vor%

Kompliziert Ich weiß, aber sobald Sie dies in einem Programm haben, ist es einfacher. Also müssen Sie für jeden Punkt mindestens die Hälfte des Prozesses wiederholen, da sich d für jeden Punkt, den Sie untersuchen, auf o ändert.

Hoffe das bringt dich auf den Weg,

Prost Chris

    
Chris 12.09.2011, 18:57
quelle
8

Für reine Kameradrehung R = A -1 HA. Um dies zu beweisen, betrachten wir die homogenen Bild-zu-Bild-Beziehungen H1 = A und H2 = AR, wobei A die intrinsische Matrix der Kamera ist. Dann ist H12 = H2 * H1 -1 = A -1 RA, von der man R

erhalten kann

Kameraübersetzung ist schwieriger zu schätzen. Wenn die Kamera übersetzt, muss man zuerst eine Fundamentalmatrix finden (keine Homographie): x T Fx = 0 und dann in eine essentielle Matrix umwandeln E = A T FA; Dann können Sie E in Rotation und Translation E = t x R zerlegen, wobei t x eine Vektorproduktmatrix bedeutet. Die Dekomposition ist nicht offensichtlich, siehe dies .

Die Drehung, die Sie erhalten, ist genau, während der Übersetzungsvektor nur bis zum Maßstab gefunden werden kann. Intuitiv bedeutet diese Skalierung, dass man aus den beiden Bildern nicht wirklich sagen kann, ob die Objekte nah und klein oder weit und weit sind. Zur Unterscheidung können wir bekannte Objekte, bekannte Entfernungen zwischen zwei Punkten usw. verwenden.

Beachten Sie schließlich, dass ein menschliches Sehsystem ein ähnliches Problem hat: Obwohl wir die Entfernung zwischen unseren Augen "kennen", wenn sie auf das Objekt konvergiert sind, ist die Disparität immer Null und wir können nicht aus Disparität sagen, wie groß der Abstand ist. Die menschliche Vision beruht auf der Triangulation des Augenversionssignals, um die absolute Entfernung zu bestimmen.

    
Vlad 12.03.2014 00:15
quelle