binocular_disparity_mgbinocular_disparity_mgBinocularDisparityMgBinocularDisparityMg (Operator)

Name

binocular_disparity_mgbinocular_disparity_mgBinocularDisparityMgBinocularDisparityMg — Berechnet die Disparität für ein rektifiziertes Bildpaar mit Hife von Mehrgitter-Verfahren.

Signatur

binocular_disparity_mg(ImageRect1, ImageRect2 : Disparity, Score : GrayConstancy, GradientConstancy, Smoothness, InitialGuess, CalculateScore, MGParamName, MGParamValue : )

Herror binocular_disparity_mg(const Hobject ImageRect1, const Hobject ImageRect2, Hobject* Disparity, Hobject* Score, double GrayConstancy, double GradientConstancy, double Smoothness, double InitialGuess, const char* CalculateScore, const char* MGParamName, const char* MGParamValue)

Herror T_binocular_disparity_mg(const Hobject ImageRect1, const Hobject ImageRect2, Hobject* Disparity, Hobject* Score, const Htuple GrayConstancy, const Htuple GradientConstancy, const Htuple Smoothness, const Htuple InitialGuess, const Htuple CalculateScore, const Htuple MGParamName, const Htuple MGParamValue)

void BinocularDisparityMg(const HObject& ImageRect1, const HObject& ImageRect2, HObject* Disparity, HObject* Score, const HTuple& GrayConstancy, const HTuple& GradientConstancy, const HTuple& Smoothness, const HTuple& InitialGuess, const HTuple& CalculateScore, const HTuple& MGParamName, const HTuple& MGParamValue)

HImage HImage::BinocularDisparityMg(const HImage& ImageRect2, HImage* Score, double GrayConstancy, double GradientConstancy, double Smoothness, double InitialGuess, const HString& CalculateScore, const HTuple& MGParamName, const HTuple& MGParamValue) const

HImage HImage::BinocularDisparityMg(const HImage& ImageRect2, HImage* Score, double GrayConstancy, double GradientConstancy, double Smoothness, double InitialGuess, const HString& CalculateScore, const HString& MGParamName, const HString& MGParamValue) const

HImage HImage::BinocularDisparityMg(const HImage& ImageRect2, HImage* Score, double GrayConstancy, double GradientConstancy, double Smoothness, double InitialGuess, const char* CalculateScore, const char* MGParamName, const char* MGParamValue) const

HImage HImage::BinocularDisparityMg(const HImage& ImageRect2, HImage* Score, double GrayConstancy, double GradientConstancy, double Smoothness, double InitialGuess, const wchar_t* CalculateScore, const wchar_t* MGParamName, const wchar_t* MGParamValue) const   (Nur Windows)

static void HOperatorSet.BinocularDisparityMg(HObject imageRect1, HObject imageRect2, out HObject disparity, out HObject score, HTuple grayConstancy, HTuple gradientConstancy, HTuple smoothness, HTuple initialGuess, HTuple calculateScore, HTuple MGParamName, HTuple MGParamValue)

HImage HImage.BinocularDisparityMg(HImage imageRect2, out HImage score, double grayConstancy, double gradientConstancy, double smoothness, double initialGuess, string calculateScore, HTuple MGParamName, HTuple MGParamValue)

HImage HImage.BinocularDisparityMg(HImage imageRect2, out HImage score, double grayConstancy, double gradientConstancy, double smoothness, double initialGuess, string calculateScore, string MGParamName, string MGParamValue)

Beschreibung

binocular_disparity_mgbinocular_disparity_mgBinocularDisparityMgBinocularDisparityMgBinocularDisparityMg berechnet die Disparität zwischen zwei rektifizierten Stereobildern ImageRect1ImageRect1ImageRect1ImageRect1imageRect1 und ImageRect2ImageRect2ImageRect2ImageRect2imageRect2 und gibt sie in DisparityDisparityDisparityDisparitydisparity zurück. Im Gegensatz zu binocular_disparitybinocular_disparityBinocularDisparityBinocularDisparityBinocularDisparity werden Variationsmethoden basierend auf Mehrgitter-Verfahren verwendet. Damit können Disparitätswerte auch für Bildbereiche bestimmt werden, die keine oder kaum Textur aufweisen. Im Gegensatz zu binocular_distance_mgbinocular_distance_mgBinocularDistanceMgBinocularDistanceMgBinocularDistanceMg wird das Ergebnis nicht in Abstandswerte umgerechnet.

