| Operatoren |
gen_binocular_rectification_map — Berechnet die Abbildung der beiden Bildebenen eines binokularen Stereosystems in eine gemeinsame Bildebene.
gen_binocular_rectification_map( : Map1, Map2 : CamParam1, CamParam2, RelPose, SubSampling, Method, MapType : CamParamRect1, CamParamRect2, CamPoseRect1, CamPoseRect2, RelPoseRect)
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_disparity oder binocular_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 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.
Um die Abbildungsvorschrift für rektifizierte Bilder zu erhalten verlangt gen_binocular_rectification_map die internen Kameraparameter CamParam1 von Kamera 1 und CamParam2 von Kamera 2. Ebenso wird die relative Lage RelPose des Kamerasystems 2 bezüglich des Kamerasystems 1 benötigt. Die Werte für diese Parameter kann man beispielsweise vom Operator calibrate_cameras erhalten.
Die für die Rektifizierung modifizierten internen Kameraparameter werden in CamParamRect1 und CamParamRect2 ausgegeben. Die Rotation (und bei telezentrischen Kameras die Translation) des entzerrten Kamerasystems bezüglich des ursprünglichen Systems wird durch eine Punkttransformation vom entzerrten System ins originale System in CamPoseRect1 und CamPoseRect2 zurückgegeben. Schließlich gibt RelPoseRect die relative Lage der entzerrten Kamerasysteme durch eine Punkttransformation von der entzerrten Kamera 2 zur entzerrten Kamera 1 an.
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 Method bestimmt werden können (momentan steht nur ein Parameterwert zur Verfügung):
'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 Method 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 RelPoseRect kann sich von der relativen Lage der ursprünglichen Kameras RelPose dadurch stark unterscheiden.
Für ein Stereosystem gemischten Typs (d.h. eine perspektivische und eine telezentrische Kamera) wird der Parameter Method 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_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.
Die Abbildungsvorschriften für die Bilder von Kamera 1 und Kamera 2 werden in Map1 und Map2 in Form von Bildmatritzen zurückgegeben. Der Parameter MapType gibt an, in welchem Typ die Abbildungsvorschrift gespeichert werden sollen. Wurde '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') 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' 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 SubSampling 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_image als Mehrkanalbild abgespeichern (Format: 'tiff').
Stereosysteme, die sowohl Kameras mit hyperzentrischen Objektiven als auch Kameras ohne hyperzentrische Objektive enthalten, werden nicht unterstützt.
Abbildungsvorschrift für Bilder von Kamera 1.
Abbildungsvorschrift für Bilder von Kamera 2.
Interne Parameter der Kamera 1.
Interne Parameter der Kamera 2.
Punkttransformation von Kamera 2 zu Kamera 1.
Parameteranzahl: 7
Abtastfaktor.
Defaultwert: 1.0
Wertevorschläge: 0.5, 0.66, 1.0, 1.5, 2.0, 3.0, 4.0
Art der Entzerrung.
Defaultwert: 'geometric'
Werteliste: 'geometric'
Art der Abbildungsvorschrift.
Defaultwert: 'bilinear'
Werteliste: 'bilinear', 'coord_map_sub_pix', 'nearest_neighbor'
Interne Parameter der entzerrten Kamera 1.
Interne Parameter der entzerrten Kamera 2.
Punkttransformation von der entzerrten Kamera 1 zur ursprünglichen Kamera 1.
Parameteranzahl: 7
Punkttransformation von der entzerrten Kamera 2 zur ursprünglichen Kamera 2.
Parameteranzahl: 7
Punkttransformation von der entzerrten Kamera 2 zur entzerrten Kamera 1.
Parameteranzahl: 7
* 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,'geometric', '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
Sind die Parameterwerte korrekt, dann liefert gen_binocular_rectification_map den Wert 2 (H_MSG_TRUE).
map_image, binocular_disparity, binocular_distance, binocular_disparity_mg, binocular_distance_mg, binocular_disparity_ms, binocular_distance_ms, gen_image_to_world_plane_map, contour_to_world_plane_xld, image_points_to_world_plane
3D Metrology
| Operatoren |