binocular_disparitybinocular_disparityBinocularDisparityBinocularDisparitybinocular_disparity — Berechnet die Disparität für ein rektifiziertes Bildpaar mit Hilfe
von Korrelationsmethoden.
binocular_disparitybinocular_disparityBinocularDisparityBinocularDisparitybinocular_disparity berechnet mit Hilfe von
Korrelationsmethoden pixelweise Korrespondenzen zwischen zwei
rektifizierten Bildern. Im Unterschied zu binocular_distancebinocular_distanceBinocularDistanceBinocularDistancebinocular_distance
werden die Ergebnisse nicht in Distanzwerte transformiert.
Die verwendete Korrelationsfunktion wird durch den Parameter
MethodMethodMethodmethodmethod bestimmt, welcher drei Berechnungsmethoden
unterscheidet:
'sad'"sad""sad""sad""sad": Summe der absoluten Differenzen (Summed Absolute Differences)
mit .
'ssd'"ssd""ssd""ssd""ssd": Summe der quadrierten Differenzen (Summed Squared Differences)
mit .
'ncc'"ncc""ncc""ncc""ncc": Normalisierte Kreuzkorrelation (Normalized Cross Correlation)
mit .
wobei
, , , :
Zeilen- und Spaltenkoordinaten der
korrespondierenden Pixel der beiden Eingabebilder,
, :: Grauwerte der nicht vorverarbeiteten Eingabebilder,
: Größe des Korrelationsfensters,
: mittlerer Grauwert innerhalb eines
Korrelationsfensters der Breite und Höhe .
Die Methoden 'sad'"sad""sad""sad""sad" und 'ssd'"ssd""ssd""ssd""ssd" vergleichen direkt
die Grauwerte der Pixel innerhalb des Grauwertfensters, wohingegen
'ncc'"ncc""ncc""ncc""ncc" den mittleren Grauwert und seine Varianz innerhalb
des Grauwertfensters ausgleicht. Wenn zwei Bilder in ihrer
Helligkeit und ihrem Kontrast unterschiedlich sind, ist daher
'ncc'"ncc""ncc""ncc""ncc" vorzuziehen. Ansonsten sind 'sad'"sad""sad""sad""sad" und
'ssd'"ssd""ssd""ssd""ssd" vorzuziehen, da sie aufgrund einfacherer interner
Berechnungen schneller sind.
Es muss darauf geachtet werden, dass die Güte der Korrelation für
steigende in den Methoden 'sad'"sad""sad""sad""sad" und
'ssd'"ssd""ssd""ssd""ssd" fällt (die beste Güte ist 0), während sie in der
Methode 'ncc'"ncc""ncc""ncc""ncc" steigt (die beste Güte ist 1.0).
Die Anzahl der Pyramidenstufen, welche verwendet werden um das
Zeitverhalten von binocular_disparitybinocular_disparityBinocularDisparityBinocularDisparitybinocular_disparity zu verbessern, wird
durch den Parameter NumLevelsNumLevelsNumLevelsnumLevelsnum_levels bestimmt. Einem grob-zu-fein
Schema folgend werden die Disparitätsbilder der höheren Stufen
berechnet und in rechteckige Bildteile von ähnlicher Disparität
unterteilt um den Suchbereich auf der nächst niedrigeren Stufe für
diesen Bildausschnitt einzuschränken. TextureThreshTextureThreshTextureThreshtextureThreshtexture_thresh und
ScoreThreshScoreThreshScoreThreshscoreThreshscore_thresh werden auf jeder Stufe angewendet, so dass die
mit DisparityDisparityDisparitydisparitydisparity und ScoreScoreScorescorescore zurückgegebene Bildregion
als die Schnittmenge der Bildregionen auf jeder einzelnen Stufe
definiert ist. Im allgemeinen lohnt sich das Verwenden von
Pyramidenstrukturen um so mehr, je mehr das Disparitätsbild in
homogene Bereiche unterteilt werden kann und je größer der
Disparitätsbereich definiert werden muss. Auf der anderen Seite
können zu hohe Pyramidenstufen durch ihre grobe Auflösung wichtige
Texturinformationen verlieren, so dass falsche Disparitätswerte
zurückgegeben werden können.
Der Wert 'interpolation'"interpolation""interpolation""interpolation""interpolation" für den Parameter
SubDisparitySubDisparitySubDisparitysubDisparitysub_disparity schließlich berechnet die Disparitäten
Subpixel genau. Das Verhalten wird ausgeschaltet indem der Parameter
auf 'none'"none""none""none""none" gesetzt wird.
Ausführungsinformationen
Multithreading-Typ: reentrant (läuft parallel zu nicht-exklusiven Operatoren).
Multithreading-Bereich: global (kann von jedem Thread aufgerufen werden).
Automatisch parallelisiert auf interner Datenebene.
* Set internal and external stereo parameters.
* Note that, typically, these values are the result of a prior
* calibration.
gen_cam_par_area_scan_division (0.01, -665, 5.2e-006, 5.2e-006, \
622, 517, 1280, 1024, CamParam1)
gen_cam_par_area_scan_division (0.01, -731, 5.2e-006, 5.2e-006, \
654, 519, 1280, 1024, CamParam2)
create_pose (0.1535,-0.0037,0.0447,0.17,319.84,359.89, \
'Rp+T', 'gba', 'point', RelPose)
* Compute the mapping for rectified images.
gen_binocular_rectification_map (Map1, Map2, CamParam1, CamParam2, RelPose, \
1, 'viewing_direction', 'bilinear', \
CamParamRect1,CamParamRect2, \
Cam1PoseRect1, Cam2PoseRect2,RelPoseRect)
* Compute the disparities in online images.
while (1)
grab_image_async (Image1, AcqHandle1, -1)
map_image (Image1, Map1, ImageRect1)
grab_image_async (Image2, AcqHandle2, -1)
map_image (Image2, Map2, ImageRect2)
binocular_disparity(ImageRect1, ImageRect2, Disparity, Score, 'sad', \
11, 11, 20, -40, 20, 2, 25, 'left_right_check', \
'interpolation')
endwhile
Beispiel (HDevelop)
* Set internal and external stereo parameters.
* Note that, typically, these values are the result of a prior
* calibration.
gen_cam_par_area_scan_division (0.01, -665, 5.2e-006, 5.2e-006, \
622, 517, 1280, 1024, CamParam1)
gen_cam_par_area_scan_division (0.01, -731, 5.2e-006, 5.2e-006, \
654, 519, 1280, 1024, CamParam2)
create_pose (0.1535,-0.0037,0.0447,0.17,319.84,359.89, \
'Rp+T', 'gba', 'point', RelPose)
* Compute the mapping for rectified images.
gen_binocular_rectification_map (Map1, Map2, CamParam1, CamParam2, RelPose, \
1, 'viewing_direction', 'bilinear', \
CamParamRect1,CamParamRect2, \
Cam1PoseRect1, Cam2PoseRect2,RelPoseRect)
* Compute the disparities in online images.
while (1)
grab_image_async (Image1, AcqHandle1, -1)
map_image (Image1, Map1, ImageRect1)
grab_image_async (Image2, AcqHandle2, -1)
map_image (Image2, Map2, ImageRect2)
binocular_disparity(ImageRect1, ImageRect2, Disparity, Score, 'sad', \
11, 11, 20, -40, 20, 2, 25, 'left_right_check', \
'interpolation')
endwhile
Beispiel (C++)
// Set internal and external stereo parameters.
// Note that, typically, these values are the result of a prior
// calibration.
gen_cam_par_area_scan_division (0.01, -665, 5.2e-006, 5.2e-006,
622, 517, 1280, 1024, &CamParam1);
gen_cam_par_area_scan_division (0.01, -731, 5.2e-006, 5.2e-006,
654, 519, 1280, 1024, &CamParam2);
create_pose (0.1535,-0.0037,0.0447,0.17,319.84,359.89,
"Rp+T", "gba", "point", &RelPose);
// Compute the mapping for rectified images.
gen_binocular_rectification_map(&Map1,&Map2,CamParam1,CamParam2,RelPose,1,
"viewing_direction","bilinear",
&CamParamRect1,&CamParamRect2,
&CamPoseRect1,&CamPoseRect2,&RelPosRect);
// Compute the disparities in online images.
while (1)
{
grab_image_async(&Image1,AcqHandle1,-1);
map_image(Image1,Map1,&ImageRect1);
grab_image_async(&Image2,AcqHandle2,-1);
map_image(Image2,Map2,&ImageRect2);
binocular_disparity(ImageRect1,ImageRect2,&Disparity,&Score,"sad",
11,11,20,-40,20,2,25,"left_right_check",
"interpolation");
}
Beispiel (HDevelop)
* Set internal and external stereo parameters.
* Note that, typically, these values are the result of a prior
* calibration.
gen_cam_par_area_scan_division (0.01, -665, 5.2e-006, 5.2e-006, \
622, 517, 1280, 1024, CamParam1)
gen_cam_par_area_scan_division (0.01, -731, 5.2e-006, 5.2e-006, \
654, 519, 1280, 1024, CamParam2)
create_pose (0.1535,-0.0037,0.0447,0.17,319.84,359.89, \
'Rp+T', 'gba', 'point', RelPose)
* Compute the mapping for rectified images.
gen_binocular_rectification_map (Map1, Map2, CamParam1, CamParam2, RelPose, \
1, 'viewing_direction', 'bilinear', \
CamParamRect1,CamParamRect2, \
Cam1PoseRect1, Cam2PoseRect2,RelPoseRect)
* Compute the disparities in online images.
while (1)
grab_image_async (Image1, AcqHandle1, -1)
map_image (Image1, Map1, ImageRect1)
grab_image_async (Image2, AcqHandle2, -1)
map_image (Image2, Map2, ImageRect2)
binocular_disparity(ImageRect1, ImageRect2, Disparity, Score, 'sad', \
11, 11, 20, -40, 20, 2, 25, 'left_right_check', \
'interpolation')
endwhile
Ergebnis
Sind die Parameterwerte korrekt, dann liefert
binocular_disparitybinocular_disparityBinocularDisparityBinocularDisparitybinocular_disparity den Wert 2 (
H_MSG_TRUE)
.