gen_binocular_rectification_mapT_gen_binocular_rectification_mapGenBinocularRectificationMapGenBinocularRectificationMapgen_binocular_rectification_map — Berechnet die Abbildung der beiden Bildebenen eines binokularen
Stereosystems in eine gemeinsame Bildebene.
Stereobildpaare werden rektifiziert, indem eine
Transformationsvorschrift für jede Bildebene bestimmt wird, so dass
Paare von korrespondierenden Epipolarlinien kollinear sind und
parallel zur X-Achse des Bildkoordinatensystems verlaufen. Diese
Bildgeometrie ist eine Voraussetzung für eine effiziente Berechnung
von Disparitäten oder Distanzen mit Operatoren wie
z.B. binocular_disparitybinocular_disparityBinocularDisparityBinocularDisparityBinocularDisparitybinocular_disparity oder binocular_distancebinocular_distanceBinocularDistanceBinocularDistanceBinocularDistancebinocular_distance.
Man kann sich die rektifizierten Bilder vorstellen, als würden sie
von einem neuen Stereoaufbau aufgenommen, welchen man durch eine
Rotation (und Translation bei telezentrischen Flächen- und
Zeilenkameras) der ursprünglichen Kameras erhalten würde. Die
Projektionszentren (bzw. bei telezentrischen Kameras die Richtung
der optischen Achse) werden beibehalten. Bei perspektivischen
Kameras werden zusätzlich die Bildebenen in eine gemeinsame Ebene
transformiert. Letzteres ist gleichbedeutend mit der Gleichsetzung
der Bildweiten und der Gleichrichtung der optischen Achsen. Für ein
Stereosystem gemischten Typs (d.h. eine perspektivische und eine
telezentrische Kamera) werden die Bildebenen auch, wie unten
beschrieben, in eine gemeinsame Ebene transformiert.
Bei perspektivischen Flächenkameras ist dies lediglich eine
Verschiebung in der x Richtung. Im Allgemeinen werden die
Abbildungsvorschriften so festgelegt, dass sich das entzerrte
Kamerasystem 1 links von dem entzerrten Kamerasystem 2
befindet. Dies bedeutet, dass das optische Zentrum der entzerrten
Kamera 2 eine positive X-Koordinate im entzerrten Koordinatensystem
von Kamera 1 besitzt.
Die Projektion auf eine gemeinsame Ebene hat mehrere Freiheitsgrade,
welche implizit durch die Auswahl einer bestimmten Methode in
MethodMethodMethodMethodmethodmethod bestimmt werden können:
'viewing_direction'"viewing_direction""viewing_direction""viewing_direction""viewing_direction""viewing_direction" benutzt die Basisgerade als
x-Achse der gemeinsamen Bildebene. Der Mittelwert der
Blickrichtungen (z-Achsen) der beiden Kameras wird benutzt, um die
x-z-Ebene des rektifizierten Systems aufzuspannen. Die
resultierende rektifizierte z-Achse ist die Orientierung der
gemeinsamen Bildebene, welche somit genau in dieser Ebene liegt
und senkrecht zur Basisgeraden steht. In vielen Fällen weicht die
resultierende rektifizierte z-Achse nicht weit vom Mittelwert der
z-Achsen der alten Kameras ab. Die neue Bildweite wird so
bestimmt, dass die alten Bildhauptpunkte von der neuen Bildebene
gleichen Abstand haben. Die verschiedenen z-Achsenrichtungen sind
im unteren Schema dargestellt.
(1)
(2)
Darstellung der verschiedenen z-Achsenrichtungen bei Verwendung von
'viewing_direction'"viewing_direction""viewing_direction""viewing_direction""viewing_direction""viewing_direction".
(1): Blickrichtung der Basisgeraden (in orange) zugewandt.
(2): Blickrichtung entlang der Basisgeraden (in die Seite hinein zeigend,
in orange).
'geometric'"geometric""geometric""geometric""geometric""geometric" legt die Orientierung der gemeinsamen
Bildebene durch das Kreuzprodukt der Richtungen der Basisgeraden
und der Schnittgeraden der ursprünglichen Bildebenen fest. Die
neue Bildweite wird so bestimmt, dass die alten Bildhauptpunkte
von der neuen Bildebene gleichen Abstand haben.
Bei telezentrischen Flächen- und Zeilenkameras wird der Parameter
MethodMethodMethodMethodmethodmethod ignoriert. Die relative Lage beider Kameras ist in
einem solchen Aufbau nicht eindeutig bestimmt, da die Kameras
entlang ihrer optischen Achse verschoben die gleichen Aufnahmen
liefern. Um trotzdem eine absolute Distanzmessung zur Kamera zu
ermöglichen, wird intern angenommen, dass die Kameras einen festen
Abstand und Orientierung zueinander haben. Hierfür werden sie
entlang ihrer optischen Achse derart verschoben, dass ihr Abstand
ein Meter beträgt und die Gerade auf der beide Kameras liegen
(Basis) die optischen Achsen beider Kameras im gleichen Winkel
schneiden (Die Basis und die optischen Achsen bilden ein
gleichschenkliges Dreieck). Die optischen Achsen bleiben dabei
erhalten. Die relative Lage der rektifizierten Kameras
RelPoseRectRelPoseRectRelPoseRectRelPoseRectrelPoseRectrel_pose_rect kann sich von der relativen Lage der
ursprünglichen Kameras RelPoseRelPoseRelPoseRelPoserelPoserel_pose dadurch stark unterscheiden.
Für ein Stereosystem gemischten Typs (d.h. eine perspektivische und
eine telezentrische Kamera) wird der Parameter MethodMethodMethodMethodmethodmethod
ignoriert. Die gemeinsame rektifizierende Bildebene ist eindeutig
aus der Geometrie der perspektivischen Kamera und der relativen Lage
der beiden Kameras bestimmt. Die Normale der rektifizierenden
Bildebene ist der Vektor, der vom Projektionszentrum der
perspektivischen Kamera zum Punkt auf der optischen Achse der
telezentrischen Kamera zeigt, der den kürzesten Abstand zum
Projektionszentrum der perspektivischen Kamera besitzt. Dies ist
gleichzeitig die z-Achse der rektifizierten perspektivischen Kamera.
Die geometrische Basis des gemischten Stereosystems ist eine Gerade,
die durch das Projektionszentrum der perspektivischen Kamera
verläuft und dieselbe Richtung wie die z-Achse der telezentrischen
Kamera besitzt, d.h. die Basis ist parallel zur Blickrichtung der
telezentrischen Kamera. Die x-Achse der rektifizierten
perspektivischen Kamera ist durch die Basis gegeben und die y-Achse
wird so konstruiert, dass sich eine rechtshändiges Koordinatensystem
ergibt. Um die telezentrische Kamera zu rektifizieren, muss ihre
optische Achse auf die Basis verschoben werden und die Bildebene
muss um oder verkippt
werden. Um dies zu erreichen, muss ein spezieller Typ von
objektseitig telezentrischer Kamera, der diese spezielle Geometrie
darstellen kann (gekennzeichnet durch den negativen Abstand der
verkippten Bildebene ImagePlaneDist), für die
rektifizierte telezentrische Kamera verwendet werden. Die
Repräsentation dieses speziellen Kameratyps sollte als Blackbox
betrachtet werden, da sie ausschließlich zum Zwecke der
Rektifizierung in HALCON verwendet wird (und daher auch nicht in
camera_calibrationcamera_calibrationCameraCalibrationCameraCalibrationCameraCalibrationcamera_calibration beschrieben wird). Die rektifizierte
telezentrische Kamera hat dieselbe Orientierung wie die
ursprüngliche telezentrische Kamera. Ihr Referenzpunkt ist aber auf
einen Punkt auf der Basis verschoben worden.
Abbildungsvorschrift für die Bilder (Rectification Maps)
Die Abbildungsvorschriften für die Bilder von Kamera 1 und Kamera 2
werden in Map1Map1Map1Map1map1map_1 und Map2Map2Map2Map2map2map_2 in Form von Bildmatritzen
zurückgegeben. Der Parameter MapTypeMapTypeMapTypeMapTypemapTypemap_type gibt an, in welchem
Typ die Abbildungsvorschrift gespeichert werden sollen. Wurde
'nearest_neighbor'"nearest_neighbor""nearest_neighbor""nearest_neighbor""nearest_neighbor""nearest_neighbor" gewählt, so bestehen beide
Abbildungsvorschriften aus einem Bild mit einem Kanal, in dem für
jedes Pixel des Ergebnisbildes die linearen Koordinaten desjenigen
Pixels des Eingabebildes stehen, welches den transformierten
Koordinaten am nächsten liegt. Wurde die bilineare Interpolation
('bilinear'"bilinear""bilinear""bilinear""bilinear""bilinear") gewählt, so bestehen beide
Abbildungsvorschriften aus einem Bild mit fünf Kanälen. Der erste
Kanal enthält für jedes Pixel des Ergebnisbildes die linearen
Koordinaten desjenigen Pixels des Eingabebildes, welches links
oberhalb von den transformierten Koordinaten liegt. Die übrigen
vier Kanäle enthalten die Gewichte der einzelnen vier Nachbarpixel
der transformierten Koordinaten für die bilineare Interpolation in
folgender Reihenfolge:
2
3
4
5
Der zweite Kanal z.B. enthält die Gewichte der Pixel, die links
oberhalb der transformierten Koordinaten liegen. Wurde
'coord_map_sub_pix'"coord_map_sub_pix""coord_map_sub_pix""coord_map_sub_pix""coord_map_sub_pix""coord_map_sub_pix" gewählt, bestehen beide
Abbildungsvorschriften aus einem Vektorfeld, welches für jedes Pixel
des Ergebnisbildes die subpixelgenauen Koordinaten im Eingabebild
enthält.
Wenn die erzeugte Abbildung in einem anderen Programm
wiederverwendet werden soll, kann man sie mit dem Operator
write_imagewrite_imageWriteImageWriteImageWriteImagewrite_image als Mehrkanalbild abspeichern (Format:
'tiff'"tiff""tiff""tiff""tiff""tiff").
Achtung
Stereosysteme, die sowohl Kameras mit hyperzentrischen Objektiven
als auch Kameras ohne hyperzentrische Objektive enthalten, werden nicht
unterstützt.
Ausführungsinformationen
Multithreading-Typ: reentrant (läuft parallel zu nicht-exklusiven Operatoren).
Multithreading-Bereich: global (kann von jedem Thread aufgerufen werden).
Punkttransformation von der entzerrten Kamera 2
zur entzerrten Kamera 1.
Parameteranzahl: 7
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, \
CamPoseRect1, CamPoseRect2, \
RelPoseRect)
* Compute the disparities in online images.
while (1)
grab_image_async (Image1, AcqHandle1, -1)
map_image (Image1, Map1, ImageMapped1)
grab_image_async (Image2, AcqHandle2, -1)
map_image (Image2, Map2, ImageMapped2)
binocular_disparity(ImageMapped1, ImageMapped2, 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, \
CamPoseRect1, CamPoseRect2, \
RelPoseRect)
* Compute the disparities in online images.
while (1)
grab_image_async (Image1, AcqHandle1, -1)
map_image (Image1, Map1, ImageMapped1)
grab_image_async (Image2, AcqHandle2, -1)
map_image (Image2, Map2, ImageMapped2)
binocular_disparity(ImageMapped1, ImageMapped2, 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,&ImageMapped1);
grab_image_async(&Image2,AcqHandle2,-1);
map_image(Image2,Map2,&ImageMapped2);
binocular_disparity(ImageMapped1,ImageMapped2,&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, \
CamPoseRect1, CamPoseRect2, \
RelPoseRect)
* Compute the disparities in online images.
while (1)
grab_image_async (Image1, AcqHandle1, -1)
map_image (Image1, Map1, ImageMapped1)
grab_image_async (Image2, AcqHandle2, -1)
map_image (Image2, Map2, ImageMapped2)
binocular_disparity(ImageMapped1, ImageMapped2, 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, \
CamPoseRect1, CamPoseRect2, \
RelPoseRect)
* Compute the disparities in online images.
while (1)
grab_image_async (Image1, AcqHandle1, -1)
map_image (Image1, Map1, ImageMapped1)
grab_image_async (Image2, AcqHandle2, -1)
map_image (Image2, Map2, ImageMapped2)
binocular_disparity(ImageMapped1, ImageMapped2, Disparity, Score, \
'sad', 11, 11, 20, -40, 20, 2, 25, \
'left_right_check', 'interpolation')
endwhile
Ergebnis
Sind die Parameterwerte korrekt, dann liefert
gen_binocular_rectification_mapgen_binocular_rectification_mapGenBinocularRectificationMapGenBinocularRectificationMapGenBinocularRectificationMapgen_binocular_rectification_map den Wert TRUE.