scoop op• Data kinds: image2d × scalar × scalar × scalar × scalar → table
• Call: import fullseye as fs; fs.ledger.tilted_surface_read(side, lip_row: 'float', lip_col: 'float', theta_deg: 'float', L_px: 'float', *, wall_px: 'float | None' = None, threshold: 'float' = 0.5, shell_px: 'float' = 0.0, smooth_px: 'int' = 1) -> 'dict' (to call the implementation directly, import scoop; scoop.tilted_surface_read(side, lip_row: 'float', lip_col: 'float', theta_deg: 'float', L_px: 'float', *, wall_px: 'float | None' = None, threshold: 'float' = 0.5, shell_px: 'float' = 0.0, smooth_px: 'int' = 1) -> 'dict'; from the registry, opsdrive.get("tilted_surface_read"))
Reads, from a side-view image (coverage) of the tilted container, the cross-sectional area of the powder remaining in it and the height of the flat surface at the back.
Vessel coordinates: origin at the mouth (lip_row, lip_col; pixel edges are integers), x along the floor towards the back (floor tilted by θ with the mouth lowered = rising to the upper right in the image), y perpendicular to the floor. The sum of the coverage within 0 ≤ x ≤ L_px and 0 ≤ y ≤ wall_px (None = L_px) is the cross-section area [px²] (flow outside the mouth is not counted). The outline of the side view of the grains is the outer envelope of the grains, so a shell about one grain radius thick along the free surface is included in excess —— it also returns shell_px, with smooth_px (pass the grain radius [px]) × the free-surface length (length of the polyline of the powder surface of each column inside the vessel, moving-averaged over area_corrected columns) subtracted. Height of the flat surface at the back plateau_px = median height above the floor of the powder surface in the back half of the vessel (in the wedge model this does not change while θ < θ_b; the real layer flows and thins —— see the PoC).
Returns: area_px, area_corrected, surface_len_px, plateau_px (None if there is no powder surface in the back half). Raises ValueError: not a coverage map / the inside of the vessel is empty / argument ranges.
• 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.
• The canonical algorithm (author, year) and its uses are named in the family usage guide above.
• poc_powder_scoop_pour — py -3.11 examples/poc_powder_scoop_pour.py
table as input)course_layout · course_occupancy · course_contains · world_build · world_camera · world_move · lidar_scan · rss_longitudinal_same
scoop)spoon_bowl_volume · scoop_synth_side · revolution_volume_side · two_view_volume · scoop_volume_read · scoop_count · scoop_image_limit · tilt_wedge_retained
*Provenance: scoop.py — DRIVE 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.