feature_register op• Data kinds: voxel → keypoints
• Call: import fullseye as fs; fs.ledger.harris3d_keypoints(vol, device='cpu', k=0.005, nms=3, topn=64, sigma_i=1.5, response='mineig', rel_thresh=0.01, border=2) (to call the implementation directly, import feat_harris; feat_harris.harris3d_keypoints(vol, device='cpu', k=0.005, nms=3, topn=64, sigma_i=1.5, response='mineig', rel_thresh=0.01, border=2); from the registry, ops3d.get("harris3d_keypoints"))
• Return value through the ledger: fullseye.ledger.harris3d_keypoints(...) returns only the declared out type keypoints (the underlying function also returns auxiliary values). When you need what was dropped, use fullseye.ledger.harris3d_keypoints.raw(...) or call feat_harris.harris3d_keypoints directly.
• Underlying return: (keypoints, scores)
• GPU: this op has a GPU path (device="cuda")
3-D Harris keypoint detection (the 3-D version of the 2-D Harris corner detector).
From the 3D gradient g=(gz,gy,gx) of a voxel density field, it builds at each voxel the local structure tensor M=Σ_w w·g gᵀ (3x3 symmetric, weighted sum with a gaussian window sigma_i) and measures cornerness. Voxels whose response is a local maximum and above the threshold become keypoints (since they can be detected without an initial pose estimate, they can be used for correspondence under large rotation + partial overlap or to supply a coarse init for ICP).
Cornerness measures:
• "mineig" (default): the minimum eigenvalue of the 3x3 symmetric matrix (Shi-Tomasi style). The more there is structure in all 3 directions (= a corner), the larger the minimum eigenvalue. Computed in closed form (trigonometric method). Robust with no k tuning (measured mean repeatability 85%, min 72.5%).
• "harris": R = det(M) - k·tr(M)³. In 3D there are 3 eigenvalues, so it is made dimensionless with the 3rd power of tr. ★Note: at corners of a density voxel field the det/tr³ ratio is empirically only ~0.01, so with the 2D standard k=0.04-0.06 every response becomes negative and 0 points are detected. In 3D k≈0.005 is needed (measured mean 89.6% at k=0.005).
Arguments:
vol: (D,H,W) density voxels (numpy / torch). Assumed to be the output of points_to_voxel.
device: torch device ("cpu" etc.). All operations run on this device.
k: Harris sensitivity coefficient (only effective when response="harris"). For 3D density fields
around 0.005 (the 2D convention 0.04-0.06 is too strong in 3D and detects 0 points).
nms: side length of the cubic window for non-maximum suppression (odd, standard 3 = 3x3x3 neighbourhood).
topn: maximum number of keypoints returned, in descending order of response.
sigma_i: standard deviation (voxel) of the integration window (gaussian) of the structure tensor.
response: "mineig" (default, robust) or "harris".
rel_thresh: response threshold = rel_thresh × maximum response in the valid region (noise suppression).
border: nothing is detected within border voxels of the edge (removes gradient edge effects).
Returns:
keypoints: (M,3) float64. voxel coordinates (z,y,x) of the keypoints (same axis order as
sobel3d). In descending order of response, at most topn.
responses: (M,) float64. The corresponding response values (descending).
Dependencies: sobel3d (3D gradient), _gauss3d (integration-window smoothing). Both run on the device.
• 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
keypoints as input)fuse_to_voxel · dlt_pose · pnp_ransac · reprojection_error
feature_register)iss_keypoints · compute_fpfh · shot_descriptor · register_spin · register_fpfh · register_shot
*Provenance: feat_harris.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.