HALCON Reference Manual 10.0.2
Table of Contents / 3D Reconstruction / Binocular Stereo ClassesClassesClasses | | | Operators

gen_binocular_rectification_mapT_gen_binocular_rectification_mapgen_binocular_rectification_mapGenBinocularRectificationMapGenBinocularRectificationMap (Operator)

Name

gen_binocular_rectification_mapT_gen_binocular_rectification_mapgen_binocular_rectification_mapGenBinocularRectificationMapGenBinocularRectificationMap — Generate transformation maps that describe the mapping of the images of a binocular camera pair to a common rectified image plane.

Signature

gen_binocular_rectification_map( : Map1, Map2 : CamParam1, CamParam2, RelPose, SubSampling, Method, MapType : CamParamRect1, CamParamRect2, CamPoseRect1, CamPoseRect2, RelPoseRect)

Herror T_gen_binocular_rectification_map(Hobject* Map1, Hobject* Map2, const Htuple CamParam1, const Htuple CamParam2, const Htuple RelPose, const Htuple SubSampling, const Htuple Method, const Htuple MapType, Htuple* CamParamRect1, Htuple* CamParamRect2, Htuple* CamPoseRect1, Htuple* CamPoseRect2, Htuple* RelPoseRect)

Herror gen_binocular_rectification_map(Hobject* Map1, Hobject* Map2, const HTuple& CamParam1, const HTuple& CamParam2, const HTuple& RelPose, const HTuple& SubSampling, const HTuple& Method, const HTuple& MapType, HTuple* CamParamRect1, HTuple* CamParamRect2, HTuple* CamPoseRect1, HTuple* CamPoseRect2, HTuple* RelPoseRect)

HImage HImage::GenBinocularRectificationMap(HImage* Map2, const HTuple& CamParam1, const HTuple& CamParam2, const HTuple& RelPose, const HTuple& SubSampling, const HTuple& Method, const HTuple& MapType, HTuple* CamParamRect1, HTuple* CamParamRect2, HTuple* CamPoseRect1, HTuple* CamPoseRect2, HTuple* RelPoseRect)

void HOperatorSetX.GenBinocularRectificationMap(
[out] IHUntypedObjectX*Map1, [out] IHUntypedObjectX*Map2, [in] VARIANT CamParam1, [in] VARIANT CamParam2, [in] VARIANT RelPose, [in] VARIANT SubSampling, [in] VARIANT Method, [in] VARIANT MapType, [out] VARIANT* CamParamRect1, [out] VARIANT* CamParamRect2, [out] VARIANT* CamPoseRect1, [out] VARIANT* CamPoseRect2, [out] VARIANT* RelPoseRect)

IHImageX* HPoseX.GenBinocularRectificationMap(
[out] IHImageX*Map2, [in] VARIANT CamParam1, [in] VARIANT CamParam2, [in] VARIANT RelPose, [in] double SubSampling, [in] BSTR Method, [in] BSTR MapType, [out] VARIANT* CamParamRect1, [out] VARIANT* CamParamRect2, [out] VARIANT* CamPoseRect1, [out] VARIANT* CamPoseRect2, [out] VARIANT* RelPoseRect)

IHImageX* HImageX.GenBinocularRectificationMap(
[in] VARIANT CamParam1, [in] VARIANT CamParam2, [in] VARIANT RelPose, [in] double SubSampling, [in] BSTR Method, [in] BSTR MapType, [out] VARIANT* CamParamRect1, [out] VARIANT* CamParamRect2, [out] VARIANT* CamPoseRect1, [out] VARIANT* CamPoseRect2, [out] VARIANT* RelPoseRect)

static void HOperatorSet.GenBinocularRectificationMap(out HObject map1, out HObject map2, HTuple camParam1, HTuple camParam2, HTuple relPose, HTuple subSampling, HTuple method, HTuple mapType, out HTuple camParamRect1, out HTuple camParamRect2, out HTuple camPoseRect1, out HTuple camPoseRect2, out HTuple relPoseRect)

HImage HPose.GenBinocularRectificationMap(out HImage map2, HTuple camParam1, HTuple camParam2, double subSampling, string method, string mapType, out HTuple camParamRect1, out HTuple camParamRect2, out HPose camPoseRect1, out HPose camPoseRect2, out HPose relPoseRect)

