Nodes/ComfyUI-Sapiens2/Sapiens2 Draw Pose
ComfyUI Node

Sapiens2 Draw Pose

Turn Sapiens2's keypoints into a picture you can actually see

By kijai·Created 4 months ago·Updated 4 months ago· 65
Sapiens2 Draw Pose
  • keypoints
  • IMAGE
draw_skeletontrue
draw_pointstrue
draw_facetrue
point_radius3
stick_width3
score_threshold0.30

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.

CategorySapiens2

Inputs (7)

NameTypeDefaultDescription
keypointsPOSE_KEYPOINT
draw_skeletonBOOLEANtrue
draw_pointsBOOLEANtrue
draw_faceBOOLEANtrue
point_radiusINT31–20
stick_widthINT31–20
score_thresholdFLOAT0.300–1

Outputs (1)

NameTypeDescription
IMAGEIMAGE