Sapiens2 Draw Pose
Turn Sapiens2's keypoints into a picture you can actually see
- keypoints
- IMAGE
Sapiens2Pose gives you keypoint data; this node makes it visible. It takes the POSE_KEYPOINT output and renders it back into an actual image - the classic stick-figure-on-black look you feed to a ControlNet openpose conditioner, or just save to see what the pose detector actually found. If you're building a reposing workflow, this is the node between "detected" and "conditioned."
There's a genuinely clever detail in how it works. If your keypoints came out of Sapiens2Pose in the default openpose format, DrawPose delegates to ComfyUI's native SDPose drawer - the same rendering code the core pose nodes use. That means your Sapiens2 pose comes out looking exactly like any other openpose image in your library: same skeleton style, same conventions, guaranteed compatible with controlnet openpose preprocessors. You don't have to learn a second drawing convention.
How it works
Feed in keypoints from Sapiens2Pose. If you chose raw_308 as the format upstream, DrawPose switches to its own renderer and draws the full 308-point Sapiens2 skeleton - every finger, plus dense face landmarks - using the pack's skeleton edges and per-part coloring. Either way the controls are the same:
- draw_skeleton / draw_points / draw_face (all default on) - toggle sticks, keypoint dots, and face landmarks. In the OpenPose-delegated path, skeleton also covers hands.
- point_radius and stick_width (default 3 each) - how fat the dots and lines are. Bump for big renders.
- score_threshold (default 0.3) - the confidence filter. Any keypoint below this is dropped from both sticks and dots. This is the knob that removes the random floating dots on a bad detection; raise it if your skeleton looks noisy, lower it if parts go missing.
Output is a single IMAGE: black background, colored keypoints, exactly what the openpose conditioning path wants. It returns at your input's canvas size, which the keypoints carry along with them.
Wiring it
Sapiens2Pose → Sapiens2DrawPose → SaveImage (see what was detected)
└→ ControlNet (openpose) → Apply ControlNet → KSampler
The honest gotcha: if you fed Sapiens2Pose raw_308 output into a ControlNet that expects OpenPose-format skeletons, the conditioning will silently do the wrong thing - openpose models don't know a 308-keypoint layout. Keep output_format at openpose unless you specifically want the full-skeleton rendering, and only use raw_308 for DrawPose's detailed view.
Installing
Manager search "ComfyUI-Sapiens2", or git clone https://github.com/kijai/ComfyUI-Sapiens2 into custom_nodes, restart. No dependencies to install beyond the pack (it uses cv2 if present for the raw-308 rendering path, and falls back to PIL if not - so you don't even need OpenCV installed). The one requirement that catches people: a recent ComfyUI build, because the pack is written against the newer io.ComfyNode API. Old ComfyUI, nodes don't show up - update the core before you blame the pack.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| keypoints | POSE_KEYPOINT | — | |
| draw_skeleton | BOOLEAN | true | — |
| draw_points | BOOLEAN | true | — |
| draw_face | BOOLEAN | true | — |
| point_radius | INT | 31–20 | — |
| stick_width | INT | 31–20 | — |
| score_threshold | FLOAT | 0.300–1 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |