scene_flow_uncalibscene_flow_uncalibSceneFlowUncalibSceneFlowUncalib (Operator)

Name

scene_flow_uncalibscene_flow_uncalibSceneFlowUncalibSceneFlowUncalib — Berechnung des unkalibrierten Szenenflusses zwischen zwei Stereobildpaaren.

Signatur

scene_flow_uncalib(ImageRect1T1, ImageRect2T1, ImageRect1T2, ImageRect2T2, Disparity : OpticalFlow, DisparityChange : SmoothingFlow, SmoothingDisparity, GenParamName, GenParamValue : )

Herror scene_flow_uncalib(const Hobject ImageRect1T1, const Hobject ImageRect2T1, const Hobject ImageRect1T2, const Hobject ImageRect2T2, const Hobject Disparity, Hobject* OpticalFlow, Hobject* DisparityChange, double SmoothingFlow, double SmoothingDisparity, const char* GenParamName, const char* GenParamValue)

Herror T_scene_flow_uncalib(const Hobject ImageRect1T1, const Hobject ImageRect2T1, const Hobject ImageRect1T2, const Hobject ImageRect2T2, const Hobject Disparity, Hobject* OpticalFlow, Hobject* DisparityChange, const Htuple SmoothingFlow, const Htuple SmoothingDisparity, const Htuple GenParamName, const Htuple GenParamValue)

void SceneFlowUncalib(const HObject& ImageRect1T1, const HObject& ImageRect2T1, const HObject& ImageRect1T2, const HObject& ImageRect2T2, const HObject& Disparity, HObject* OpticalFlow, HObject* DisparityChange, const HTuple& SmoothingFlow, const HTuple& SmoothingDisparity, const HTuple& GenParamName, const HTuple& GenParamValue)

HImage HImage::SceneFlowUncalib(const HImage& ImageRect2T1, const HImage& ImageRect1T2, const HImage& ImageRect2T2, const HImage& Disparity, HImage* DisparityChange, const HTuple& SmoothingFlow, const HTuple& SmoothingDisparity, const HTuple& GenParamName, const HTuple& GenParamValue) const

HImage HImage::SceneFlowUncalib(const HImage& ImageRect2T1, const HImage& ImageRect1T2, const HImage& ImageRect2T2, const HImage& Disparity, HImage* DisparityChange, double SmoothingFlow, double SmoothingDisparity, const HString& GenParamName, const HString& GenParamValue) const

HImage HImage::SceneFlowUncalib(const HImage& ImageRect2T1, const HImage& ImageRect1T2, const HImage& ImageRect2T2, const HImage& Disparity, HImage* DisparityChange, double SmoothingFlow, double SmoothingDisparity, const char* GenParamName, const char* GenParamValue) const

HImage HImage::SceneFlowUncalib(const HImage& ImageRect2T1, const HImage& ImageRect1T2, const HImage& ImageRect2T2, const HImage& Disparity, HImage* DisparityChange, double SmoothingFlow, double SmoothingDisparity, const wchar_t* GenParamName, const wchar_t* GenParamValue) const   (Nur Windows)

static void HOperatorSet.SceneFlowUncalib(HObject imageRect1T1, HObject imageRect2T1, HObject imageRect1T2, HObject imageRect2T2, HObject disparity, out HObject opticalFlow, out HObject disparityChange, HTuple smoothingFlow, HTuple smoothingDisparity, HTuple genParamName, HTuple genParamValue)

HImage HImage.SceneFlowUncalib(HImage imageRect2T1, HImage imageRect1T2, HImage imageRect2T2, HImage disparity, out HImage disparityChange, HTuple smoothingFlow, HTuple smoothingDisparity, HTuple genParamName, HTuple genParamValue)

HImage HImage.SceneFlowUncalib(HImage imageRect2T1, HImage imageRect1T2, HImage imageRect2T2, HImage disparity, out HImage disparityChange, double smoothingFlow, double smoothingDisparity, string genParamName, string genParamValue)

Beschreibung

