Files
Speckle-Scanner/05_disparity/libsgm
..

installation process for US:

Install Anaconda and CUDA Toolkit (compute capability >= 3.5) Check if cmake is installed.

$ cmake --version

if version is <3.18

$ sudo apt remove cmake #Only if cmake is installed with <3.18 version
$ wget https://github.com/Kitware/CMake/releases/download/v3.21.5/cmake-3.21.5.tar.gz
$ tar -xzvf cmake-3.21.5.tar.gz
$ cd cmake-3.21.5
$ ./bootstrap
$ make
$ sudo make install
$ cmake --version

Now if it is giving error of not found

$ find /usr/local/bin -name cmake

if path exists then close the terminal and open new terminal then again check the version.

$ cmake --version

Environment:

Create an environment (named libsgm) in conda

$ conda create --name libsgm
$ conda activate libsgm

Installing Fixstars LibSGM:

$ git clone https://gitea.subseascanning.com/dejhost/libSGM.git
$ cd libSGM
$ git submodule update --init
$ mkdir build  
$ cd build
$ cmake ../
$ make

Sample Execution

$ pwd
.../libSGM
$ cd build
$ cmake .. -DENABLE_SAMPLES=on
$ make
$ cd sample

place /data folder in libSGM/build/sample/data.

Now run the command once to confirm the installation and working of LibSGM. For single image pair you use this stereosgm_new file The disparity map will be saved on the same path which contains the executeable stereosgm_new file (.../libSGM/build/sample)

$ ./stereosgm_new data/lc00012.bmp data/rc00012.bmp

For multiple pairs one after another you can use stereosgm_image it will save disparity.xml files in output directory.

$ ./stereosgm_image data/lc%05d.bmp data/rc%05d.bmp

Pipeline Usage (Automated Path Resolution)

Use run_sgm_pipeline.py to run libSGM across the project folder structure automatically. It picks the last rectified image pair (highest timestamp) from each scan's 02_rect_images/ folder, runs stereosgm_new, and saves results to 03_sgm_disp_map/.

Folder structure assumed

~/Speckle-Scanner_Processing_data/
└── <project>/
    └── <date>/
        └── <session>/
            └── <ScanXXXXXX>/
                ├── 02_rect_images/     ← lc_ts<last>.png + rc_ts<same>.png (input)
                ├── 03_sgm_disp_map/    ← disparity.xml + disparity_color.png (created)
                └── 05_sgm_pcl/         ← untouched

Pairs are matched on the shared ts token (e.g. ts1634840093). Both formats work: lc_ts1634840093_ck….png / rc_ts1634840093_ck….png and lc_ts1634840093.png / rc_ts1634840093.png.

Commands

cd ~/Speckle-Scanner/05_disparity/libsgm

# Process ALL scans in a session
python run_sgm_pipeline.py \
  --project Olsen_wings \
  --date    2026-05-12 \
  --session session1

# Process ALL sessions on a date (omit --session)
python run_sgm_pipeline.py \
  --project Olsen_wings \
  --date    2026-05-12

# Process a SINGLE scan
python run_sgm_pipeline.py \
  --project Olsen_wings \
  --date    2026-05-12 \
  --session session1 \
  --scan    Scan000001

# Custom SGM parameters
python run_sgm_pipeline.py \
  --project    Olsen_wings \
  --date       2026-05-12 \
  --session    session1 \
  --disp_size  128 \
  --P1         8 \
  --P2         32 \
  --min_disp   0 \
  --num_paths  8 \
  --census_type 1

Pipeline parameters

Parameter Default Description
--project Project name (e.g. Olsen_wings)
--date Date string (e.g. 2026-05-12)
--session all Session name (e.g. session1); omit to process all sessions on that date
--scan all Single scan (e.g. Scan000001); omit to process all scans in the session
--disp_size 256 Maximum disparity value (64, 128, or 256)
--P1 10 SGM penalty for disparity change of ±1
--P2 120 SGM penalty for disparity change > 1
--uniqueness 0.80 Uniqueness ratio threshold
--num_paths 8 Scanlines for cost aggregation (4 or 8)
--min_disp -160 Minimum disparity value
--LR_max_diff 1 Maximum allowed left-right disparity difference
--census_type 1 Census transform type: 0=CENSUS_9x7, 1=SYMMETRIC_CENSUS_9x7

What gets saved in 03_sgm_disp_map/

File Description
disparity.xml Raw disparity matrix (OpenCV FileStorage format, CV_16S)
disparity_color.png Colorized disparity image (TURBO colormap, 8-bit)

Direct Binary Usage

Run stereosgm_new manually with explicit paths (must run from the build/sample directory or use full paths):

cd ~/Speckle-Scanner/05_disparity/libsgm/build/sample

# Default parameters, save to current directory
./stereosgm_new data/lc00012.bmp data/rc00012.bmp