HImage HImage.GenBinocularRectificationMap(HTuple camParam1, HTuple camParam2, HPose relPose, double subSampling, string method, string mapType, out HTuple camParamRect1, out HTuple camParamRect2, out HPose camPoseRect1, out HPose camPoseRect2, out HPose relPoseRect)

Description

Given a pair of stereo images, rectification determines a transformation of each image plane in a way that pairs of conjugate epipolar lines become collinear and parallel to the horizontal image axes. The rectified images can be thought of as acquired by a new stereo rig, obtained by rotating the original cameras. The camera centers of this virtual rig are maintained whereas the image planes coincide, which means that the focal lengths are set equal, and the optical axes parallel.

To achieve the transformation map for rectified images gen_binocular_rectification_mapgen_binocular_rectification_mapgen_binocular_rectification_mapGenBinocularRectificationMapGenBinocularRectificationMap requires the internal camera parameters CamParam1CamParam1CamParam1CamParam1camParam1 of the projective camera 1 and CamParam2CamParam2CamParam2CamParam2camParam2 of the projective camera 2, as well as the relative pose RelPoseRelPoseRelPoseRelPoserelPose defining a point transformation from camera 2 to camera 1. These parameters can be obtained, e.g., from the operator calibrate_camerascalibrate_camerascalibrate_camerasCalibrateCamerasCalibrateCameras.

The projection onto a common plane has many degrees of freedom which are implicitly restricted by selecting a certain method in MethodMethodMethodMethodmethod (currently only one method available):

The mapping functions for the images of camera 1 and camera 2 are returned in the images Map1Map1Map1Map1map1 and Map2Map2Map2Map2map2. MapTypeMapTypeMapTypeMapTypemapType is used to specify the type of the output maps. If 'nearest_neighbor'"nearest_neighbor""nearest_neighbor""nearest_neighbor""nearest_neighbor" is chosen, both maps consist of one image containing one channel, in which for each pixel of the resulting image the linearized coordinate of the pixel of the input image is stored that is the nearest neighbor to the transformed coordinates. If 'bilinear'"bilinear""bilinear""bilinear""bilinear" interpolation is chosen, both maps consists of one image containing five channels. In the first channel for each pixel in the resulting image the linearized coordinates of the pixel in the input image is stored that is in the upper left position relative to the transformed coordinates. The four other channels contain the weights of the four neighboring pixels of the transformed coordinates which are used for the bilinear interpolation, in the following order:

+---+---+
| 2 | 3 |
+---+---+
| 4 | 5 |
+---+---+

The second channel, for example, contains the weights of the pixels that lie to the upper left relative to the transformed coordinates. If 'coordinate_map_sub_pix'"coordinate_map_sub_pix""coordinate_map_sub_pix""coordinate_map_sub_pix""coordinate_map_sub_pix" is chosen, both maps consist of one vector field image, in which for each pixel of the resulting image the subpixel precise coordinates in the input image are stored.

The size and resolution of the maps and of the transformed images can be adjusted by the SubSamplingSubSamplingSubSamplingSubSamplingsubSampling parameter which applies a sub-sampling factor to the original images.

In addition, gen_binocular_rectification_mapgen_binocular_rectification_mapgen_binocular_rectification_mapGenBinocularRectificationMapGenBinocularRectificationMap returns the modified internal and external camera parameters of the rectified stereo rig. CamParamRect1CamParamRect1CamParamRect1CamParamRect1camParamRect1 and CamParamRect2CamParamRect2CamParamRect2CamParamRect2camParamRect2 contain the modified internal parameters of camera 1 and camera 2, respectively. The rotation of the rectified camera in relation to the original camera is specified by CamPoseRect1CamPoseRect1CamPoseRect1CamPoseRect1camPoseRect1 and CamPoseRect2CamPoseRect2CamPoseRect2CamPoseRect2camPoseRect2, respectively. Finally, RelPoseRectRelPoseRectRelPoseRectRelPoseRectrelPoseRect returns the modified relative pose of the rectified camera system 2 in relation to the rectified camera system 1 defining a translation in x only. Generally, the transformations are defined in a way that the rectified camera 1 is left of the rectified camera 2. This means that the optical center of camera 2 has a positive x coordinate of the rectified coordinate system of camera 1.