scene_flow_uncalibscene_flow_uncalibSceneFlowUncalibSceneFlowUncalibSceneFlowUncalib berechnet den unkalibrierten Szenenfluss zwischen zwei aufeinanderfolgenden rektifizierten Stereobildpaaren. Der Szenenfluss ist die dreidimensionale Position und Bewegung von Oberflächenpunkten in einer dynamischen Szene. Die Bewegung in den Bildern kann dadurch verursacht werden, dass sich Objekte oder die Kamera (oder beides) in der Welt zwischen den Aufnahmen der beiden Stereobilder bewegen. Um den kalibrierten Szenenflusses zu berechnen, kann scene_flow_calibscene_flow_calibSceneFlowCalibSceneFlowCalibSceneFlowCalib verwendet werden.

Die aufeinanderfolgenden Stereobildpaare werden in ImageRect1T1ImageRect1T1ImageRect1T1ImageRect1T1imageRect1T1, ImageRect2T1ImageRect2T1ImageRect2T1ImageRect2T1imageRect2T1, ImageRect1T2ImageRect1T2ImageRect1T2ImageRect1T2imageRect1T2 und ImageRect2T2ImageRect2T2ImageRect2T2ImageRect2T2imageRect2T2 übergeben. Jedes Stereobildpaar muss rektifiziert sein. Die Bildpaare können mit den Operatoren calibrate_camerascalibrate_camerasCalibrateCamerasCalibrateCamerasCalibrateCameras, gen_binocular_rectification_mapgen_binocular_rectification_mapGenBinocularRectificationMapGenBinocularRectificationMapGenBinocularRectificationMap und map_imagemap_imageMapImageMapImageMapImage rektifiziert werden. Außerdem wird ein einkanaliges Disparitätsbild DisparityDisparityDisparityDisparitydisparity benötigt, welches für jedes Pixel (r,c1) des Bildes ImageRect1T1ImageRect1T1ImageRect1T1ImageRect1T1imageRect1T1 ein homologes Pixel (r,c2) im Bild ImageRect2T1ImageRect2T1ImageRect2T1ImageRect2T1imageRect2T1 festlegt. Hierbei gilt c2=c1+d(r,c1), wobei d(r,c) die Disparitäit in DisparityDisparityDisparityDisparitydisparity am Pixel (r,c) ist. Die Disparität kann mit binocular_disparitybinocular_disparityBinocularDisparityBinocularDisparityBinocularDisparity oder binocular_disparity_mgbinocular_disparity_mgBinocularDisparityMgBinocularDisparityMgBinocularDisparityMg berechnet werden.

Der berechnete unkalibrierte Szenenfluss wird in OpticalFlowOpticalFlowOpticalFlowOpticalFlowopticalFlow und DisparityChangeDisparityChangeDisparityChangeDisparityChangedisparityChange zurückgegeben. Die Vektoren im Vektorfeld OpticalFlowOpticalFlowOpticalFlowOpticalFlowopticalFlow beschreiben die Bewegung in der Bildebene zwischen ImageRect1T1ImageRect1T1ImageRect1T1ImageRect1T1imageRect1T1 und ImageRect1T2ImageRect1T2ImageRect1T2ImageRect1T2imageRect1T2. Das einkanalige Bild DisparityChangeDisparityChangeDisparityChangeDisparityChangedisparityChange beschreibt die Änderung der Disparität zwischen ImageRect2T1ImageRect2T1ImageRect2T1ImageRect2T1imageRect2T1 und ImageRect2T2ImageRect2T2ImageRect2T2ImageRect2T2imageRect2T2. Ein Punkt in der Welt wird in das Bild ImageRect1T1ImageRect1T1ImageRect1T1ImageRect1T1imageRect1T1 an der Position (r,c) projiziert. Derselbe Punkt wird projiziert in

Hierbei bezeichnen u(r,c) und v(r,c) die Zeilen- und Spaltenkoordinaten des Vektorfeldes in OpticalFlowOpticalFlowOpticalFlowOpticalFlowopticalFlow, d(r,c) die Disparitäten in DisparityDisparityDisparityDisparitydisparity und dc(r,c) die Disparitätsänderungen in DisparityChangeDisparityChangeDisparityChangeDisparityChangedisparityChange, jeweils am Pixel (r,c).

