2017-10-25 4 views
1

Ich habe den Python-Implementierungscode von Dense Optical Flow ausgeführt, der auf der offiziellen Dokumentationsseite angegeben ist. An einer bestimmten Zeile des Codes verwenden sie
mag, ang = cv2.cartToPolar (Fluss [..., 0], Fluss [..., 1]). Wenn ich die Werte von Mag drucken, ich diese bekommen - Please check this image for the output I'm gettingWas genau ist die Ausgabe, wenn wir den dichten optischen Fluss (Farnnback) laufen lassen?

ich keine Ahnung, wie Sinn dieser Ausgabe zu machen.

Mein Ziel ist es, den optischen Fluss zu verwenden, um einen resultierenden oder durchschnittlichen Bewegungswert für jeden Frame zu erhalten.

Antwort

1

die gleiche OpenCV tutorial Zitiert verwenden Sie

Wir erhalten eine 2-Kanal-Array mit der optischen Flußvektoren, (u, v).

Das ist die Ausgabe des dichten optischen Flusses. Im Grunde sagt es Ihnen, wie sich die einzelnen Punkte vektoriell bewegten. (u,v) ist nur die kartesische Darstellung eines Vektors und kann in Polarkoordinaten umgewandelt werden, dies bedeutet einen Winkel und die Größe.

Der Winkel ist die Ausrichtung, in der sich das Pixel bewegte. Und die Größe ist die Entfernung, um die sich das Pixel bewegte.

In vielen Algorithmen können Sie die Größe verwenden, um zu wissen, ob sich das Pixel bewegt hat (weniger als 1 bedeutet keine Bewegung zum Beispiel). Oder wenn Sie ein Objekt verfolgen, von dem Sie die Anfangsposition kennen (dh die Pixelposition des Objekts), können Sie herausfinden, wohin sich die meisten Pixel bewegen, und diese Informationen verwenden, um die neue Position zu bestimmen.

BTW, cartToPolar gibt die Winkel in Radiant zurück, sofern sie nicht angegeben sind. Hier ist ein Auszug aus der Dokumentation:

cv2.cartToPolar(x, y[, magnitude[, angle[, angleInDegrees]]]) → magnitude, angle 

angleInDegreesTrue sein müssen, wenn Sie es in Grad benötigen.

+0

Vielen Dank Herr, für Ihre Erkenntnisse. Ich habe mich gefragt, ob es eine Möglichkeit gibt, die durchschnittliche Bewegung während des gesamten Videos zu finden. Wie gesagt, eine Frame-Nummer 199 hat eine Gesamtbewegung von etwa 14.035, ebenso gibt es eine Möglichkeit, Frames und den gesamten durchschnittlichen Bewegungswert in diesem Frame zu erhalten, der sich über das gesamte Video erstreckt? – AdaMStrange

+0

@AdaMStrange um die Bewegung zu berechnen, benötigen Sie einen Referenzrahmen und einen neuen Rahmen, wenn Sie dies für den Rahmen 199 tun, müssen Sie einen Referenzrahmen auswählen ... vielleicht Rahmen 1 oder Rahmen 198. Dann können Sie die Größenordnungen mitteln und sagen die durchschnittliche Bewegung in diesem Rahmen in Bezug auf die Referenz. Das gleiche wäre es in dem Video, Sie müssen definieren, was Ihr Referenzrahmen ist und die Pixelbewegung erhalten. Es ist wichtig zu beachten, dass, wenn die zwei Bilder völlig unterschiedlich sind (z. B. Szenenwechsel), Sie möglicherweise unerwünschte Ergebnisse erhalten. Um Frames eines Videos zu erhalten, benutze VideoCapture von OpenCV – api55

+0

@AdaMStrange noch eine Sache, diese Methoden sind ziemlich langsam, wenn es nur ein Teil des Bildes ist, schneide es zuerst oder benutze vielleicht die spärlichen Methoden. – api55