FL Street Scan Composite
The glowing 2.5D 'surveillance scan' look, and what it's really doing
- images
- depth
- normals
- subject_masks
- detections
- pose_keypoints
- composite
- scene_matte
- projected_normals
You've seen the effect: a person standing in a scene that's drifted into tilted, reprojected depth, with the frame edge chipped away into a loose polygon, green and yellow tracking boxes hanging off their body, a flash of blue-purple normal colors, and one or two ghosted edge trails. FL Street Scan Composite is a single node that produces that from a video plus its depth, normals, masks and detections.
The honest framing first, because the node's own description says it: this is 2.5D reprojection, not reconstruction. Nothing builds a mesh or invents the side of an object you couldn't see - push orbit_degrees up and you'll see exactly what's missing.
What goes in
Five things have to describe the same frames at the same resolution, and the node checks:
- images - the video.
- depth - a relative depth map per frame (Depth Anything V2 is the standard source; see the KB's depth-estimation notes).
- normals - RGB normal frames.
FL Voxel Normal Reliefis the pack's own way to make stylized ones; otherwise a depth-to-normals pass. - subject_masks - a MASK batch, one per frame. Kept before reprojection, so the person doesn't get chewed up by the chipped-edge mask.
- detections - an
FL_SCAN_TRACKSobject. Only one node makes this:FL Scan Video Detections, which runs Impact detectors per frame and does nearest-neighbour ID matching. It emitssubject_maskstoo, so those two inputs usually come from the same node.
Then the look controls: fps, seed, orbit_degrees (0–25, default 9), depth_relief (0–3, default 1.4), scene_scale (0.5–1.0), raggedness, normal_mix, hud_opacity and echo_strength. Optional: pose_keypoints plus pose_opacity for skeleton flashes, and edge_style.
edge_style is the one people miss. fragment (the default) is the chipped boundary and the two-frame echo trails. digital_layers throws all that away and instead keeps the whole scene, sitting it on stacked cobalt-and-black backing panels with crisp white borders - the Y2K "layered glass" look the pack's own H3 Street Scan workflow prefers. Raggedness and echo do nothing in that mode. Neither is better; pick the visual.
What it does, frame by frame
Depth gets a gentle temporal blend (85% current frame, 15% previous) so the parallax doesn't jitter. The fragment mask is a superellipse field perturbed by two seeded noise fields plus a small depth bias, OR'd with a dilated subject mask - that's where the ragged edge comes from, and it's seeded, so it's repeatable.
The projection is a real orbit: the angle is orbit_degrees × sin(2π × phase), around the image centre with depth mapped to Z by depth_relief. Pixels are splatted with a z-buffer - nearest wins per target pixel - and holes left inside the projected silhouette are filled by copying the nearest surviving sample, not by generating anything. That's the trade, not a bug.
On top of that: normal colors flash into the subject region for about five frames on a fps-driven pulse, plus a rectangular "normal_field" panel window partway through each pulse; detection boxes get projected through the same camera math and labelled person_03 0.87-style with confidence; pose skeletons flash after the pulse if you connected DWPose keypoints; and in fragment mode, two frames of edge ghosting trail behind. There's also an optical-flow feature overlay drawing Z_REL values on tracked points.
Three outputs:
- composite - the finished frames.
- scene_matte - a MASK of the projected coverage. This is the one to actually use: composite the scan over your own background, or drive a masked effect downstream.
- projected_normals - the normals after the same camera transform, so a second pass can stay aligned to the same virtual push.
Install
One pack install covers it: Manager → search ComfyUI_Fill-Nodes (publisher machinedelusions), or:
cd ComfyUI/custom_nodes
git clone https://github.com/filliptm/ComfyUI_Fill-Nodes
cd ComfyUI_Fill-Nodes && pip install -r requirements.txt
Restart after. opencv-python and Torch are the only things this node uses - the enormous requirements list is for the pack's cloud, LLM and audio nodes. Your other custom-node installs matter more here: depth, normals, detectors and pose come from separate packs (Depth Anything V2, a depth-to-normals node, Impact Pack's detectors, ControlNet Aux for DWPose).
Where people get bitten
- Alignment errors, not silent garbage. A 200-frame video with a 190-frame depth batch raises
Street Scan requires one aligned depth, normal and subject mask for every source frame.Detections from a different batch get their own complaint. Good errors - but you can't re-trim the video and leave the analysis alone. - Run it per shot. Temporal state - depth smoothing, optical flow, echo history - lives inside one execution and resets when it starts. A cut in the middle of the batch smears.
FL Scan VideoShots(or section chunks) upstream is the fix. - Detection boxes need detections. There's no fallback. No
FL_SCAN_TRACKS, no HUD, and the node won't run. - Big orbit = visible gaps. 5–10 degrees reads as a camera move. 25 degrees reads as a broken splat - treat large angles as a diagnostic, not a setting.
- It's CPU work. Splatting, hole filling and the HUD overlays are NumPy/OpenCV on CPU. Preview on a short crop before committing a 300-frame 4K batch.
Inputs (17)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| depth | IMAGE | — | |
| normals | IMAGE | — | |
| subject_masks | MASK | — | |
| detections | FL_SCAN_TRACKS | — | |
| fps | FLOAT | 24.001–120 | — |
| seed | INT | 410–2147483647 | — |
| orbit_degrees | FLOAT | 9.00–25 | — |
| depth_relief | FLOAT | 1.400–3 | — |
| scene_scale | FLOAT | 0.880.5–1 | — |
| raggedness | FLOAT | 0.420–1 | — |
| normal_mix | FLOAT | 0.850–1 | — |
| hud_opacity | FLOAT | 0.850–1 | — |
| echo_strength | FLOAT | 0.450–1 | — |
| pose_keypointsopt | POSE_KEYPOINT | — | |
| pose_opacityopt | FLOAT | 0.650–1 | — |
| edge_styleopt | COMBO | fragment | Digital layers keeps the full scene on stacked cobalt panels. Raggedness and temporal echoes apply only to fragment mode. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| composite | IMAGE | — |
| scene_matte | MASK | — |
| projected_normals | IMAGE | — |