ImageRect1T1 ImageRect1T2 ImageRect2T2 ImageRect2T1 (r,c) (r+u(r,c),c+v(r,c)) (r+u(r,c),c+v(r,c)+d(r,c)+dc(r,c)) Disparity d(r,c) (r,c+d(r,c)) OpticalFlow (u(r,c),v(r,c)) dc(r,c) d(r,c) + Disparity DisparityChange
Relationen zwischen den vier Bildern, dem optischen Fluss, sowie den Disparitäten in den Disparitätsbildern.

Parameterbeschreibung

Die rektifizierten Eingabebilder werden in ImageRect1T1ImageRect1T1ImageRect1T1ImageRect1T1imageRect1T1, ImageRect2T1ImageRect2T1ImageRect2T1ImageRect2T1imageRect2T1, ImageRect1T2ImageRect1T2ImageRect1T2ImageRect1T2imageRect1T2 und ImageRect2T2ImageRect2T2ImageRect2T2ImageRect2T2imageRect2T2 übergeben. Die Berechnung des Szenenflusses erfolgt auf der Region von ImageRect1T1ImageRect1T1ImageRect1T1ImageRect1T1imageRect1T1. Dies ist auch die Region des Szenenflusses in OpticalFlowOpticalFlowOpticalFlowOpticalFlowopticalFlow und DisparityChangeDisparityChangeDisparityChangeDisparityChangedisparityChange. DisparityDisparityDisparityDisparitydisparity beinhaltet die Disparität zwischen den rektifizierten Bildern ImageRect1T1ImageRect1T1ImageRect1T1ImageRect1T1imageRect1T1 und ImageRect2T1ImageRect2T1ImageRect2T1ImageRect2T1imageRect2T1.

SmoothingFlowSmoothingFlowSmoothingFlowSmoothingFlowsmoothingFlow und SmoothingDisparitySmoothingDisparitySmoothingDisparitySmoothingDisparitysmoothingDisparity spezifizieren die Regularisierungsgewichte und relativ zum Datenterm. Je größer diese Parameter sind, desto glatter ist der berechnete Szenenfluss. Für Byte-Bilder mit einem Wertebereich von führen Werte in der Größenordnung von 40 typischerweise zu guten Ergebnissen.

Die Parameter für das Iterationsverfahren und für die Coarse-to-Fine-Warping-Strategie können mit den generischen Parametern GenParamNameGenParamNameGenParamNameGenParamNamegenParamName und GenParamValueGenParamValueGenParamValueGenParamValuegenParamValue festgelegt werden.

Im Normalfall ist es ausreichend, einen der Standardparametersätze für die Parameter zu verwenden, indem GenParamNameGenParamNameGenParamNameGenParamNamegenParamName = 'default_parameters'"default_parameters""default_parameters""default_parameters""default_parameters" und GenParamValueGenParamValueGenParamValueGenParamValuegenParamValue = 'very_accurate'"very_accurate""very_accurate""very_accurate""very_accurate", 'accurate'"accurate""accurate""accurate""accurate", 'fast'"fast""fast""fast""fast" oder 'very_fast'"very_fast""very_fast""very_fast""very_fast" übergeben werden. Falls notwendig, können einzelne Parameter modifiziert werden, nachdem der Standardparametersatz gewählt wurde, indem eine Untermenge der Parameter und entsprechenden Werte nach 'default_parameters'"default_parameters""default_parameters""default_parameters""default_parameters" in GenParamNameGenParamNameGenParamNameGenParamNamegenParamName und GenParamValueGenParamValueGenParamValueGenParamValuegenParamValue übergeben werden (z.B. GenParamNameGenParamNameGenParamNameGenParamNamegenParamName = ['default_parameters','warp_zoom_factor']["default_parameters","warp_zoom_factor"]["default_parameters","warp_zoom_factor"]["default_parameters","warp_zoom_factor"]["default_parameters","warp_zoom_factor"] und GenParamValueGenParamValueGenParamValueGenParamValuegenParamValue = ['accurate',0.6]["accurate",0.6]["accurate",0.6]["accurate",0.6]["accurate",0.6]). Die Bedeutung der einzelnen Parameter ist unten detailliert beschrieben. Die Standardparametersätze sind gegeben durch:

