project_points — 3D render op

• Data kinds: points → keypoints

• Call: import fullseye as fs; fs.ledger.project_points(points, K, R=None, t=None) (to call the implementation directly, import match3d; match3d.project_points(points, K, R=None, t=None); from the registry, ops3d.get("project_points"))

• Return value through the ledger: fullseye.ledger.project_points(...) returns only the declared out type keypoints (the underlying function also returns auxiliary values). When you need what was dropped, use fullseye.ledger.project_points.raw(...) or call match3d.project_points directly.

• Underlying return: (uv (N,2), depth (N,)) → uv

Usage

3-D point set (N,3) → image coordinates (u,v) and depth. Pinhole (the forward direction of depth_to_points).

K = camera intrinsic matrix [[fx,0,cx],[0,fy,cy],[0,0,1]]. R,t give the extrinsic pose. The observation map of a world model.

Projects P_cam = R @ P + t (R (3,3), t (3,); None means identity / zero) with u = fx·X/Z + cx, v = fy·Y/Z + cy. Returns (uv (N,2), depth (N,)): uv[:,0] = u (column), uv[:,1] = v (row), depth is Z in camera coordinates (the raw value before clipping; negatives are kept as is). K is indexed as K[0,0] etc., so it must be a numpy array (a nested list does not work). Z is clipped to at least 1e-6 before dividing, so points behind the camera are not discarded either and become huge u,v (the caller removes them with depth > 0). Points outside the image are also returned (render_point_depth cuts them by range). It is the inverse of depth_to_points; depth_to_points(render_point_depth(...)) is a round trip.

Background guides (the physics and conventions behind this op)

• blender_interop — Using Blender alongside — build the shape, measure it with fullseye (pitfalls: axes, units, ground truth)

References (sample data, literature)

• 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.

Runnable examples (verified samples that actually call this op)

• pnp_pose_outliers — py -3.11 examples_3d/pnp_pose_outliers.py

• pose_estimation — py -3.11 examples_3d/pose_estimation.py

Ops the type connects to (they accept keypoints as input)

fuse_to_voxel · dlt_pose · pnp_ransac · reprojection_error

Same category (render)

render_point_depth · render_volume_projection · render_shaded · ambient_occlusion · cast_shadow · phong_shade · matcap_shade · supersample_mesh


*Provenance: match3d.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.