Die Eingabebilder müssen ein Paar rektifizierter Stereobilder darstellen, d.h. korrespondierende Punkte müssen dieselbe vertikale Koordinate haben. Die beiden Bilder müssen die gleiche Höhe haben, können aber unterschiedliche Breiten besitzen. Die Laufzeit des Verfahrens ist bei sonst gleichen Parametern in etwa linear zur Fläche der beiden Bilder.

Die Disparität gibt für jeden Bildpunkt des ersten Bildes ImageRect1ImageRect1ImageRect1ImageRect1imageRect1 die Verschiebung an, die nötig ist um seinen korrespondierenden Punkt im zweiten Bild ImageRect2ImageRect2ImageRect2ImageRect2imageRect2 zu erreichen. Zwei Punkte des ersten und zweiten Bildes heißen dabei korrespondierend, wenn sie der Bildpunkt desselben Punktes aus der ursprünglichen Szene sind. Das berechnete Disparitätsfeld ist dicht und schätzt die Disparität auch für Punkte ohne korrespondierenden Punkt ab. Die Disparität wird nur für die Zeilen berechnet, die Teil der Definitionsbereiche beider Bilder sind. Genauer gesagt berechnet sich der Definitionsbereich des Disparitätsbildes aus der Schnittmenge der Höhen der kleinsten umschließenden Rechtecke der Definitionsbereiche der Eingabebilder.

Das berechnete Disparitätsfeld ist in der Regel nicht perfekt. Wenn CalculateScoreCalculateScoreCalculateScoreCalculateScorecalculateScore auf 'true'"true""true""true""true" gesetzt ist, wird die Güte der Disparität für jedes Pixel geschätzt und in ScoreScoreScoreScorescore als Grauwertbild mit Grauwerten im Bereich 0-10 zurückgegeben, wobei 0 für die beste und 10 für die schlechteste Qualität steht. Für das Gütemaß wird zusätzlich die Disparität vom zweiten zum ersten Bild berechnet und anschließend bestimmt, inwieweit die beiden Disparitätsfelder übereinstimmen. Daher verdoppelt sich die Laufzeit des Operators beim Aktivieren dieses Schalters in etwa.

Der Operator verwendet einen Variationsansatz, bei welchem jedem möglichen Disparitätsfeld ein Energiewert zugeordnet wird. Je geringer dieser Energiewert ist, desto besser wird das Disparitätsfeld bewertet. Das Verfahren berechnet ein Disparitätsfeld mit minimaler Energie und liefert dieses zurück.

Die einem Disparitätsfeld zugeordnete Energie zerfällt in einen Datenanteil und einen Glättungsanteil. Der Datenanteil modelliert die Tatsache, dass die Bilder in Bereichen korrespondierender Punkte Abbildungen desselben Teils der Szene sind und daher dieselben Grauwerte aufweisen. Der Glättungsanteil modelliert, dass die abgebildete Szene und die zugehörige Disparität stückweise glatt ist, und führt zu einer Interpolation der Werte auch in Bereiche ohne Informationen aus dem Datenanteil, z.B. Bereiche ohne Textur.

Im Detail liegen dem Variationsansatz die folgenden Annahmen zu Grunde:

Konstanz des Grauwerts: Es wird davon ausgegangen, dass zwei korrespondierende Punkte denselben Grauwert haben, dass also gilt.

Konstanz des Grauwertgradienten: Es wird angenommen, dass die Bilder an den Stellen zweier korrespondierender Punkte denselben Grauwertgradienten aufweisen, dass also gilt. Abweichungen davon werden energetisch mittels der -Norm der Differenz der beiden Gradienten bestraft. Die Verwendung des Gradienten hat im Vergleich zur Grauwertkonstanz den Vorteil, dass er unabhängig von additiven Helligkeitsänderungen zwischen den beiden Bildern ist.

Statistische Robustheit im Datenterm: Um den Einfluss von Ausreißern, also Punkten, die eine der beiden Erhaltungsannahmen verletzen, zu reduzieren, werden Abweichungen von den beiden obigen Erhaltungsannahmen mittels einer statistisch robusten Funktion, der totalen Variation, bestraft. Diese lautet . Die Konstante wird dabei auf 0.01 gesetzt.

Glattheit des Disparitätsfeldes: Es wird davon ausgegangen, dass das Disparitätsfeld stückweise stetig ist und sich lokal nur gering ändert. Energetisch wird dies über die -Norm der Ableitung der Disparität modelliert.

