Run examples

Four OpenGL viewers ship as sources with the SDK. They are the reference integration — read them when you write your own application.

Run them from <prefix>\example\build\Release on Windows, or <prefix>/example/build on Ubuntu.

The four viewers

Viewer

What it does

viewer_opengl_streaming

Live streaming from a fixed device list. The reference sync integration

viewer_opengl_loader

Plays back recorded .mkv files, synchronized and auto-aligned

viewer_opengl_with_manager

Live, with the Manager - connect and disconnect cameras at runtime

viewer_opengl_segment

Live streaming plus 3D segmentation overlay

Every viewer takes --config=<prefix>/config and starts in color unless you pass color_depth or pointcloud.

View controls are the same in all four. Switch the view live with 1 / 2 / 3 - colour, colour + depth, point cloud. In point-cloud mode, drag to orbit and scroll the wheel to zoom. ESC quits.

[!NOTE] A complete multi-camera frame group only forms when the camera hosts are PTP-synced. A single camera always forms complete groups; a second one joins once the two hosts share a clock. See Set up time sync (PTP).

viewer_opengl_streaming

Live point clouds from a fixed device list.

viewer_opengl_streaming pointcloud --devices=<id-1>,<id-2> --config=<prefix>
viewer_opengl_streaming pointcloud --devices=<id-1>,<id-2> --config=<prefix>
viewer_opengl_streaming pointcloud --devices=<id-1>,<id-2> --config=<prefix>

Or with a JSON device list:

viewer_opengl_streaming pointcloud --clients=<prefix>/example/streaming_client_info_example.json --config=<prefix>
viewer_opengl_streaming pointcloud --clients=<prefix>/example/streaming_client_info_example.json --config=<prefix>
viewer_opengl_streaming pointcloud --clients=<prefix>/example/streaming_client_info_example.json --config=<prefix>

Press R to record each camera (files video_<device-id>_<n>.mkv), S to stop.

The --clients file

A small JSON listing the device IDs to stream - the same set you would pass to --devices, in a file. Handy for a fixed rig or many cameras. A ready-to-copy template lives at <prefix>/example/streaming_client_info_example.json.

{
  "client_info": [
    { "client_id": "AAAA-BBBB-CCCC-0129" },
    { "client_id": "AAAA-BBBB-CCCC-0138" }
  ],
  "client_num": 2
}
{
  "client_info": [
    { "client_id": "AAAA-BBBB-CCCC-0129" },
    { "client_id": "AAAA-BBBB-CCCC-0138" }
  ],
  "client_num": 2
}
{
  "client_info": [
    { "client_id": "AAAA-BBBB-CCCC-0129" },
    { "client_id": "AAAA-BBBB-CCCC-0138" }
  ],
  "client_num": 2
}

To fill it in for your own rig:

  1. List your real device IDs - launch viewer_opengl_with_manager and press I.

  2. Add one client_info entry per camera. Every ID must have a matching config/<device-id>/ folder under --config.

  3. Set client_num to the entry count. Two entries means "client_num": 2.

--clients is mutually exclusive with --devices.

viewer_opengl_loader

Plays back recorded .mkv files. No cameras needed.

  1. Get the recordings. They come from the R key in the streaming, manager or segment viewers.

  2. Write a --videos JSON pairing each client_id with its video_file. Use full paths with forward slashes. The client_id must match the recorded device so the loader can read that device's config/<client_id>/ for intrinsics and extrinsics.

    {
      "client_num": 2,
      "client_info": [
        { "client_id": "AAAA-BBBB-CCCC-0129", "video_file": "E:/recordings/video_AAAA-BBBB-CCCC-0129_0.mkv" },
        { "client_id": "AAAA-BBBB-CCCC-0138", "video_file": "E:/recordings/video_AAAA-BBBB-CCCC-0138_0.mkv" }
      ]
    }
    {
      "client_num": 2,
      "client_info": [
        { "client_id": "AAAA-BBBB-CCCC-0129", "video_file": "E:/recordings/video_AAAA-BBBB-CCCC-0129_0.mkv" },
        { "client_id": "AAAA-BBBB-CCCC-0138", "video_file": "E:/recordings/video_AAAA-BBBB-CCCC-0138_0.mkv" }
      ]
    }
    {
      "client_num": 2,
      "client_info": [
        { "client_id": "AAAA-BBBB-CCCC-0129", "video_file": "E:/recordings/video_AAAA-BBBB-CCCC-0129_0.mkv" },
        { "client_id": "AAAA-BBBB-CCCC-0138", "video_file": "E:/recordings/video_AAAA-BBBB-CCCC-0138_0.mkv" }
      ]
    }
  3. Run it:

    viewer_opengl_loader color_depth --videos=my_videos.json --config=<prefix>
    viewer_opengl_loader color_depth --videos=my_videos.json --config=<prefix>
    viewer_opengl_loader color_depth --videos=my_videos.json --config=<prefix>

