Skip to content
Back to skills

Open3d

ASecurity

Use when registering overlapping point-cloud scans into one frame, optimizing a multiway pose graph, reconstructing a Poisson surface, or reviewing Open3D registration artifacts and their validators.

  • 33 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 4, 2026
testingpythongoshellbashnodedockertestinggitapi

Works with

  • cli
  • api

Security analysis

A100/100

Scanned October 4, 2026

npx -y skills add nebius/nebius-physical-ai --skill open3d --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Open3d?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Open3d
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/nebius-open3d/badge)](https://www.skillsdirectory.com/skills/nebius-open3d)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: open3d
description: Use when registering overlapping point-cloud scans into one frame, optimizing a multiway pose graph, reconstructing a Poisson surface, or reviewing Open3D registration artifacts and their validators.
---

# Open3D point-cloud registration and reconstruction

Two scans of the same room do not share a coordinate frame. This tool recovers the
rigid transform between them with the real upstream pipeline —
`registration_ransac_based_on_feature_matching` over FPFH features, refined by
`registration_icp` — then optimizes the full pairwise pose graph with
`global_optimization`, fuses the result, and reconstructs a surface with
`create_from_point_cloud_poisson`. Nothing is recomputed or smoothed locally: every
fitness, RMSE and correspondence count is what Open3D's own `RegistrationResult`
returned.

CPU-only, and that is a design constraint rather than an unfinished port. Open3D's
`pipelines.registration` and geometry APIs have no CUDA path, so the image does not
derive from the CUDA base and no stage requests an accelerator. A stage that asked
for a GPU here would hold one it cannot use.

The image is `0.20.0-cpu-20260918`, a validation candidate quarantined from public
publication until exact-image byte scans are accepted. Build from committed inputs
with `npa/docker/workbench/open3d/build.sh`.

## Run it

```bash
npa workbench workflow validate-spec workflows/testing/open3d-registration.yaml
npa workbench workflow submit workflows/testing/open3d-registration.yaml \
  --var bucket=<your-bucket>
```

The shipped spec starts from `stage-demo`, which downloads the upstream
`open3d.data` `DemoICPPointClouds` scans (release `20220301-data`) — fragments of
the Redwood augmented ICL-NUIM benchmark (CC BY 3.0), depth frames rendered from
a modelled indoor scene with simulated sensor noise rather than real captures.
They carry the overlap and noise the pipeline expects, so the run needs no
operator capture to produce a real result, but nothing measured against them is
a statement about real-sensor accuracy. To register your own data, replace that
stage with `prepare` and point `--input-path` at a prefix holding at least two
`.pcd`/`.ply` files.

`voxel_size` is the single scale knob. The normal, FPFH and correspondence radii
are all multiples of it, exactly as the upstream Global-registration and
Multiway-registration tutorials derive them, so tuning one number rescales the
whole pipeline coherently. It is in the scans' own units; `0.05` suits
metre-scale indoor captures.

## Verbs and what each one proves

| Verb | Real upstream call | Publishes |
| --- | --- | --- |
| `stage-demo` | `open3d.data.DemoICPPointClouds` | staged scans + `manifest.json` |
| `prepare` | none (indexes a prefix) | digest-bound `manifest.json` |
| `register` | RANSAC/FPFH then ICP, consecutive pairs | `pairs.jsonl`, `result.json`, one aligned cloud per pair |
| `multiway` | full pairwise graph + `global_optimization` | `pose_graph.json`, `fused.ply` |
| `validate` | none | `validation.json`, re-derived from the artifacts alone |
| `reconstruct` | `create_from_point_cloud_poisson` | `mesh.ply` with manifold/watertight/area facts |
| `visualize` | Rerun | decode-verified `point_cloud.rrd` |

`validate` deliberately imports no Open3D: the published journal is
self-describing, so a reviewer can re-check a registration without the 400 MB
wheel. `register` writes each source cloud transformed into its target's frame,
because that is precisely what the published transform claims — a reviewer should
be able to open the thing being asserted.

## Exact limits, and what the numbers do not mean

- Fitness and inlier RMSE are Open3D's agreement measures between two clouds.
  They are **not** absolute pose error. The demo scans carry no ground-truth pose,
  so no accuracy claim can be made from a real run against them; the golden eval
  is where a ground-truth check exists, because it applies a known transform and
  asserts the pipeline recovered it.
- RANSAC is randomized. `random_seed` seeds Open3D's global generator so a rerun
  repeats, but a different seed can legitimately give a different transform on
  low-overlap fragments.
- A Poisson surface from partial indoor scans is normally **not** watertight and
  **not** edge-manifold. Those facts are reported, not asserted to be true. Do not
  treat an open surface as a failure, and do not treat a watertight one as proof of
  completeness.
- `reconstruct` crops the lowest-density Poisson vertices (the upstream tutorial's
  density quantile). Low density is a sampling property, not proof that geometry
  is false; the removed count is recorded.
- The density quantile alone is nowhere near enough on a partial scan. Poisson
  returns a *closed* surface, so an open capture comes back wrapped in an
  extrapolated shell that renders as smooth opaque geometry indistinguishable
  from observed structure. On the upstream three-fragment demo scans that shell
  measured **0.527 of the total surface area**, reaching 0.905 m from the nearest
  sample, and it explained none of the observations: cropping all of it left
  sample coverage within one voxel unchanged at 0.99243 and moved
  sample-to-surface RMSE by 0.00005 m. `--support-distance-factor` (default
  `1.0`) discards surface with no observed sample within that many `voxel_size`
  units. Voxel downsampling does not bound gaps between observations, so this
  default is a distance-filter setting, not an interpolation guarantee. Pass `0`
  to disable distance filtering; density trimming remains controlled separately
  by `--density-quantile`. Disable both filters to retain the raw Poisson surface.
- **The default assumes sample spacing well below the voxel, and says so because
  it is measurably wrong otherwise.** A watertight mesh sampled uniformly at 300k
  points, then voxelized at its own median spacing, reports **0.2055 unsupported
  area** at factor `1.0` — yet that surface is correct: its median vertex sits
  0.02 voxels from the ground-truth mesh, p99 at 0.16, and *no* vertex is further
  than one voxel. The figure is discretization, not fabrication. It collapses to
  0.0075 at factor 1.5 and 0.000084 at 2.0, and the furthest vertex is only 2.21
  voxels out. Genuine fabrication does not collapse like that: on the demo scans
  the discarded shell reached 18 voxels. **That 0.2055 does not transfer to a
  differently sampled capture** — the headline fraction's magnitude depends on the
  sampling scheme, not only on the reconstruction, because uniform random sampling
  leaves gaps well above the median nearest-neighbour spacing and pushes the
  per-triangle maximum further out. Scored against samples drawn from itself, a
  reconstruction with *zero* error measured 0.75126 unsupported, so at this
  threshold the fraction is not measuring fabrication at all. So when spacing approaches the voxel,
  raise the factor to 1.5–2.0; at `1.0` the crop removed 8.45% of *correct*
  vertices there. Coverage did not catch it and cannot — coverage asks whether
  observations are explained, not whether correct surface was discarded.
- **Read `crop_justification`, not the unsupported fraction.** The fraction alone
  cannot distinguish the two cases and measurably ranks them wrong: across three
  scenes the complete capture reported **0.2009** unsupported while a genuinely
  partial scan of a solid object reported **0.1249**, so thresholding the headline
  number calls the correct surface the worse one. What separates them is how far
  past the voxel the unsupported area lies — the share of it beyond three voxels
  was 0.7297 on the partial demo scans, 0.1012 on that solid-object scan, and
  **0.0000** on the complete capture. `reconstruct` reports those bands as
  `unsupported_area_beyond_1_5_voxels` and `unsupported_area_beyond_3_voxels`, and
  summarizes them as `crop_justification.removed_surface_reads_as`: either
  `far from any observation` or `near-threshold surface`. **Neither reading is a verdict
  about ground truth, and the error runs both ways.** A high reading does not establish
  fabrication: a closed cube that is exactly its own ground truth, sampled densely on five
  faces and sparsely on the sixth, put 0.4169 of its unsupported area past three voxels with
  nothing invented anywhere. A low reading does not establish cleanliness either, because
  fabrication below the sensitivity floor reads as `near-threshold surface`. Nothing gates on
  either. Measurements: `evidence/open3d/band-profile-across-scenes.json`,
  `evidence/open3d/irregular-density-counterexample.json`,
  `evidence/open3d/poisson-procedure-and-overcall-audit.json`.
- **Superseded:** this skill previously said the error was one-sided and that an area called
  invented is invented, on twelve zero-error cells that all read near-threshold. Those cells
  are real and unchanged, but every one of them sampled convex geometry *evenly*; uneven
  density across a surface is the case that breaks the inference.
- **`unsupported_area_fraction` is mostly a sampling measurement, not a quality one.**
  On a reconstruction with *zero* error, uniform-random sampling reports 0.855 of area
  unsupported at a voxel equal to the median point spacing; Open3D's Poisson-disk sampler
  at the same count and voxel reports 0.027, and at twice the spacing reports exactly
  **0.000**. The difference is evenness alone: max/median nearest-neighbour spacing is
  1.70 for Poisson-disk against 4.19 for uniform random, and the sparse tail of a uniform
  draw is what the metric is reading. Sample evenly at capture time and the figure becomes
  meaningful; otherwise read the distance bands instead.
- **Choose `--voxel-size` at or above twice your median sample spacing.** This one
  ratio sets both of the caveats above, and it is the only input the caller controls.
  Sweeping it on a fixed scene: at a voxel equal to the median nearest-neighbour
  spacing, a *zero-error* reconstruction reports `unsupported_area_fraction` 0.8780
  and the smallest detectable fabrication is 4.7% of surface area; at three times the
  spacing, the same reconstruction reports 0.0055 and the floor falls to 0.75%. A
  tight voxel costs both ways at once — it inflates the headline fraction on correct
  geometry *and* blinds the reading to smaller invented regions. Mesh resolution does
  not matter by comparison: the floor showed no trend above sampling noise across a
  32-fold range of triangle-edge-to-voxel ratio. Measurements:
  `evidence/open3d/floor-vs-voxel-multiple.json`,
  `evidence/open3d/floor-vs-resolution.json`.
- **The bands hold from 0.5 to 5.4 voxels of sample spacing, and the fraction does
  not.** Swept against a fixed voxel on a watertight mesh, so fabrication could be
  measured against ground truth rather than inferred, there was **no case where a
  correct surface read as a shell**. Across that range the share past three voxels
  tracked the area genuinely further than one voxel from the true surface to within
  0.06 absolute. The headline fraction did not: at 0.708 voxels of spacing it
  reported **0.5659** unsupported where only **0.0027** of area was actually
  fabricated, overstating by roughly 200-fold. Measurements:
  `evidence/open3d/band-validity-sweep.json`.
- **Neither reading is a clean bill of health or a finding of fabrication.** Below a
  sensitivity floor the reading is *confidently wrong* rather than undecided — genuine
  fabrication reads as `near-threshold surface`. Above the threshold it says only that the
  area sat far from any observation, which sparse coverage of correct geometry also produces.
  Separating the two needs a reference surface, which a scan does not have.
  **Don't quote the floor as a number.** It moves with geometry, sampling and
  resolution: 0.011 to 0.037 invented area across two geometries × two sampling
  schemes, against 0.09 in an independent setup at a different resolution ratio —
  nearly an order of magnitude. What held in every case, and what to rely on, is
  monotonicity in the invented fraction at fixed sampling; the absolute level is not
  comparable across scans. The 0.1012 real scan sits near where the floor falls rather than
  awkwardly on a line. Nothing gates on the reading while the floor is this
  setup-dependent. Measurements:
  `evidence/open3d/floor-across-geometry-and-sampling.json`.
- **Sample evenly and the headline fraction becomes usable again.** Its failure is
  not inherent to the metric, it is what uneven sampling does to a nearest-sample
  distance. A reconstruction with *zero* error measured between 0.1393 and 0.7513
  unsupported depending only on how its samples were drawn — and **exactly 0.0**
  under Poisson-disk sampling, in both geometries tested. Uniform random sampling
  leaves gaps well above the median nearest-neighbour spacing and the per-triangle
  maximum lands in them. If you control the capture, sample evenly; if you don't,
  read the bands and treat the headline fraction as uninformative.
- **Measuring that floor needs a sphere scored against itself, not an occluded
  capture.** Occluding a watertight mesh does not work, and it is worth knowing
  why before trying: Poisson closure over a hole in a *closed* object tracks the
  true surface, so removing 205947 of 300000 samples left only 0.0003 of area
  beyond one voxel and there was nothing invented to miss
  (`band_false_negative_sweep.py`, retained and labelled inconclusive). What works
  is deleting observations from a polar cap while leaving the mesh covering it, so
  the invented fraction is known exactly from the cap angle.
- Both surfaces ship: `mesh.ply` is the cropped result and `mesh_uncropped.ply`
  is the surface after density trimming and before distance filtering, so the
  latter operation remains inspectable. It is not the untouched Poisson output. `reconstruct` also publishes the support measurement before and
  after the crop plus coverage in the other direction (observed samples to the
  surface), and the stage fails if those disagree — cropping that reported more
  unsupported area than it started with, or surface left beyond the stated limit.
- `visualize` sends a blueprint: an elevated three-quarter camera with its
  distance solved so the whole scan fits, the scan and surface on independent
  toggles, and the cropped-away surface in red in its own tab. The up axis is
  inferred from the largest planar segment and then snapped to the nearest world
  axis so the horizon stays level; the raw normal, its inlier fraction, and the
  snap angle are all published, because it is an inference. A scan with no
  dominant plane falls back to `+Z` and says so.
- Multiway registration is O(n²) in pairwise registrations. At most 32 fragments
  are accepted in one run, so an over-broad prefix fails fast instead of becoming
  an unbounded job.

## Artifacts and diagnostics

Every artifact is published with a read-after-write digest check, and every
published summary is validated against the journal it claims to describe before the
stage reports success: a summary that inflates the pair count, a 4×4 matrix that is
scaled or sheared rather than rigid, a pose graph whose node 0 has drifted off the
identity anchor, or a mesh with vertices and zero surface area each fail the stage.
See `npa/tests/workbench/test_open3d.py` for the specific corruptions these
validators exist to catch.

When the runner subprocess fails, the error carries the tail of its log, so triage
does not need the pod back. The two failures worth recognizing:

- *"RANSAC feature matching found no correspondences"* — the fragments probably do
  not overlap at this `voxel_size`. Lower it before assuming the data is bad.
- *"voxel_size N removed every point"* — the voxel is larger than the cloud's own
  extent, usually a units mismatch (millimetres given a metre-scale voxel).

## Validate a change

```bash
npa/.venv/bin/python -m pytest \
  npa/tests/workbench/test_open3d.py npa/tests/cli/test_open3d_cli.py -q
npa workbench workflow validate-spec workflows/testing/open3d-registration.yaml
```

For a real capability check, run the golden eval inside the built image:

```bash
docker run --rm npa-open3d:<tag> python -m npa.smoke.test_open3d_functional
```

## Persisted input identity

Before rendering, `visualize` verifies both mesh hashes, the fused-cloud hash,
the pose graph against its registration, and the canonical manifest hash. The
reconstruction also records the exact upstream registration-result hash; replacing
that result at the same prefix rejects replay. Verified input hashes accompany
the recording and its manifest. Older reconstruction reports missing that binding
must be regenerated with `reconstruct` before visualization. These checks detect
changed artifacts; they do not certify the geometry as physical truth.

Failed native stages retain their private working directory and runtime log.
Successful stages remove temporary files after publication and verification.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…