'default_parameters' 'very_accurate' 'accurate' 'fast' 'very_fast'
'warp_zoom_factor' 0.75 0.5 0.5 0.5
'warp_levels' 0 0 0 0
'warp_last_level' 1 1 1 2
'outer_iter' 10 7 5 4
'inner_iter' 2 2 2 2
'sor_iter' 3 3 3 3
'omega' 1.9 1.9 1.9 1.9

Falls die Parameter einzeln spezifiziert werden sollen, müssen GenParamNameGenParamNameGenParamNameGenParamNamegenParamName und GenParamValueGenParamValueGenParamValueGenParamValuegenParamValue Tupel derselben Länge enthalten. Die zu den Parametern in GenParamNameGenParamNameGenParamNameGenParamNamegenParamName gehörigen Werte müssen an der entsprechenden Position in GenParamValueGenParamValueGenParamValueGenParamValuegenParamValue spezifiziert werden. Um ein genaueres Verständnis der Parameter zu erlangen, wird auf den Abschnitt Algorithmus unten verwiesen.

Algorithmus

Der Szenenfluss wird berechnet, indem ein geeignetes Energiefunktional minimiert wird:

Hierbei stellt f=(u,v,dc) das optische Flussfeld und die Disparitätsänderung dar. bezeichnet den Datenterm und den Glattheitsterm (Regularisierungsterm). Der Algorithmus basiert auf folgenden Annahmen, die zu den Daten- und Glattheitstermen führen:

Helligkeitskonstanz

Es wir angenommen, dass der Grauwert eines Punktes in allen vier Bildern konstant bleibt. Daraus folgen die folgenden vier Bedingungen: Hierbei bezeichnen , , und die Bilder ImageRect1T1ImageRect1T1ImageRect1T1ImageRect1T1imageRect1T1, ImageRect2T1ImageRect2T1ImageRect2T1ImageRect2T1imageRect2T1, ImageRect1T2ImageRect1T2ImageRect1T2ImageRect1T2imageRect1T2 und ImageRect2T2ImageRect2T2ImageRect2T2ImageRect2T2imageRect2T2.

Stückweise Glattheit des Szenenflusses

Es wird angenommen, dass die Lösung stückweise glatt ist. Die Glattheit wird erreicht, indem die ersten Ableitungen des Flusses bestraft werden. Die Verwendung einer statistisch robusten (linearen) Straffunktion mit sorgt dafür, dass die Kanten in den Bewegungen im Szenenfluss erhalten bleiben.

Da das Disparitätsbild d gegeben ist, kann die erste Bedingung vernachlässigt werden. Unter Verwendung aller obigen Annahmen kann das Energiefunktional wie folgt geschrieben werden: Hierbei sind und die Regularisierungsparameter, die in SmoothingFlowSmoothingFlowSmoothingFlowSmoothingFlowsmoothingFlow und SmoothingDisparitySmoothingDisparitySmoothingDisparitySmoothingDisparitysmoothingDisparity übergeben werden.

Um große Verschiebungen schätzen zu können, machen Coarse-to-Fine-Warping-Strategien von zwei Konzepten Gebrauch, die beide eng miteinander verzahnt sind: Die sukzessive Verfeinerung der Problemstellung (Coarse-to-Fine) und die fortlaufende Kompensation des aktuelles Bildpaares um bereits berechnete Verschiebungen (Warping). Algorithmisch lässt sich eine solche Coarse-to-Fine-Warping-Strategie wie folgt formulieren:

  1. Zunächst werden beide Bilder des aktuellen Bildpaares auf eine sehr grobe Auflösungsstufe heruntergesampelt.

  2. Dann wird der Szenenfluss auf dieser groben Auflösung berechnet.

  3. Dieser Szenenfluss wird auf der nächstfeineren Auflösungsstufe benötigt: Es wird dort aus dem zweiten Bildpaar der Bildfolge herausgerechnet, d.h. die Problemstellung auf der feineren Auflösungsstufe wird um das bereits berechnete Flussfeld kompensiert. Dieser Schritt wird auch als Warping bezeichnet.

  4. Das so modifizierte Problem (Differenzproblem) wird nun auf der feineren Auflösungsstufe gelöst, d.h. der Szenenfluss wird dort berechnet.

  5. Die Schritte 3-4 werden wiederholt, bis die ursprüngliche Auflösung erreicht wird.

  6. Das letztendliche Ergebnis wird durch Addition des Szenenflusses aller Auflösungsstufen gebildet.

