Nodes/ComfyUI/SDPose Draw Keypoints
ComfyUI Node Runs on cloud

SDPose Draw Keypoints

Turn pose data into the stick figure ControlNet actually wants

By Comfy-Org·Created 4 years ago·Updated 20 days ago· 121,575
SDPose Draw Keypoints
  • keypoints
  • IMAGE
draw_bodytrue
draw_handstrue
draw_facetrue
draw_feetfalse
stick_width4
face_point_size3
score_threshold0.30
draw_headtrue

Pose ControlNet doesn't read keypoint data - it reads a picture of keypoints. Somewhere between your photo and the ControlNet node, a skeleton has to get drawn onto a canvas. For years that meant a preprocessor pack; since early 2026 it means this node, which draws the skeleton from the POSE_KEYPOINT output of SDPoseKeypointExtractor. It's the renderer for the whole pose family, and it's the thing that makes the "extract → draw → control" pipeline work end to end with zero third-party code.

The output is the image you've seen a thousand times in pose-ControlNet workflows: the little glowing stick figure on a black background, limbs as sticks, face and hands as dots. That image is what tells the diffusion model where the head, shoulders, hands and feet go. The trick is that the skeleton canvas is the same size as your source image - the skeleton is drawn at the same coordinates the pose was detected at, so the ControlNet condition lines up pixel-for-pixel with your generation.

How it works

It walks the OpenPose-format keypoint frames, and for each person draws the 18 body joints as connected limb sticks, the six feet points, the 68 face landmarks, and the 21 points per hand. Every point carries a confidence score from the detector, and anything below score_threshold gets skipped - that's the filter that keeps a spurious low-confidence hand point from drawing a phantom limb on your skeleton. The draw_* toggles let you strip parts out, and the width and point-size knobs control how chunky the lines are.

The inputs and outputs that matter

  • keypoints - POSE_KEYPOINT from SDPoseKeypointExtractor. The only required input.
  • draw_body / draw_head - on by default; body sticks and the head circle.
  • draw_hands / draw_face - on by default. draw_feet - off by default, and there's a reason: most pose ControlNets weren't trained on feet, so including them can confuse the model rather than help.
  • score_threshold - default 0.3; raise it for a cleaner, sparser skeleton, lower it to keep marginal detections.
  • stick_width / face_point_size - visual thickness; mostly cosmetic.

The single IMAGE output is what you wire into a ControlNet's conditioning image (via the standard controlnet apply flow), or just look at to sanity-check your pose extraction.

The one caveat

If the extractor found no people at all, this node doesn't error - it returns a small empty black image (64×64). That's ComfyUI being forgiving, but it's also a silent failure: an empty 64×64 canvas fed into a ControlNet produces garbage conditioning, not a helpful error. If your generated pose looks broken, check the extractor output first, not the drawing. And if you're coming from DWPose or OpenPose preprocessors: this replaces them cleanly, but remember the family outputs keypoints first and then an image - you can't wire SDPoseKeypointExtractor straight into ControlNet without this node in between.

Categoryimage/detection

Inputs (9)

NameTypeDefaultDescription
keypointsPOSE_KEYPOINT
draw_bodyBOOLEANtrue
draw_handsBOOLEANtrue
draw_faceBOOLEANtrue
draw_feetBOOLEANfalse
stick_widthINT41–10
face_point_sizeINT31–10
score_thresholdFLOAT0.300–1
draw_headBOOLEANtrue

Outputs (1)

NameTypeDescription
IMAGEIMAGE