Statistische Robustheit im Glättungsterm: Analog zum Datenterm wird auch im Glättungsterm die totale Variation verwendet. Aufgrund der statistischen Robustheit gegenüber Ausreißern hat dies hier den Vorteil, dass Sprünge in der Disparität, wie sie an Objektkanten auftreten, besser erhalten bleiben.

Das Energiefunktional ergibt sich durch Integration einer Linearkombination der einzelnen Terme über alle Bildpunkte des ersten Bildes. Die Koeffizienten der Linearkombination sind dabei Parameter des Operators und erlauben eine Abstimmung des Ansatzes auf konkrete Situationen. GrayConstancyGrayConstancyGrayConstancyGrayConstancygrayConstancy bestimmt den Einfluss der Grauwerterhaltung, GradientConstancyGradientConstancyGradientConstancyGradientConstancygradientConstancy den Einfluss der Gradientenerhaltung und SmoothnessSmoothnessSmoothnessSmoothnesssmoothness den Einfluss des Glättungsterms. Die beiden ersten Parameter müssen dabei an den Grauwertbereich des Bildes angepasst werden. Die vorgeschlagenen Standardparameter gelten für Bilder mit Grauwerten von 0 bis 255.

Es sei das Grauwert des ersten Bildes am Punkt (x,y), der Grauwert des zweiten Bildes und u(x,y) der Wert der Disparität an der Stelle (x,y). Das Energiefunktional ist dann:

Das Verfahren geht davon aus, dass das Disparitätsfeld u, welches dieses Funktional E minimiert, die obigen Annahmen am besten erfüllt, und daher eine gute Näherung der Disparität zwischen den beiden Bildern darstellt.

Um das obige Funktional zu minimieren, wird die sogenannte Euler-Lagrange-Gleichung (ELG) des Integrals gelöst. Diese ist vergleichbar mit der Ableitung eindimensionaler Funktionen, welche an Extrema 0 ist. Die ELG ist eine nichtlineare partielle Differentialgleichung auf dem Gebiet des Integrals und muss, analog zum eindimensionalen Fall, an Stellen von Extrema den Wert 0 annehmen. Da das Funktional in der Regel keine Maxima aufweist, entsprechen Nullstellen der ELG den gesuchten Minima des Funktionals.

Zur Bestimmung der Nullstellen der ELG werden folgende Techniken verwendet:

Fixpunkt-Iteration: Zum Lösen der ELG wird eine Fixpunkt-Iteration angewendet. Dies ist ein iteratives Verfahren, welches die Lösung schrittweise annähert, und in jedem Schritt eine Verbesserung der aktuellen Lösung berechnet. Über die Anzahl der Schritte kann daher zwischen Qualität und Geschwindigkeit abgewogen werden. Für jeden Schritt wird eine lineare partielle Differentialgleichung gelöst.

Grob-zu-Fein Verfahren: Von den beiden Stereobildern wird eine Gausssche Bildpyramide erstellt. Die ELG wird dabei zunächst für gröbere Versionen der Bilder gelöst, und die Lösung als Startwert der Fixpunkt-Iteration für die nächst feinere Version verwendet. Dies hat eine Reihe von Vor- und Nachteilen:

1. Da die Fixpunkt-Iteration von der nächstgröberen Ebene der Bildpyramide einen guten Startwert bekommt, sind weniger Iterationen nötig, wodurch das Verfahren schneller wird. Die Iteration muss nur noch kleine Korrekturen an der Disparität vornehmen.

2. Große Disparitäten auf den ursprünglichen Bildern werden auf den gröberen Bildversionen kleiner und können daher einfacher bestimmt werden.

3. Die Robustheit gegen Bildstörungen wird erhöht, da diese auf den groben Bildversionen verschwinden und auf den feinen Bildversionen lediglich kleine Korrekturen berechnet werden.

4. Probleme entstehen bei kleinen Strukturen mit großem Disparitätsunterschied zur Umgebung, da diese auf den gröberen Versionen der Bilder verschwinden und daher die Disparität der Umgebung berechnet wird. Da auf den feineren Versionen der Pyramide lediglich kleine Korrekturen berechnet werden, kann dieser Fehler nicht mehr korrigiert werden.

