16.21. disp2ip

This program has some rather specialized functionality. It is meant to solve the following problem. Consider a rover on a planetary body, with a stereo pair of cameras. To save on bandwidth, only the left raw image and filtered versions of both left and right images are transmitted to Earth. The filter is usually the sign of the Laplacian of Gaussian (sLoG), or the Laplacian of Gaussian (LoG).

Filtered images are enough for stereo, but not for interest point matching between images acquired at different times (rather than simultaneously). This makes it problematic to find the relative poses of the cameras, which is needed for rig_calibrator (Section 16.58) or bundle adjustment (Section 16.5).

The solution to find interest point matches only between the left raw images, then to use the disparities between the left and right filtered images to find versions of these interest points in the right images, producing a set of matches between all filtered images. This is the purpose of this program.

16.21.1. Procedure

16.21.1.1. Stereo between filtered images

It is assumed by this program that the stereo runs were created with affineepipolar alignment and that cameras may not be available. This program uses the disparities F.tif (Section 19) as input.

Hence, parallel_stereo (Section 16.50) should be invoked, for stereo pair with index i, along the lines of:

parallel_stereo                      \
  --correlator-mode                  \
  --prefilter-mode 0                 \
  --stereo-algorithm asp_bm          \
  --sgm-collar-size 0                \
  --alignment-method affineepipolar  \
  fltr/left/left_filtered_${i}.png   \
  fltr/right/right_filtered_${i}.png \
  stereo_${i}/run

The option --prefilter-mode 0 is very important, if the images are already filtered, otherwise a second filter would be applied on top. See Section 17 for more details.

It may be hard to find features in LoG-filtered images so consider using very large values of --ip-per-tile and --matches-per-tile, such as 50000 or more (this must be decreased for large images).

16.21.1.2. SfM between the left raw images

Structure-from-Motion (SfM) finds the interest point matches between the left raw images and the relative poses of the cameras:

theia_sfm --rig_config rig_config.txt \
  --theia_flags theia_flags.txt       \
  --images 'raw/left/left_raw*.png'   \
  --out_dir theia_left

This will produce the NVM file named theia_left/cameras.nvm.

See Section 9.1 for more details.

16.21.1.3. Running this program

Several lists should be prepared, and these must be in one-to-one correspondence:

ls fltr/left/left_filtered*.png   > left_filtered.txt
ls fltr/right/right_filtered*.png > right_filtered.txt
ls raw/left/left_raw*.png         >  left_raw.txt

ls stereo_*/run-F.tif | perl -p -e 's/-F\.tif//' > stereo.txt

Also ensure that the optical centers for all images are available in a file, as expected by the option --optical-center-list. For example, this may work, with the right values:

# Left images
for f in $(cat left_filtered.txt); do
  echo $f 1064 1025
done > optical_centers.txt
# Append the right images
for f in $(cat right_filtered.txt); do
  echo $f 1055 1032
done >> optical_centers.txt

Then, run:

disp2ip                                          \
  --left-raw-image-list left_raw.txt             \
  --left-filtered-image-list left_filtered.txt   \
  --right-filtered-image-list right_filtered.txt \
  --stereo-prefix-list stereo.txt                \
  --optical-center-list optical_centers.txt      \
  --input-nvm theia_left/cameras.nvm             \
  --output-nvm combined.nvm

The interest points in the input NVM file are assumed to be shifted relative to the optical center of those images, with the file theia_left/camera_offsets.txt (given the earlier notation) having those optical centers. The program will shift the produced interest points relative to the optical centers as well, creating combined_offsets.txt.

16.21.2. Use of results

The rig_calibrator program (Section 16.58), when called with the produced interest point matches, must use the option --use_initial_rig_transforms, and the rig configuration in --rig_config must have valid transforms between the sensors (field ref_to_sensor_transform). That is because disp2ip is unable to produce the correct poses for the camera images it adds, and those are populated with a nominal value.

The initial guess value of this transform is best determined with the rig_calibrator program itself, by running it with the left and right raw images, that here are not available. The following observed value worked well for a stereo rig:

ref_to_sensor_transform: 1 0 0 0 1 0 0 0 1 -0.14 0 0

This transform will be refined when rig_calibrator is run with the result produced by disp2ip.

The input and produced interest point matches can be inspected with stereo_gui (Section 16.67.9.4).

16.21.3. The input filter

This program will run equally well if the LoG filter is applied to them (Section 17), the sign of LoG, or no filter at all.

What is important is for the left and right filtered images to be consistent, so a reliable disparity map can be produced, and that the left raw images are available.

16.21.4. Command-line options

--left-raw-image-list <string>

File containing the list of raw left images, one per line.

--left-filtered-image-list <string>

File containing the list of left images after applying the LoG (Laplacian of Gaussian) filter, or some other filter, one per line.

--right-filtered-image-list <string>

File containing the list of right images after applying the LoG filter, or some other filter, one per line.

--stereo-prefix-list <string>

File containing the list of stereo prefixes, one per line. Each prefix is for a stereo run with a left filtered and right filtered image, with affine epipolar alignment. Stereo could have been run with --correlator-mode, so without cameras.

--optical-center-list <string>

File containing the list of optical centers for all filtered images, in pixels. On each line must have the image name, optical center column, then row. The order of images is not important.

--input-nvm <string>

Input NVM file, having interest point matches between the left raw images.

--output-nvm <string>

Output NVM file, having interest point matches between all filtered images, produced with the help of disparity maps.