Nodes/ComfyUI_Fill-Nodes/FL Street Scan Composite
ComfyUI Node

FL Street Scan Composite

The glowing 2.5D 'surveillance scan' look, and what it's really doing

By filliptm·Created 3 years ago·Updated a day ago· 638
FL Street Scan Composite
  • images
  • depth
  • normals
  • subject_masks
  • detections
  • pose_keypoints
  • composite
  • scene_matte
  • projected_normals
fps24.00
seed41
orbit_degrees9.0
depth_relief1.40
scene_scale0.88
raggedness0.42
normal_mix0.85
hud_opacity0.85
echo_strength0.45
pose_opacity0.65
edge_stylefragment

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 Relief is 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_TRACKS object. Only one node makes this: FL Scan Video Detections, which runs Impact detectors per frame and does nearest-neighbour ID matching. It emits subject_masks too, 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.
Category🏵️Fill Nodes/VFX

Inputs (17)

NameTypeDefaultDescription
imagesIMAGE
depthIMAGE
normalsIMAGE
subject_masksMASK
detectionsFL_SCAN_TRACKS
fpsFLOAT24.001–120
seedINT410–2147483647
orbit_degreesFLOAT9.00–25
depth_reliefFLOAT1.400–3
scene_scaleFLOAT0.880.5–1
raggednessFLOAT0.420–1
normal_mixFLOAT0.850–1
hud_opacityFLOAT0.850–1
echo_strengthFLOAT0.450–1
pose_keypointsoptPOSE_KEYPOINT
pose_opacityoptFLOAT0.650–1
edge_styleoptCOMBOfragmentDigital layers keeps the full scene on stacked cobalt panels. Raggedness and temporal echoes apply only to fragment mode.

Outputs (3)

NameTypeDescription
compositeIMAGE
scene_matteMASK
projected_normalsIMAGE