bundle_adjust op• Data kinds: pose × points → measurement
• Call: import fullseye as fs; fs.ledger.mean_reprojection_error(cameras, points, obs_cam, obs_pt, obs_uv, K) (to call the implementation directly, import bundle3d; bundle3d.mean_reprojection_error(cameras, points, obs_cam, obs_pt, obs_uv, K); from the registry, ops3d.get("mean_reprojection_error"))
The RMS reprojection error (in pixels).
For every observation k, takes the difference (du, dv) between project(points[obs_pt[k]], cameras[obs_cam[k]]) and obs_uv[k] and returns as a float sqrt(mean_k(du² + dv²)) = the square root of the mean of the 2nd powers of the per-observation reprojection distance (the implementation is the square root of the mean of r.reshape(-1,2)**2 * 2, the same quantity). The unit follows obs_uv and K, in pixels.
• cameras: (nc,6) [rvec(3) | t(3)] (X_cam = R X + t).
• points: (m,3) 3D points.
• obs_cam / obs_pt: camera index and point index of each observation (int). obs_uv: (K,2) observed pixels.
• K: (3,3) intrinsic matrix shared by all cameras.
Same computation as the rmse returned by bundle_adjust; use it to compare before and after optimisation. With 0 observations the mean of an empty array gives NaN (length validation lives in bundle_adjust; this function alone does not do it). Points behind the camera are also projected as-is by project, so the caller must guarantee visibility.
• Sample-data catalog (download URLs / licences) — 2-D uses skimage.data (BSD/public domain) plus synthetic images; 3-D lists download URLs for real data sources (Stanford, PDS, …).
• Operator provenance and references — the sources of the research/methods this op family came from.
• bundle_adjust — py -3.11 examples_3d/bundle_adjust.py
measurement as input)vol_gaussian_psf · fuse_to_voxel · fresnel_reflectance · snell_angle
bundle_adjust)*Provenance: bundle3d.py — 3D operator registry. This per-op note is generated by tools/opdocs.py md (do not hand-edit).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.