Multi-camera: Pointcloud retrieval quality is significantly better in Fusion

Dear Stereolabs (@Myzhar),

I’m testing a multi-camera application for a client and I have noticed that pointcloud quality in the Fusion module is significantly better, especially on ground surfaces than individual camera pointcloud retrieval. For reference:

Merging individual pointclouds with sl.Camera.retrieve_measure():

Fusing pointclouds with sl.Fusion.retrieve_measure() :

The only reason I am making this rather obvious issue is to understand whether I can somehow apply the processing improvements of the Fusion module to per-camera retrieval because I’m having issues with the Fusion API in python and more specifically synchronization, even though I am connected with a local USB3.0 connection. It seems that synchronization parameters are read-only in python, but this is an issue for another topic.

Thanks a lot in advance

Hi @smilon
please add more information regarding both setup (mono and fusion) to compare them

Hi @Myzhar,

Thanks for the quick reply.

Hardware: 2 x zed2i on a jetson orin nano
API: pyzed
SDK Version: 5.1.0

Basically the cameras are statically mounted running on the following settings:

InitParameters (Both):
Resolution: HD2K@15
Depth mode: NEURAL_PLUS
Depth stabilization: 30

RuntimeParameters (Mono):
confidence_threshold = 50
texture_confidence_threshold = 80
remove_saturated_areas = True

RuntimeParameters (Fusion):
confidence_threshold = 50
texture_confidence_threshold = 80
remove_saturated_areas = False

PositionalTrackingParameters (Mono):
set_gravity_as_origin = False
set_as_static = True

PositionalTrackingParameters (Fusion):
Undefined

In the dual mono setup the pipeline is:

  1. cameras are initialized as sl.Camera() objects
  2. opened with init params
  3. positional tracking enabled
  4. frame grabbed with runtime params
  5. pointcloud retrieved with retrieve_measure(pcl, sl.MEASURE.XYZRGBA, sl.MEM.CPU)
  6. Merged with Open3D taking into account extrinsics calibration (no denoising in the pictures)

In the fusion pipeline:

  1. cameras are initialized as sl.Camera() objects
  2. opened with init params
  3. start publishing as senders
  4. Fusion initialized with params
  5. frame grabbed with runtime params
  6. pointcloud retrieved with retrieve_measure(pcl, sl.MEASURE.XYZRGBA, sl.MEM.CPU)
  7. fusion.process()
  8. fused pointcloud retrieved with retrieve_measure(pcd_mat, cid, sl.MEASURE.XYZRGBA, reference_frame=self.fusion_ref_frame)

Other params that I have not stated should be negligible. Please let me know if there is anything else I could define to give a better picture.

As a general sense however, doesn’t the Fusion module perform extra denoising steps on its own? That’s what I have understood from the docs.

Thanks a lot