Diese inkrementelle Berechnung des Szenenflusses bietet folgenden Vorteil: Während das Coarse-to-Fine-Konzept sicherstellt, dass die Verschiebungen auf der gröbsten Auflösungsstufe sehr klein sind, sorgt die Warping-Strategie dafür, dass das auch für die zu berechnenden Flussinkremente (Szenenfluss der Differenzprobleme) so bleibt. Da kleine Verschiebungen viel genauer berechnet werden können als größere, nimmt durch den Einsatz einer solchen Coarse-to-Fine-Warping-Strategie die Schätzqualität im allgemeinen deutlich zu. Jedoch muss anstelle eines einzelnen Korrespondenzproblems eine Hierarchie von ebensolchen Problemen gelöst werden.

Die Minimierung von Funktionalen ist aus mathematischer Sicht sehr eng mit der Minimierung von Funktionen verwandt: So wie eine Nullstelle der ersten Ableitung eine notwendige Bedingung für ein Minimum einer Funktion ist, ist die Erfüllung der sogenannten Euler-Lagrange-Gleichungen eine notwendige Bedingung für die minimierende Funktion eines Funktionals (die minimierende Funktion entspricht hier dem gesuchten Szenenfluss). Die Euler-Lagrange-Gleichungen sind partielle Differentialgleichungen. Durch die Diskretisierung dieser Euler-Lagrange-Gleichungen mit Hilfe finiter Differenzen entstehen große dünnbesetzte nichtlineare Gleichungssysteme, die durch den Algorithmus gelöst werden müssen.

Auf jeder Warpingebene muss ein einzelnes Gleichungssystem gelöst werden. Der Algorithmus verwendet ein iteratives Verfahren, dass aus zwei verschachtelten Iterationen (den sog. äußeren und inneren Iterationen) sowie dem SOR-Verfahren (Successive Over-Relaxation) besteht. Die äußere Schleife sorgt für die Linearisierung der nichtlinearen Terme, die aus den Datentermen folgen. Die Nichtlinearität von wird durch die innere Fixpunktiteration beseitigt. Das resultierende lineare Gleichungssystem wird effizient mit dem SOR-Verfahren gelöst.

Ausführungsinformationen

Parameter

ImageRect1T1ImageRect1T1ImageRect1T1ImageRect1T1imageRect1T1 (input_object)  singlechannelimage(-array) objectHImageHImageHobject (byte / uint2 / real)

Eingabebild 1 zum Zeitpunkt .

ImageRect2T1ImageRect2T1ImageRect2T1ImageRect2T1imageRect2T1 (input_object)  singlechannelimage(-array) objectHImageHImageHobject (byte / uint2 / real)

Eingabebild 2 zum Zeitpunkt .

ImageRect1T2ImageRect1T2ImageRect1T2ImageRect1T2imageRect1T2 (input_object)  singlechannelimage(-array) objectHImageHImageHobject (byte / uint2 / real)

Eingabebild 1 zum Zeitpunkt .

ImageRect2T2ImageRect2T2ImageRect2T2ImageRect2T2imageRect2T2 (input_object)  singlechannelimage(-array) objectHImageHImageHobject (byte / uint2 / real)

Eingabebild 2 zum Zeitpunkt .

DisparityDisparityDisparityDisparitydisparity (input_object)  singlechannelimage(-array) objectHImageHImageHobject (real)

Dispartät zwischen Eingabebild 1 und 2 zum Zeitpunkt .

OpticalFlowOpticalFlowOpticalFlowOpticalFlowopticalFlow (output_object)  singlechannelimage(-array) objectHImageHImageHobject * (vector_field)

Berechneter optischer Fluss.

DisparityChangeDisparityChangeDisparityChangeDisparityChangedisparityChange (output_object)  singlechannelimage(-array) objectHImageHImageHobject * (real)

Berechnete Änderung der Disparität.

SmoothingFlowSmoothingFlowSmoothingFlowSmoothingFlowsmoothingFlow (input_control)  number HTupleHTupleHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)