Mehrgitterverfahren: Die bei der Fixpunkt-Iteration entstehenden linearen partiellen Differentialgleichungen werden durch Linearisierung in ein lineares Gleichungssystem umgewandelt. Für die Lösung dieses Systems werden wiederum iterative Verfahren eingesetzt. Mehrgitterverfahren gehören bei den hier auftretenden Gleichungssystemen zu den effizientesten Lösungsverfahren. Sie nutzen die Tatsache, dass klassische Löser, etwa das Gauß-Seidel-Verfahren, hochfrequente Anteile des Fehlers schnell dämpfen, niederfrequente Anteile jedoch nur langsam. Mehrgitterverfahren berechnen den Fehler daher auf einem gröberen Gitter, auf welchem diese niederfrequenten Anteile des Fehlers eine höhere Frequenz bekommen und von den Lösern schneller gedämpft werden. Diese Eigenschaft wird von Mehrgitterverfahren rekursiv genutzt. Für die Berechnung des Fehlers auf der gröberen Version des Gleichungssystems wird also eine noch gröbere Version des Systems hinzugezogen. Je nach Anzahl der Korrekturschritte ergeben sich dadurch V- oder W-Zyklen als Aufrufschemata, welche im folgenden für zwei bis vier Auflösungsstufen dargestellt sind: Hierbei werden Iterationen auf dem Originalproblem mit großen Markierungen symbolisiert, während kleine Markierungen für Iterationen auf Fehlerkorrekturproblemen stehen.

Algorithmisch lässt sich ein solcher Korrekturzyklus wie folgt beschreiben:

1. In einem ersten Schritt werden einige wenige Iterationen mit einem iterativen linearen oder nichtlinearen Basislöser (z.B. einer Gauß-Seidel-Variante) gemacht. Dieser Schritt nennt sich Vorglättung.

2. In einem zweiten Schritt wird der aktuelle Fehler berechnet, um die bisherige Lösung (die Lösung nach Schritt 1) zu korrigieren. Aus Effizienzgründen findet diese Fehlerberechnung auf einer gröberen Auflösungsstufe statt. Dieser Schritt, der mehrfach wiederholt werden kann, nennt sich Grobgitterkorrekturschritt.

3. In einem letzten Schritt werden erneut einige wenige Iterationen mit dem gleichen iterativen linearen oder nichtlinearen Basislöser wie in Schritt 1 gemacht. Dieser Schritt nennt sich Nachglättung.

Weiterhin kann der Startwert der Iteration mittels eines hirarchischen Verfahrens bestimmt werden. Hierbei wird die Lösung vom gröbsten Gitter ausgehend immer weiter verbessert. Die skalierte Lösung auf einem gröberen Gitter dient dabei als Startwert für das nächst feinere Gitter. Auf jeder Gitterstufe wird das lineare Gleichungssystem durch einen der oben beschriebenen V- oder W-Zyklen gelöst. Das entsprechende Mehrgitterverfahren wird volles Mehrgitterverfahren genannt und kann wie folgt visualisiert werden: Dieses Beispiel stellt ein volles Mehrgitterverfahren mit zwei W-Korrekturzyklen pro Auflösungsstufe der hierarchischen Initialisierung dar. Die Interpolationsschritte der Lösung von einer Stufe zur nächsten sind mit i bezeichnet, die beiden W-Korrekturzyklen mit und . Während Iterationen auf dem Originalproblem mit großen Markierungen symbolisiert werden, stehen kleine Markierungen für Iterationen auf Fehlerkorrekturproblemen.

Je nach gewähltem Mehrgitterverfahren stehen eine Reihe von Parametern zu Verfügung, welche im Folgenden genauer beschrieben sind.

Der Parameter InitialGuessInitialGuessInitialGuessInitialGuessinitialGuess gibt den Initialisierungswert für die Fixpunkt-Iteration an, also den ersten Schätzwert. In der Regel ist hier 0 ausreichend. Läuft das Verfahren jedoch in lokale Minima, so kann hier ein anderer Wert übergeben werden.

Mittels der Parameter MGParamNameMGParamNameMGParamNameMGParamNameMGParamName und MGParamValueMGParamValueMGParamValueMGParamValueMGParamValue wird das Lösungsverfahren, also das Grob-zu-Fein-Verfahren, die Fixpunkt-Iteration und das Mehrgitterverfahren gesteuert. In der Regel reicht es aus, eine der vordefinierten und aufeinander abgestimmten Parametergruppen zu verwenden. Hierfür wird MGParamNameMGParamNameMGParamNameMGParamNameMGParamName = 'default_parameters'"default_parameters""default_parameters""default_parameters""default_parameters" und MGParamValueMGParamValueMGParamValueMGParamValueMGParamValue = 'very_accurate'"very_accurate""very_accurate""very_accurate""very_accurate", 'accurate'"accurate""accurate""accurate""accurate", 'fast_accurate'"fast_accurate""fast_accurate""fast_accurate""fast_accurate" oder 'fast'"fast""fast""fast""fast" gesetzt.