Playback keys: P pause, R resume, S reset to 2 s, T print time. Multiple recordings are auto-aligned and synchronized on playback.

viewer_opengl_with_manager

Discovers and connects cameras at runtime. It takes no --devices or --clients - it finds cameras over mDNS. It still takes --config.

viewer_opengl_with_manager --config=<prefix>
viewer_opengl_with_manager --config=<prefix>
viewer_opengl_with_manager --config=<prefix>

Drive it from the keyboard in the viewer window. Keys marked (asks for id) prompt you to type a device ID in the terminal and press Enter.

Key

Action

I

List every camera discovered on the LAN. This is how you learn what you have

X

Connect all discovered cameras (management channel)

C

Connect one (asks for id) - connects it and copies that camera's real configs into config/<device-id>/

L

Start streaming one connected camera (asks for id). Repeat per camera

D

Disconnect one camera (asks for id)

R / S

Start/stop server-side recording

U

Push an exposure/white-balance update to every connected camera

Typical run: launch → I to see the cameras → X (or C per ID) to connect → L each camera ID to start streaming → view the fused cloud. Each streaming camera attaches to and detaches from the synchronizer automatically.

Recording with R saves on the server side, under the server's videos/ folder as Recording_<device-id>_<n>.mkv for every connected camera. S stops. Client-side recording on the device is not used.

viewer_opengl_segment

Streaming plus 3D segmentation. Takes the same fixed-device-list arguments as streaming.

viewer_opengl_segment --devices=<id-1>,<id-2> --config=<prefix>
viewer_opengl_segment --devices=<id-1>,<id-2> --config=<prefix>
viewer_opengl_segment --devices=<id-1>,<id-2> --config=<prefix>

G segments once; H toggles continuous.

[!IMPORTANT] Segmentation requires the Python detector service. Set it up first - Set up the detection system. Without it the viewer still streams the live cloud but reports segmentation unavailable.

Command-line reference

Arguments may appear in any order. A bare word that is not a render mode and does not start with -- is treated as the config path.

Argument

Used by

What it does

color · color_depth · pointcloud

all

Positional render mode. Sets the initial view; switch live with 1 / 2 / 3. Aliases: depth/rgbdcolor_depth, pcd/cloudpointcloud. Omitted means color

--config=PATH

all

The config folder, normally <prefix>/config. Holds the global configs (system_config.json, manage_config.json, detect_config.json, frame_sync_config.json) and the per-device folder for every camera you stream. For each streamed device the viewer reads sensor_config.json for the intrinsics and the Sensor → World extrinsic. A missing or wrong config folder means no calibration and misaligned or empty clouds. Defaults to ../../config/, so pass it explicitly

--devices=ID1,ID2,…

streaming, segment

The fixed list of device IDs to stream, comma-separated, no spaces. Each ID must have a matching config/<id>/ folder

--clients=FILE.json

streaming, segment

The same fixed list read from a JSON file. Mutually exclusive with --devices

--videos=FILE.json

loader

Like --clients, but each entry also carries a video_file path. See example/loader_video_info_example.json

[!NOTE] viewer_opengl_with_manager takes none of --devices, --clients or --videos. It discovers cameras over mDNS and you connect and stream them with the keys above. It still takes --config.

Keyboard reference

Key

Where

Action

1 / 2 / 3

all

colour/colour + depth/point cloud

drag / wheel

all (point-cloud mode)

orbit/zoom

R / S

streaming, manager, segment

start/stop recording

P / R / S / T

loader

pause/resume/reset-to-2 s/print time

G / H

segment

segment once/toggle continuous

I C X D L U

manager

list/connect one/connect all/disconnect/start-stream one/exposure

ESC

all

quit

Next steps

Set up the detection system for the segmentation overlay, or go straight to Use the SDK in your own project.

On this page

Let’s Build the Future of Physical AI Together

Let’s Build the Future of Physical AI Together

Let’s Build the Future of Physical AI Together

© 2026

Determ Technology · All rights reserved

contact@determtech.com