Gewicht des Regularisierungsterms relativ zum Datenterm (Ableitungen des optischen Flusses).

Defaultwert: 40.0

Wertevorschläge: 10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0, 100.0

Restriktion: SmoothingFlow > 0.0

SmoothingDisparitySmoothingDisparitySmoothingDisparitySmoothingDisparitysmoothingDisparity (input_control)  number HTupleHTupleHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)

Gewicht des Regularisierungsterms relativ zum Datenterm (Ableitungen der Änderung der Disparität).

Defaultwert: 40.0

Wertevorschläge: 10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0, 100.0

Restriktion: SmoothingDisparity > 0.0

GenParamNameGenParamNameGenParamNameGenParamNamegenParamName (input_control)  attribute.name(-array) HTupleHTupleHtuple (string) (string) (HString) (char*)

Parametername(n) für den Algorithmus.

Defaultwert: 'default_parameters' "default_parameters" "default_parameters" "default_parameters" "default_parameters"

Wertevorschläge: 'default_parameters'"default_parameters""default_parameters""default_parameters""default_parameters", 'warp_levels'"warp_levels""warp_levels""warp_levels""warp_levels", 'warp_zoom_factor'"warp_zoom_factor""warp_zoom_factor""warp_zoom_factor""warp_zoom_factor", 'warp_last_level'"warp_last_level""warp_last_level""warp_last_level""warp_last_level", 'outer_iter'"outer_iter""outer_iter""outer_iter""outer_iter", 'inner_iter'"inner_iter""inner_iter""inner_iter""inner_iter", 'sor_iter'"sor_iter""sor_iter""sor_iter""sor_iter", 'omega'"omega""omega""omega""omega"

GenParamValueGenParamValueGenParamValueGenParamValuegenParamValue (input_control)  attribute.value(-array) HTupleHTupleHtuple (string / integer / real) (string / int / long / double) (HString / Hlong / double) (char* / Hlong / double)

Parameterwert(e) für den Algorithmus.

Defaultwert: 'accurate' "accurate" "accurate" "accurate" "accurate"

Wertevorschläge: 'very_accurate'"very_accurate""very_accurate""very_accurate""very_accurate", 'accurate'"accurate""accurate""accurate""accurate", 'fast'"fast""fast""fast""fast", 'very_fast'"very_fast""very_fast""very_fast""very_fast", 0, 1, 2, 3, 4, 5, 6, 0.5, 0.6, 0.7, 0.75, 3, 5, 7, 2, 3, 1.9

Ergebnis

Sind die Parameterwerte korrekt, dann liefert scene_flow_uncalibscene_flow_uncalibSceneFlowUncalibSceneFlowUncalibSceneFlowUncalib den Wert 2 (H_MSG_TRUE). Das Verhalten bei leerer Eingabe (keine Eingabebilder vorhanden) lässt sich mittels set_system('no_object_result',<Result>)set_system("no_object_result",<Result>)SetSystem("no_object_result",<Result>)SetSystem("no_object_result",<Result>)SetSystem("no_object_result",<Result>) festlegen. Gegebenenfalls wird eine Fehlerbehandlung durchgeführt.

Vorgänger

binocular_disparitybinocular_disparityBinocularDisparityBinocularDisparityBinocularDisparity, binocular_disparity_mgbinocular_disparity_mgBinocularDisparityMgBinocularDisparityMgBinocularDisparityMg

Nachfolger

thresholdthresholdThresholdThresholdThreshold, vector_field_lengthvector_field_lengthVectorFieldLengthVectorFieldLengthVectorFieldLength

Alternativen

scene_flow_calibscene_flow_calibSceneFlowCalibSceneFlowCalibSceneFlowCalib, optical_flow_mgoptical_flow_mgOpticalFlowMgOpticalFlowMgOpticalFlowMg

Literatur

A. Wedel, C. Rabe, T. Vaudrey, T. Brox, U. Franke and D. Cremers: „Efficient dense scene flow from sparse or dense stereo data“; In: Proceedings of the 10th European Conference on Computer Vision: Part I, pages 739-751. Springer-Verlag, 2008.

Modul

Foundation