Sollen die Parameter einzeln gesteuert werden, so müssen in MGParamNameMGParamNameMGParamNameMGParamNameMGParamName und MGParamValueMGParamValueMGParamValueMGParamValueMGParamValue zwei gleichlange Tupel übergeben werden. Die Einträge in MGParamNameMGParamNameMGParamNameMGParamNameMGParamName bestimmen dabei jeweils den zu setzenden Parameter, die Einträge in MGParamValueMGParamValueMGParamValueMGParamValueMGParamValue den zu setzenden Wert. Die Parameter werden in der Reihenfolge ausgewertet, in welcher sie übergeben werden. Es kann also auch zunächst eine Gruppe von Standardparametern gewählt werden (s.o.) und danach gezielt einzelne Parameter verändert werden. Im Folgenden werden die möglichen zu setzenden Parameter beschrieben.

MGParamNameMGParamNameMGParamNameMGParamNameMGParamName = 'mg_solver'"mg_solver""mg_solver""mg_solver""mg_solver" wählt das Lösungsverfahren für die linearen Gleichungssysteme aus. Mögliche Werte für MGParamValueMGParamValueMGParamValueMGParamValueMGParamValue sind 'multigrid'"multigrid""multigrid""multigrid""multigrid" für ein einfaches Mehrgitterverfahren, 'full_multigrid'"full_multigrid""full_multigrid""full_multigrid""full_multigrid" für ein volles Mehrgitterverfahren sowie 'gauss_seidel'"gauss_seidel""gauss_seidel""gauss_seidel""gauss_seidel" für ein Gauß-Seidel-Verfahren. Die Mehrgitterverfahren haben den Vorteil einer schnelleren Konvergenz, benötigen jedoch einen zusätzlichen Aufwand für das Vergröbern der linearen Gleichungssysteme.

MGParamNameMGParamNameMGParamNameMGParamNameMGParamName = 'mg_cycle_type'"mg_cycle_type""mg_cycle_type""mg_cycle_type""mg_cycle_type" wählt den Rekursionstyp des Mehrgitterverfahrens aus. Mögliche Werte für MGParamValueMGParamValueMGParamValueMGParamValueMGParamValue sind 'v'"v""v""v""v" für einen V-Zyklus, 'w'"w""w""w""w" für einen W-Zyklus und 'none'"none""none""none""none" für keine Rekursion.

MGParamNameMGParamNameMGParamNameMGParamNameMGParamName = 'mg_pre_relax'"mg_pre_relax""mg_pre_relax""mg_pre_relax""mg_pre_relax" setzt für Mehrgitterverfahren die Anzahl der Gauß-Seidel-Iterationen beim Vorglätten, bzw. beim Gauß-Seidel-Verfahren die Anzahl an Iterationen beim Lösen des Gleichungssystems. Der Wert muss eine Zahl größer 0 sein.

MGParamNameMGParamNameMGParamNameMGParamNameMGParamName = 'mg_post_relax'"mg_post_relax""mg_post_relax""mg_post_relax""mg_post_relax" setzt für Mehrgitterverfahren die Anzahl der Gauß-Seidel-Iterationen beim Nachglätten. Der Wert muss eine Zahl größer 0 sein.

Beide gerade beschriebene Parameter gehen asymptotisch gesehen linear in die Laufzeit des Verfahrens ein. Da viele andere Berechnungen jedoch unabhängig von der Anzahl an Gauß-Seidel-Iterationen nur einmal nötig sind, führen kleine Änderungen der beiden Parameter nur zu kleinen Änderungen in der Laufzeit.