If you want to re-use the created map in another program, you can save it as a multi-channel image with the operator write_imagewrite_imagewrite_imageWriteImageWriteImage, using the format 'tiff'"tiff""tiff""tiff""tiff".

Parallelization

Parameters

Map1Map1Map1Map1map1 (output_object)  (multichannel-)image objectHImageHImageHImageXHobject * (int4 / uint2 / vector_field)

Image containing the mapping data of camera 1.

Map2Map2Map2Map2map2 (output_object)  (multichannel-)image objectHImageHImageHImageXHobject * (int4 / uint2 / vector_field)

Image containing the mapping data of camera 2.

CamParam1CamParam1CamParam1CamParam1camParam1 (input_control)  number-array HTupleHTupleVARIANTHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong) (double / Hlong)

Internal parameters of the projective camera 1.

Number of elements: (CamParam1 == 8) || (CamParam1 == 12)

CamParam2CamParam2CamParam2CamParam2camParam2 (input_control)  number-array HTupleHTupleVARIANTHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong) (double / Hlong)

Internal parameters of the projective camera 2.

Number of elements: (CamParam2 == 8) || (CamParam2 == 12)

RelPoseRelPoseRelPoseRelPoserelPose (input_control)  pose-array HPose, HTupleHTupleHPoseX, VARIANTHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong) (double / Hlong)

Point transformation from camera 2 to camera 1.

Number of elements: 7

SubSamplingSubSamplingSubSamplingSubSamplingsubSampling (input_control)  real HTupleHTupleVARIANTHtuple (real) (double) (double) (double) (double)

Factor of sub sampling.

Default value: 1.0

Suggested values: 0.5, 0.66, 1.0, 1.5, 2.0, 3.0, 4.0

MethodMethodMethodMethodmethod (input_control)  string HTupleHTupleVARIANTHtuple (string) (string) (char*) (BSTR) (char*)

Type of rectification.

Default value: 'geometric' "geometric" "geometric" "geometric" "geometric"

List of values: 'geometric'"geometric""geometric""geometric""geometric"

MapTypeMapTypeMapTypeMapTypemapType (input_control)  string HTupleHTupleVARIANTHtuple (string) (string) (char*) (BSTR) (char*)

Type of mapping.

Default value: 'bilinear' "bilinear" "bilinear" "bilinear" "bilinear"

List of values: 'nearest_neighbor'"nearest_neighbor""nearest_neighbor""nearest_neighbor""nearest_neighbor", 'bilinear'"bilinear""bilinear""bilinear""bilinear", 'coord_map_sub_pix'"coord_map_sub_pix""coord_map_sub_pix""coord_map_sub_pix""coord_map_sub_pix"

CamParamRect1CamParamRect1CamParamRect1CamParamRect1camParamRect1 (output_control)  number-array HTupleHTupleVARIANTHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong) (double / Hlong)

Rectified internal parameters of the projective camera 1.

Number of elements: (CamParamRect1 == 8) || (CamParamRect1 == 12)

CamParamRect2CamParamRect2CamParamRect2CamParamRect2camParamRect2 (output_control)  number-array HTupleHTupleVARIANTHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong) (double / Hlong)

Rectified internal parameters of the projective camera 2.

Number of elements: (CamParamRect2 == 8) || (CamParamRect2 == 12)

CamPoseRect1CamPoseRect1CamPoseRect1CamPoseRect1camPoseRect1 (output_control)  pose-array HPose, HTupleHTupleHPoseX, VARIANTHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong) (double / Hlong)

Point transformation from the rectified camera 1 to the original camera 1.

Number of elements: 7

CamPoseRect2CamPoseRect2CamPoseRect2CamPoseRect2camPoseRect2 (output_control)  pose-array HPose, HTupleHTupleHPoseX, VARIANTHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong) (double / Hlong)

Point transformation from the rectified camera 1 to the original camera 1.

Number of elements: 7

