gen_image_to_world_plane_mapT_gen_image_to_world_plane_mapGenImageToWorldPlaneMapGenImageToWorldPlaneMapgen_image_to_world_plane_map — Berechnen der Abbildung von der Bildebene in die Ebene z=0 eines
Weltkoordinatensystems.
gen_image_to_world_plane_mapgen_image_to_world_plane_mapGenImageToWorldPlaneMapGenImageToWorldPlaneMapGenImageToWorldPlaneMapgen_image_to_world_plane_map errechnet die Abbildung MapMapMapMapmapmap
von der Bildebene in die Ebene z=0 (Messebene) eines
Weltkoordinatensystems. Diese Abbildung kann z.B. dazu verwendet werden
kann, ein Bild mit dem Operator map_imagemap_imageMapImageMapImageMapImagemap_image zu rektifizieren. Das
rektifizierte Bild weist dann weder radiale noch perspektivische
Verzerrungen auf; es entspricht einem Bild, das von einer verzerrungsfreien
Kamera aufgenommen wird, die senkrecht auf die Messebene im
Weltkoordinatensystem schaut. Das Weltkoordinatensystem (wcs) wird
gewählt, indem man seine 3D-Lage in Kamerakoordinaten in WorldPoseWorldPoseWorldPoseWorldPoseworldPoseworld_pose
übergibt. Diese 3D-Lage wird in der Form
erwartet. Dabei steht
ccs für das Kamerakoordinatensystem, siehe auch
Transformationen / Posen und
„Solution Guide III-C - 3D Vision“.
In CameraParamCameraParamCameraParamCameraParamcameraParamcamera_param müssen die internen Kameraparameter übergeben werden
(siehe Kalibrierung für ihre Reihenfolge und das zu
Grunde liegende Kameramodell).
Mit dem Parameter ScaleScaleScaleScalescalescale kann die Größe eines Pixels im
transformierten Bild festgelegt werden. Hierbei gibt es zwei typische
Szenarien: Erstens kann das Bild so skaliert werden, dass Pixelkoordinaten
im transformierten Bild direkt in einer metrischen Einheit vorliegen, dass
ein Pixel also z.B. einem Mikrometer entspricht. Dies ist nützlich, falls
im transformierten Bild Messaufgaben durchgeführt werden sollen, deren
Ergebnisse dann automatisch in metrischen Einheiten vorliegen. Im
zweiten Szenario skaliert man das Bild so, dass sein Inhalt im
transformierten Bild in ähnlicher Größe vorliegt wie im Originalbild. Diese
Art der Skalierung ist z.B. günstig, wenn man im transformierten Bild
formbasiertes Matching anwenden will.
ScaleScaleScaleScalescalescale entspricht dem Verhältnis gewünschte
Pixelgröße/ursprüngliche Einheit. Ein Pixelgröße von 1um heißt, dass ein
Pixel im transformierten Bild der Fläche 1um x 1um in der Messebene
entspricht. Die ursprüngliche Einheit ist durch die Koordinaten des
Kalibrierkörpers gegeben. Falls dies, wie bei der Standard-Kalibrierplatte,
Meter sind, ist es auch möglich, die gewünschte Einheit der Pixelkoordinaten
direkt durch 'm'"m""m""m""m""m", 'cm'"cm""cm""cm""cm""cm", 'mm'"mm""mm""mm""mm""mm", 'microns'"microns""microns""microns""microns""microns"
oder 'um'"um""um""um""um""um" anzugeben.
Die Abbildungsvorschrift wird in dem Ausgabebild MapMapMapMapmapmap gespeichert.
Dieses hat die gleiche Größe wie die Ergebnisbilder nach der Abbildung.
Der Parameter MapTypeMapTypeMapTypeMapTypemapTypemap_type gibt an, in welchem Typ die
Abbildungsvorschrift gespeichert werden soll. Wurde
'nearest_neighbor'"nearest_neighbor""nearest_neighbor""nearest_neighbor""nearest_neighbor""nearest_neighbor" gewählt,
so besteht MapMapMapMapmapmap 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 besteht MapMapMapMapmapmap 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, besteht MapMapMapMapmapmap 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").
Ausführungsinformationen
Multithreading-Typ: reentrant (läuft parallel zu nicht-exklusiven Operatoren).
Multithreading-Bereich: global (kann von jedem Thread aufgerufen werden).
* Calibrate camera.
calibrate_cameras (CalibDataID, Error)
* Obtain camera parameters.
get_calib_data (CalibDataID, 'camera', 0, 'params', CamParam)
* Example values, if no calibration data is available:
CamParam := ['area_scan_division', 0.0087, -1859, 8.65e-006, 8.6e-006, \
362.5, 291.6, 768, 576]
* Get reference pose (pose 4 of calibration object 0).
get_calib_data (CalibDataID, 'calib_obj_pose',\
[0,4], 'pose', Pose)
* Example values, if no calibration data is available:
Pose := [-0.11, -0.21, 2.51, 352.73, 346.73, 336.48, 0]
* Compensate thickness of plate.
set_origin_pose (Pose, -1.125, -1.0, 0, PoseNewOrigin)
* Transform the image into the world plane.
read_image (Image, 'calib/calib-3d-coord-04')
gen_image_to_world_plane_map (MapSingle, CamParam, PoseNewOrigin,\
CamParam[6], CamParam[7], 900, 800, 0.0025, 'bilinear')
map_image (Image, MapSingle, ImageMapped)
Ergebnis
Sind die Parameterwerte korrekt, dann liefert
gen_image_to_world_plane_mapgen_image_to_world_plane_mapGenImageToWorldPlaneMapGenImageToWorldPlaneMapGenImageToWorldPlaneMapgen_image_to_world_plane_map den Wert TRUE.