MGParamNameMGParamNameMGParamNameMGParamNameMGParamName = 'initial_level'"initial_level""initial_level""initial_level""initial_level" legt die gröbste zu verwendende Stufe der Bildpyramide beim Grob-zu-Fein-Verfahren fest. Dies kann entweder durch Angabe eines positiven Wertes erfolgen, welcher die gröbste Ebene angibt. Ebene 0 ist dabei die feinste Ebene mit den ursprünglichen Bildern. Alternativ kann ein negativer Wert angegeben werden, welcher die gröbste zu verwendende Stufe relativ zur gröbsten verfügbaren Stufe angibt. Die gröbste verfügbare Stufe ist diejenige, auf welcher beide Bilder in beide Koordinatenrichtungen eine Größe von mindestens 4 Pixeln aufweisen. Wie unten angegeben, ist der Standardwert von 'initial_level'"initial_level""initial_level""initial_level""initial_level" -2. Dies erlaubt die Bestimmung der korrekten Disparität auch für Bilder, die sehr hohe Disparitäten aufweisen. In Einzelfällen, z.B. bei sich wiederholenden Texturen, kann dies allerdings dazu führen, dass zu große Disparitäten für Teile des Bildes berechnet werden. In diesem Fall sollte 'initial_level'"initial_level""initial_level""initial_level""initial_level" auf einen niedrigeren Wert gesetzt werden.

Bei Standardparametern werden die Bilder pro Pyramidenstufe um den Faktor 0.6 skaliert. Liegt eine Schätzung d der maximalen Disparität vor, so sollte die erste Ebene s so gewählt werden, dass größer als d ist.

MGParamNameMGParamNameMGParamNameMGParamNameMGParamName = 'iterations'"iterations""iterations""iterations""iterations" legt die Anzahl an Fixpunkt-Iterationen pro Ebene fest. Die genaue Anzahl an Iterationen bestimmt sich durch , wobei level die aktuelle Ebene in der Bildpyramide bezeichnet. Wird dieser Parameter gleich 0 gesetzt, so wird auf der Bildpyramidenebene 0 der ursprünglichen Bilder keine Iteration durchgeführt und als Ergebnis das skalierte Resultat der Ebene 1 zurückgeliefert. Dies eignet sich für besonders schnelle Verfahren. Die Anzahl an Iterationen geht annähernd linear in die Laufzeit des Verfahrens ein.

MGParamNameMGParamNameMGParamNameMGParamNameMGParamName = 'pyramid_factor'"pyramid_factor""pyramid_factor""pyramid_factor""pyramid_factor" legt den Skalierungsfaktor für die Bildpyramide des Grob-zu-Fein-Verfahrens fest. Die Höhe und Breite des nächst kleineren Bildes wird dabei um den angegebenen Faktor skaliert. Der Wert muss zwischen 0.1 und 0.9 liegen.

Die vordefinierten Parametergruppen für MGParamNameMGParamNameMGParamNameMGParamNameMGParamName = 'default_parameters'"default_parameters""default_parameters""default_parameters""default_parameters" enthalten folgende Werte:

'default_parameters'"default_parameters""default_parameters""default_parameters""default_parameters" = 'very_accurate'"very_accurate""very_accurate""very_accurate""very_accurate": 'mg_solver'"mg_solver""mg_solver""mg_solver""mg_solver" = 'full_multigrid'"full_multigrid""full_multigrid""full_multigrid""full_multigrid", 'mg_cycle_type'"mg_cycle_type""mg_cycle_type""mg_cycle_type""mg_cycle_type" = 'w'"w""w""w""w", 'mg_pre_relax'"mg_pre_relax""mg_pre_relax""mg_pre_relax""mg_pre_relax" = 5, 'mg_post_relax'"mg_post_relax""mg_post_relax""mg_post_relax""mg_post_relax" = 5, 'initial_level'"initial_level""initial_level""initial_level""initial_level" = -2, 'iterations'"iterations""iterations""iterations""iterations" = 5, 'pyramid_factor'"pyramid_factor""pyramid_factor""pyramid_factor""pyramid_factor" = 0.6.

'default_parameters'"default_parameters""default_parameters""default_parameters""default_parameters" = 'accurate'"accurate""accurate""accurate""accurate": 'mg_solver'"mg_solver""mg_solver""mg_solver""mg_solver" = 'full_multigrid'"full_multigrid""full_multigrid""full_multigrid""full_multigrid", 'mg_cycle_type'"mg_cycle_type""mg_cycle_type""mg_cycle_type""mg_cycle_type" = 'w'"w""w""w""w", 'mg_pre_relax'"mg_pre_relax""mg_pre_relax""mg_pre_relax""mg_pre_relax" = 2, 'mg_post_relax'"mg_post_relax""mg_post_relax""mg_post_relax""mg_post_relax" = 2, 'initial_level'"initial_level""initial_level""initial_level""initial_level" = -2, 'iterations'"iterations""iterations""iterations""iterations" = 2, 'pyramid_factor'"pyramid_factor""pyramid_factor""pyramid_factor""pyramid_factor" = 0.6.

