feature_register op• Data kinds: points → indices
• Call: import fullseye as fs; fs.ledger.iss_keypoints(points, radius, nms_radius=None, gamma21=0.99, gamma32=0.99, max_kp=400, min_neighbors=8) (to call the implementation directly, import feat_shot; feat_shot.iss_keypoints(points, radius, nms_radius=None, gamma21=0.99, gamma32=0.99, max_kp=400, min_neighbors=8); from the registry, ops3d.get("iss_keypoints"))
ISS (Intrinsic Shape Signatures, the 3-D Harris equivalent) keypoint detection.
Uses the minimum eigenvalue λ3 of the local covariance as saliency, takes as candidates only points whose eigenvalues are distinct (orientation well-defined), and selects them sparsely with NMS. Rotation-invariant. Returns = an array of point indices.
Arguments:
• points (N,3). radius: radius of the neighbourhood sphere for saliency (same units as the point cloud).
• nms_radius: distance for non-maximum suppression. None means 0.6*radius.
• gamma21, gamma32: upper limits of the eigenvalue ratios λ2/λ1, λ3/λ2 (default 0.99). Only points where both are below
this are candidates (excludes points whose ratio is close to 1 = isotropic, with undetermined orientation).
• max_kp: maximum number returned. min_neighbors: points with fewer neighbours than this are not candidates (default 8).
Procedure: for each point, gather the neighbours within radius and compute the eigenvalues λ1≥λ2≥λ3 of the 2nd-order moment matrix (qᵀq)/n with the point of interest as origin (excluded if λ1 is 1e-12 or less). Scanning in descending order of λ3 as saliency, a greedy NMS discards points closer than nms_radius to an already accepted point. Returns an int64 array of point indices (descending saliency). Length 0 if there are no candidates.
Note: neighbours are centred on the point of interest (not on the centroid). A point on a plane has the point of interest on the same plane, so λ3 is 0 in theory, and rounding dust (λ3/λ1 ≤ 1e-9) is excluded from the candidates. It is a Python loop doing a neighbourhood search for every point, so clouds above tens of thousands of points should be thinned with voxel_grid_downsample before use. It feeds directly into the keypoint input of shot_descriptor, and register_shot calls it with saliency radius 0.6*radius and NMS radius 0.3*radius (radius being the support radius of register_shot).
• blas_threads_and_memory — Why matrix decompositions are slow — BLAS threads, caches, memory layout
• 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.
• feature_register — py -3.11 examples_3d/feature_register.py
indices as input)feature_register)harris3d_keypoints · compute_fpfh · shot_descriptor · register_spin · register_fpfh · register_shot
*Provenance: feat_shot.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.