Depth + Pose + Canny Combined (V2)
Six conditioning maps from one node, when you can't decide what the ControlNet wants
- images
- external_depth_map
- damodel_v2
- da3_model
- depthcrafter_model
- depth_pro_model
- posemodel
- external_pose_map
- depth_map
- pose_map
- canny_map
- normal_map
- combined_map
- blended_map
This is the pack's Swiss-army ControlNet preprocessor, and it's a different animal from the other nodes here. While the rest of the pack exists to feed Wan Animate's character-animation pipeline, DepthPoseCannyCombinedV2 is a generic conditioning generator: feed it frames, get depth, pose, canny, normal, a side-by-side preview, and a blended map - six outputs you can point at whatever ControlNet you're using. It's the node you reach for when you're building a pose-control workflow for Flux, Qwen-Image or a Wan ControlNet and you're not sure yet which condition carries the shot.
If you've ever had to wire three separate preprocessors just to compare depth vs. canny vs. pose, this collapses that into one node with a layout toggle.
How it works
Think of it as four passes with a merge stage at the end:
- Depth. The
depth_backenddropdown is the interesting part.autotries, in order: anexternal_depth_mapinput you wired → any depth-model bundle connected → a built-in MiDaS-small that downloads ~80MB viatorch.hubon first use.built_in_midasmakes the node fully self-contained with zero extra packs. Or point it at DepthAnything V2 (damodel_v2, via Kijai's pack), DepthAnything V3, DepthCrafter (temporally consistent video depth), or Depth-Pro (metric depth) by wiring their model bundles in. - Pose. Uses
posemodel(thePOSEMODELfrom the loader node) unless you wireexternal_pose_map- e.g. a DWPose/OpenPose render from Fannovel16's controlnet_aux - which takes priority. - Canny. Pure OpenCV,
canny_threshold1/canny_threshold2(100/200) pluscanny_aperture(3/5/7). Nothing to download. - Normal. Sobel-from-depth, no model needed.
normal_strengthscales the gradients; higher = more contrast.
Then the blend_mode dropdown merges them. The defaults are weighted_avg, but the interesting ones are the research-backed modes: linear_dodge (additive, sharp - the community favourite for pose+canny), screen (highlight-safe stacking), max, multiply, overlay, and channel_split which packs R=depth, G=canny, B=pose into one RGB image in the Fun-Control / IP-Adapter style. Per-channel depth_weight / pose_weight / canny_weight / normal_weight tune the mix.
The inputs a beginner actually sets
images- your frames.width/height- output canvas (832×480).enable_depth/enable_pose/enable_canny/enable_normal- flip off the passes you don't need; each one you disable saves compute.depth_invert- invert so near = bright, which is what most ControlNets expect. Turn it on if your source produces "far = bright".combined_layout-horizontal_3(default),vertical_3,grid_2x2, or single-map outputs for previewing.pose_detection_threshold/pose_draw_threshold- only used whenposemodelis wired; same meanings as the detection node.
Outputs: depth_map, pose_map, canny_map, normal_map, combined_map (the layout preview), and blended_map (per blend_mode). For a depth-anything ControlNet you'll typically grab depth_map (maybe after depth_invert); for a pose ControlNet grab pose_map; the combined_map is mostly a debugging convenience.
Gotchas
enable_depthwith nothing wired. "Requires at least ONE depth source wired" is the tooltip, and it means it: leave it on with no external map and no loader and the node errors. Either wire something or switchdepth_backendtobuilt_in_midas.- Depth model packs are optional dependencies. The tooltips name the exact repo and model folder for each backend (e.g.
ComfyUI/models/depthanything/for DepthAnything V2). If you haven't installed that pack, that backend just won't be selectable/useful - the node itself doesn't install them. - Blend modes are easy to overthink.
weighted_avgis a fine default; switch tolinear_dodgewhen you specifically want pose+canny edges to stay sharp. Don't start withchannel_splitunless you know your ControlNet was trained for that packing.
The ControlNet context here is worth repeating: conditioning images steer composition, but the community's standing advice is to release the condition partway through sampling once structure is locked. A clean preprocessed map helps; a good control-strength curve helps more. This node just makes the map part trivial.
Inputs (33)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | Input video frames (B,H,W,3) float32 [0,1]. | |
| width | INT | 83264–4096 | Output canvas width. |
| height | INT | 48064–4096 | Output canvas height. |
| enable_depth | BOOLEAN | true | Run the depth pass. Requires at least ONE depth source wired. |
| enable_pose | BOOLEAN | true | Run the pose pass. |
| enable_canny | BOOLEAN | true | Run the canny pass. |
| canny_threshold1 | INT | 1000–500 | Canny lower hysteresis threshold. |
| canny_threshold2 | INT | 2000–500 | Canny upper hysteresis threshold. |
| canny_aperture | COMBO | 3 | Sobel aperture for Canny (odd: 3/5/7). |
| depth_colorize | BOOLEAN | false | If true, colorize grayscale depth with INFERNO colormap. Skipped when external_depth_map is already RGB. |
| depth_invert | BOOLEAN | false | Invert depth (1 - depth). Use when source produces 'far = bright' but you want 'near = bright' (typical ControlNet expectation). |
| pose_detection_threshold | FLOAT | 0.050–1 | YOLO confidence threshold (only used when posemodel is wired). |
| pose_draw_threshold | FLOAT | 0.300–1 | Per-keypoint score threshold for drawing the skeleton. |
| combined_layout | COMBO | horizontal_3 | Layout for the combined output. grid_2x2 = depth | pose // canny | original. |
| depth_backend | COMBO | auto | Which depth backend to use. 'auto' tries: external_depth_map -> any wired loader -> built_in_midas. 'built_in_midas' makes the node fully self-contained (downloads MiDaS small via torch.hub on first use, ~80MB). |
| enable_normal | BOOLEAN | true | Compute Sobel-from-depth NORMAL map. No model required (uses depth pass output). |
| normal_strength | FLOAT | 1.00.1–10 | Scales the Sobel gradients before normalisation. Higher = stronger normal contrast. |
| blend_mode | COMBO | weighted_avg | How to combine depth+pose+canny+normal into blended_map. linear_dodge=additive (sharp), screen=highlight-safe, channel_split=Fun-Control (R=depth/G=canny/B=pose). |
| depth_weight | FLOAT | 1.000–4 | Weight of depth in blended_map. |
| pose_weight | FLOAT | 1.000–4 | Weight of pose in blended_map. |
| canny_weight | FLOAT | 1.000–4 | Weight of canny in blended_map. |
| normal_weight | FLOAT | 0.500–4 | Weight of normal map in blended_map. |
| external_depth_mapopt | IMAGE | Pre-computed depth IMAGE batch from ANY upstream node. Highest priority. | |
| damodel_v2opt | DAMODEL | DepthAnything V2 model bundle from kijai/ComfyUI-DepthAnythingV2 (DownloadAndLoadDepthAnythingV2Model). Models: ComfyUI/models/depthanything/. | |
| da3_modelopt | DA3MODEL | DepthAnything V3 config bundle from PozzettiAndrea/ComfyUI-DepthAnythingV3. Use the V3 pack's Inference node and feed its IMAGE output into external_depth_map. Models: ComfyUI/models/depthanything3/. | |
| depthcrafter_modelopt | DEPTHCRAFTER_MODEL | DepthCrafter bundle from akatz-ai/ComfyUI-DepthCrafter-Nodes. Temporally consistent video depth. Models: ComfyUI/models/depthcrafter/. | |
| depth_pro_modelopt | DEPTH_PRO_MODEL | Depth-Pro bundle from spacepxl/ComfyUI-Depth-Pro. Metric depth. Models: ComfyUI/models/depth/ml-depth-pro/. | |
| posemodelopt | POSEMODEL | From ONNX Detection Model Loader (V2) or animal-pose loader. Used if enable_pose=True AND no external_pose_map wired. | |
| external_pose_mapopt | IMAGE | Pre-rendered pose map from any upstream node (e.g. Fannovel16/comfyui_controlnet_aux DWPose / OpenPose / AnimalPose). Highest priority for pose. | |
| depthcrafter_stepsopt | INT | 51–100 | DepthCrafter only: diffusion inference steps. |
| depthcrafter_guidanceopt | FLOAT | 1.00.1–10 | DepthCrafter only: classifier-free guidance. |
| depthcrafter_windowopt | INT | 1101–200 | DepthCrafter only: temporal window size. |
| depthcrafter_overlapopt | INT | 250–100 | DepthCrafter only: window overlap. |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| depth_map | IMAGE | Per-frame depth IMAGE batch (3-channel, height x width). |
| pose_map | IMAGE | Per-frame pose IMAGE batch (3-channel, on black canvas). |
| canny_map | IMAGE | Per-frame canny edge IMAGE batch (3-channel grayscale). |
| normal_map | IMAGE | Per-frame normal map (RGB-encoded surface normals from Sobel-of-depth). |
| combined_map | IMAGE | Side-by-side combined preview per `combined_layout`. |
| blended_map | IMAGE | Weighted blend of {depth, pose, canny, normal} per `blend_mode` and per-channel weights. |