gen_binocular_rectification_mapT_gen_binocular_rectification_mapGenBinocularRectificationMapGenBinocularRectificationMap — 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_disparityBinocularDisparityBinocularDisparityBinocularDisparity oder binocular_distancebinocular_distanceBinocularDistanceBinocularDistanceBinocularDistance.
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 Kameras) der
ursprünglichen Kameras erhalten würde. Die Projectionszentren
(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 Kameras 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
MethodMethodMethodMethodmethod bestimmt werden können:
'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".
(1): Blickrichtung der Basisgeraden (in orange) zugwandt.
(2): Blickrichtung entlang der Basisgeraden (in die Seite hinein zeigend,
in orange).
'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 Kameras wird der Parameter MethodMethodMethodMethodmethod
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 RelPoseRectRelPoseRectRelPoseRectRelPoseRectrelPoseRect kann sich von
der relativen Lage der ursprünglichen Kameras RelPoseRelPoseRelPoseRelPoserelPose
dadurch stark unterscheiden.
Für ein Stereosystem gemischten Typs (d.h. eine perspektivische und
eine telezentrische Kamera) wird der Parameter MethodMethodMethodMethodmethod
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 ImagePlaneDistImagePlaneDistImagePlaneDistImagePlaneDistimagePlaneDist), 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_calibrationCameraCalibrationCameraCalibrationCameraCalibration 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 Map1Map1Map1Map1map1 und Map2Map2Map2Map2map2 in Form von Bildmatritzen
zurückgegeben. Der Parameter MapTypeMapTypeMapTypeMapTypemapType gibt an, in welchem
Typ die Abbildungsvorschrift gespeichert werden sollen. Wurde
'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") 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" gewählt, bestehen beide
Abbildungsvorschriften aus einem Vektorfeld, welches für jedes Pixel
des Ergebnisbildes die subpixelgenauen Koordinaten im Eingabebild
enthält.
Die Größe und Auflösung der Abbildungen und transformierten Bilder
kann mit dem Parameter SubSamplingSubSamplingSubSamplingSubSamplingsubSampling bestimmt werden, welcher
einen Abtastfaktor auf die Originalbilder beschreibt.
Wenn die erzeugte Abbildung in einem anderen Programm
wiederverwendet werden soll, kann man sie mit dem Operator
write_imagewrite_imageWriteImageWriteImageWriteImage als Mehrkanalbild abgespeichern (Format:
'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 (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 (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_mapGenBinocularRectificationMapGenBinocularRectificationMapGenBinocularRectificationMap den Wert 2 (H_MSG_TRUE).