'default_parameters'"default_parameters""default_parameters""default_parameters""default_parameters" = 'fast_accurate'"fast_accurate""fast_accurate""fast_accurate""fast_accurate": 'mg_solver'"mg_solver""mg_solver""mg_solver""mg_solver" = 'full_multigrid'"full_multigrid""full_multigrid""full_multigrid""full_multigrid", 'mg_cycle_type'"mg_cycle_type""mg_cycle_type""mg_cycle_type""mg_cycle_type" = 'v'"v""v""v""v", 'mg_pre_relax'"mg_pre_relax""mg_pre_relax""mg_pre_relax""mg_pre_relax" = 1, 'mg_post_relax'"mg_post_relax""mg_post_relax""mg_post_relax""mg_post_relax" = 1, 'initial_level'"initial_level""initial_level""initial_level""initial_level" = -2, 'iterations'"iterations""iterations""iterations""iterations" = 1, 'pyramid_factor'"pyramid_factor""pyramid_factor""pyramid_factor""pyramid_factor" = 0.6. Dies sind auch die Standardwerte wenn kein Parametersatz ausgewählt wird.

'default_parameters'"default_parameters""default_parameters""default_parameters""default_parameters" = 'fast'"fast""fast""fast""fast": 'mg_solver'"mg_solver""mg_solver""mg_solver""mg_solver" = 'full_multigrid'"full_multigrid""full_multigrid""full_multigrid""full_multigrid", 'mg_cycle_type'"mg_cycle_type""mg_cycle_type""mg_cycle_type""mg_cycle_type" = 'v'"v""v""v""v", 'mg_pre_relax'"mg_pre_relax""mg_pre_relax""mg_pre_relax""mg_pre_relax" = 1, 'mg_post_relax'"mg_post_relax""mg_post_relax""mg_post_relax""mg_post_relax" = 1, 'initial_level'"initial_level""initial_level""initial_level""initial_level" = -2, 'iterations'"iterations""iterations""iterations""iterations" = 0, 'pyramid_factor'"pyramid_factor""pyramid_factor""pyramid_factor""pyramid_factor" = 0.6.

Schwächen des Operators: Große Sprünge in der Disparität, welche großen Sprüngen im Abstand der beobachteten Objekte entsprechen, werden vergleichsweise stark geglättet. Dies führt insbesondere bei dünnen Objekten mit großem Abstand zum Hintergrund zu Problemen.

Am linken und rechten Rand des Bildes kann es zu Störungen kommen, da Bereiche der Szene dort nur in jeweils einem der beiden Bilder sichtbar sind.

Weiterhin sollten allgemeine Probleme bei Stereoanwendungen vermieden werden. Darunter fallen sich horizontal wiederholende Muster, schlecht texturierte Bereiche sowie Reflektionen.

Ausführungsinformationen

Parameter

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

Rektifiziertes Bild von Kamera 1.

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

Rektifiziertes Bild von Kamera 2.

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

Disparität.

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

Güte der berechneten Disparität wenn CalculateScoreCalculateScoreCalculateScoreCalculateScorecalculateScore auf 'true'"true""true""true""true" gesetzt ist.

GrayConstancyGrayConstancyGrayConstancyGrayConstancygrayConstancy (input_control)  real HTupleHTupleHtuple (real) (double) (double) (double)

Gewicht der Grauwerterhaltung im Datenterm.

Defaultwert: 1.0

Wertevorschläge: 0.0, 1.0, 2.0, 10.0

Restriktion: GrayConstancy >= 0.0

GradientConstancyGradientConstancyGradientConstancyGradientConstancygradientConstancy (input_control)  real HTupleHTupleHtuple (real) (double) (double) (double)

Gewicht der Gradientenerhaltung im Datenterm.

Defaultwert: 30.0

Wertevorschläge: 0.0, 1.0, 5.0, 10.0, 30.0, 50.0, 70.0

Restriktion: GradientConstancy >= 0.0

SmoothnessSmoothnessSmoothnessSmoothnesssmoothness (input_control)  real HTupleHTupleHtuple (real) (double) (double) (double)

Gewicht des Glattheitsterms bezüglich des Datenterms.

Defaultwert: 5.0

Wertevorschläge: 1.0, 3.0, 5.0, 10.0