RelPoseRectRelPoseRectRelPoseRectRelPoseRectrelPoseRect (output_control)  pose-array HPose, HTupleHTupleHPoseX, VARIANTHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong) (double / Hlong)

Point transformation from the rectified camera 2 to the rectified camera 1.

Number of elements: 7

Example (HDevelop)

* read the internal and external stereo parameters
read_cam_par ('cam_left.dat', CamParam1)
read_cam_par ('cam_right.dat', CamParam2)
read_pose ('relpos.dat', RelPose)

* compute the mapping for rectified images
gen_binocular_rectification_map (Map1, Map2, CamParam1, CamParam2, RelPose, \
                                 1,'geometric', 'bilinear', CamParRect1, \
                                 CamParamRect2, Cam1PoseRect1, \
                                 Cam2PoseRect2, 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

Example (HDevelop)

* read the internal and external stereo parameters
read_cam_par ('cam_left.dat', CamParam1)
read_cam_par ('cam_right.dat', CamParam2)
read_pose ('relpos.dat', RelPose)

* compute the mapping for rectified images
gen_binocular_rectification_map (Map1, Map2, CamParam1, CamParam2, RelPose, \
                                 1,'geometric', 'bilinear', CamParRect1, \
                                 CamParamRect2, Cam1PoseRect1, \
                                 Cam2PoseRect2, 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

Example (C++)

// read the internal and external stereo parameters
read_cam_par("cam_left.dat",CamParam1);
read_cam_par("cam_right.dat",CamParam2);
read_pose("relpos.dat",RelPose);
// compute the mapping for rectified images
gen_binocular_rectification_map(&Map1,&Map2,CamParam1,CamParam2,RelPose,1,
                                "geometric","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");
}

Example (HDevelop)

* read the internal and external stereo parameters
read_cam_par ('cam_left.dat', CamParam1)
read_cam_par ('cam_right.dat', CamParam2)
read_pose ('relpos.dat', RelPose)

* compute the mapping for rectified images
gen_binocular_rectification_map (Map1, Map2, CamParam1, CamParam2, RelPose, \
                                 1,'geometric', 'bilinear', CamParRect1, \
                                 CamParamRect2, Cam1PoseRect1, \
                                 Cam2PoseRect2, 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

Example (HDevelop)

* read the internal and external stereo parameters
read_cam_par ('cam_left.dat', CamParam1)
read_cam_par ('cam_right.dat', CamParam2)
read_pose ('relpos.dat', RelPose)

* compute the mapping for rectified images
gen_binocular_rectification_map (Map1, Map2, CamParam1, CamParam2, RelPose, \
                                 1,'geometric', 'bilinear', CamParRect1, \
                                 CamParamRect2, Cam1PoseRect1, \
                                 Cam2PoseRect2, 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

Result

gen_binocular_rectification_mapgen_binocular_rectification_mapgen_binocular_rectification_mapGenBinocularRectificationMapGenBinocularRectificationMap returns 2 (H_MSG_TRUE) if all parameter values are correct. If necessary, an exception is raised.

Possible Predecessors

binocular_calibrationbinocular_calibrationbinocular_calibrationBinocularCalibrationBinocularCalibration

Possible Successors

map_imagemap_imagemap_imageMapImageMapImage

Alternatives

gen_image_to_world_plane_mapgen_image_to_world_plane_mapgen_image_to_world_plane_mapGenImageToWorldPlaneMapGenImageToWorldPlaneMap

See also

map_imagemap_imagemap_imageMapImageMapImage, gen_image_to_world_plane_mapgen_image_to_world_plane_mapgen_image_to_world_plane_mapGenImageToWorldPlaneMapGenImageToWorldPlaneMap, contour_to_world_plane_xldcontour_to_world_plane_xldcontour_to_world_plane_xldContourToWorldPlaneXldContourToWorldPlaneXld, image_points_to_world_planeimage_points_to_world_planeimage_points_to_world_planeImagePointsToWorldPlaneImagePointsToWorldPlane

Module

3D Metrology


Table of Contents / 3D Reconstruction / Binocular Stereo ClassesClassesClasses | | | Operators
HALCON Reference Manual 10.0.2 Copyright © 1996-2011 MVTec Software GmbH