# Save to a specific output folder, no display window
./stereosgm_new \
  /path/to/lc_image.png \
  /path/to/rc_image.png \
  --output_dir=/path/to/03_sgm_disp_map \
  --no_display=1 \
  --disp_size=128 --P1=8 --P2=32

Available Parameters

Parameter Default Value Description
@left-image-format none Format string for the path to input left image (e.g., "left/img_%04d.png")
@right-image-format none Format string for the path to input right image
--disp_size 256 Maximum possible disparity value
--P1 10 Penalty for disparity change of ±1
--P2 120 Penalty for disparity change > 1
--uniqueness 0.80 Margin ratio for uniqueness constraint
--num_paths 8 Number of scanlines used in cost aggregation (4 or 8)
--min_disp -160 Minimum disparity value
--LR_max_diff 1 Maximum allowed left-right disparity difference
--census_type 1 Census transform type (0: 5x5, 1: 9x7, 2: 11x9)
--interval 1 Polling interval (in seconds) for checking new stereo image pairs
--output_dir . Directory to save disparity.xml and disparity_color.png
--no_display 0 Set to 1 to skip interactive display window (required for pipeline/headless use)
--help or -h Show help message

Custom Parameters

You can override any parameter through command-line arguments. Below is an example with some customized parameters:

./stereosgm_image data/lc%05d.bmp data/rc%05d.bmp \
  --disp_size=128 --P1=8 --P2=32 --interval=2

libSGM(Orignal)


A CUDA implementation performing Semi-Global Matching.

Introduction


libSGM is library that implements in CUDA the Semi-Global Matching algorithm.
From a pair of appropriately calibrated input images, we can obtain the disparity map.

Features


Because it uses CUDA, we can compute the disparity map at high speed.

Performance

The libSGM performance obtained from benchmark sample

Settings

  • image size : 1024 x 440
  • disparity size : 128
  • sgm path : 4 path
  • subpixel : enabled

Results

Device CUDA version Processing Time[Milliseconds] FPS
GTX 1080 Ti 10.1 2.0 495.1
GeForce RTX 3080 11.1 1.5 651.3
Tegra X2 10.0 28.5 35.1
Xavier(MODE_15W) 10.2 17.3 57.7
Xavier(MAXN) 10.2 9.0 110.7

Requirements

Package Name Minimum Requirements Note
CMake version >= 3.18
CUDA Toolkit compute capability >= 3.5
OpenCV version >= 3.4.8 for samples
OpenCV CUDA module version >= 3.4.8 for OpenCV wrapper
ZED SDK version >= 3.0 for ZED sample

Build Instructions

$ git clone https://github.com/fixstars/libSGM.git
$ cd libSGM
$ git submodule update --init  # It is needed if ENABLE_TESTS option is set to ON
$ mkdir build
$ cd build
$ cmake ../  # Several options available
$ make

Sample Execution

$ pwd
.../libSGM
$ cd build
$ cmake .. -DENABLE_SAMPLES=on
$ make
$ cd sample
$ ./stereosgm_movie <left image path format> <right image path format> <disparity_size>
left image path format: the format used for the file paths to the left input images
right image path format: the format used for the file paths to the right input images
disparity_size: the maximum number of disparities (optional)

"disparity_size" is optional. By default, it is 128.

Next, we explain the meaning of the "left image path format" and "right image path format".
When provided with the following set of files, we should pass the "path formats" given below.

left_image_0000.pgm
left_image_0001.pgm
left_image_0002.pgm
left_image_0003.pgm
...

right_image_0000.pgm
right_image_0001.pgm
right_image_0002.pgm
right_image_0003.pgm
$ ./stereosgm_movie left_image_%04d.pgm right_image_%04d.pgm

The sample images available at Daimler Urban Scene Segmentation Benchmark Dataset 2014 are used to test the software.

Test Execution

libSGM uses Google Test for tests as Git submodule.
So, we need to init submodule by following command firstly.

$ pwd
.../libSGM
$ git submodule update --init

We can run tests after a build.

$ pwd
.../libSGM
$ cd build
$ cd test
$ ./sgm-test

Test code compares our implementation of each functions to naive implementation.

Python pipeline runner dependencies

run_sgm_pipeline.py uses only the Python standard library. Disparity is computed by the compiled stereosgm_new binary.

See requirements.txt in this folder for system build requirements (CUDA, CMake, OpenCV C++).

# No pip packages needed for the Python runner.
# Build the binary first (see above), then:
cd ~/Speckle-Scanner/05_disparity/libsgm
python run_sgm_pipeline.py --project <project> --date <date>

Author

The "adaskit Team"

The adaskit is an open-source project created by Fixstars Corporation and its subsidiary companies including Fixstars Autonomous Technologies, aimed at contributing to the ADAS industry by developing high-performance implementations for algorithms with high computational cost.

License

Apache License 2.0