Restriktion: Smoothness > 0.0

InitialGuessInitialGuessInitialGuessInitialGuessinitialGuess (input_control)  real HTupleHTupleHtuple (real) (double) (double) (double)

Startwert für die Disparität.

Defaultwert: 0.0

Wertevorschläge: -30.0, -20.0, -10.0, 0.0, 10.0, 20.0, 30.0

CalculateScoreCalculateScoreCalculateScoreCalculateScorecalculateScore (input_control)  string HTupleHTupleHtuple (string) (string) (HString) (char*)

Soll die Qualitätsschätzung in ScoreScoreScoreScorescore zurückgegeben werden?

Defaultwert: 'false' "false" "false" "false" "false"

Wertevorschläge: 'true'"true""true""true""true", 'false'"false""false""false""false"

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

Parametername(n) für das Mehrgitterverfahren.

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

Werteliste: 'default_parameters'"default_parameters""default_parameters""default_parameters""default_parameters", 'initial_level'"initial_level""initial_level""initial_level""initial_level", 'iterations'"iterations""iterations""iterations""iterations", 'mg_cycle_type'"mg_cycle_type""mg_cycle_type""mg_cycle_type""mg_cycle_type", 'mg_post_relax'"mg_post_relax""mg_post_relax""mg_post_relax""mg_post_relax", 'mg_pre_relax'"mg_pre_relax""mg_pre_relax""mg_pre_relax""mg_pre_relax", 'mg_solver'"mg_solver""mg_solver""mg_solver""mg_solver", 'pyramid_factor'"pyramid_factor""pyramid_factor""pyramid_factor""pyramid_factor"

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

Parameterwert(e) für das Mehrgitterverfahren.

Defaultwert: 'fast_accurate' "fast_accurate" "fast_accurate" "fast_accurate" "fast_accurate"

Wertevorschläge: 'very_accurate'"very_accurate""very_accurate""very_accurate""very_accurate", 'accurate'"accurate""accurate""accurate""accurate", 'fast_accurate'"fast_accurate""fast_accurate""fast_accurate""fast_accurate", 'fast'"fast""fast""fast""fast", 'v'"v""v""v""v", 'w'"w""w""w""w", 'none'"none""none""none""none", 'gauss_seidel'"gauss_seidel""gauss_seidel""gauss_seidel""gauss_seidel", 'multigrid'"multigrid""multigrid""multigrid""multigrid", 'full_multigrid'"full_multigrid""full_multigrid""full_multigrid""full_multigrid", 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, -1, -2, -3, -4, -5

Beispiel (HDevelop)

read_image (BaseballL, 'stereo/epipolar/baseball_l')
read_image (BaseballR, 'stereo/epipolar/baseball_r')
binocular_disparity_mg (BaseballL, BaseballR, Disparity, Score, \
                        0.25, 30, 5, 0, 'true', \
                        'default_parameters','fast_accurate')

Ergebnis

Sind die Parameterwerte korrekt, dann liefert binocular_disparity_mgbinocular_disparity_mgBinocularDisparityMgBinocularDisparityMgBinocularDisparityMg 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

map_imagemap_imageMapImageMapImageMapImage

Nachfolger

thresholdthresholdThresholdThresholdThreshold, disparity_to_distancedisparity_to_distanceDisparityToDistanceDisparityToDistanceDisparityToDistance, disparity_image_to_xyzdisparity_image_to_xyzDisparityImageToXyzDisparityImageToXyzDisparityImageToXyz

Alternativen

binocular_disparitybinocular_disparityBinocularDisparityBinocularDisparityBinocularDisparity, binocular_disparity_msbinocular_disparity_msBinocularDisparityMsBinocularDisparityMsBinocularDisparityMs, binocular_distancebinocular_distanceBinocularDistanceBinocularDistanceBinocularDistance, binocular_distance_mgbinocular_distance_mgBinocularDistanceMgBinocularDistanceMgBinocularDistanceMg, binocular_distance_msbinocular_distance_msBinocularDistanceMsBinocularDistanceMsBinocularDistanceMs

Siehe auch

map_imagemap_imageMapImageMapImageMapImage, gen_binocular_rectification_mapgen_binocular_rectification_mapGenBinocularRectificationMapGenBinocularRectificationMapGenBinocularRectificationMap, binocular_calibrationbinocular_calibrationBinocularCalibrationBinocularCalibrationBinocularCalibration

Modul

3D Metrology