Pose Renderer
Turning skeletons into ControlNet food (the right way)
- pose_keypoint
- skeleton_image
Pose detection gives you a POSE_KEYPOINT; ControlNet doesn't eat that. It eats a picture of a skeleton - the classic 18-colour OpenPose stick figure on black, rendered at exactly the size you're generating. Pose Renderer is the node that bridges the two, and if you've ever had ControlNet "mostly follow" a pose but drift on proportions, it's probably because this step was done wrong.
How it works
The node draws the stored keypoints onto a canvas using the same limb definitions and colour arrays as comfyui_controlnet_aux's renderer - DWPose mode reproduces the exact training-data format every pose ControlNet expects, with 1px lines. That's the key subtlety: ControlNet models are trained on a specific stick-figure look, and deviating from it (thicker sticks, different colours) quietly degrades how well they follow.
The inputs that matter
pose_keypoint- whatever detection or composition produced it.keep_input_size- keep it true for ControlNet. It renders at the exact resolution stored in the pose data, so the skeleton lines up pixel-for-pixel with your generation. Set it false and you're asking for a rescale that misaligns everything.color_mode-dwposefor ControlNet (the training format).enhanceduses warm/cool L/R colour-coding for visual analysis - great for eyeballing, terrible for conditioning. The README says it plainly: don't feedenhancedto ControlNet.body_only- kills face, hands and feet in one click, overriding the individual toggles. Handy for tight multi-person shots where fine detail would just merge into noise.face_dot_radius- drop to 1 when many small skeletons overlap and the face dots (70 of them) fill in like a blob.xinsr_stick_scaling- this one is specific: enable it only forxinsir/controlnet-openpose-sdxl-1.0, whose training drew scaled-up sticks. At 1024px it renders stick width 12 instead of 4. For everything else - standard SDXL, SD 1.5, Flux Union, SD3 pose - leave it off.
Output
skeleton_image - the rendered IMAGE. Straight into a ControlNet's image input, then out to your KSampler.
Installing it
Same pack, same drill: ComfyUI Manager → search Eric Composer Studio → install → restart, or clone https://github.com/EricRollei/Eric_Composer_Studio.git into custom_nodes and pip install -r requirements.txt. Rendering itself only needs numpy/OpenCV, but since it consumes POSE_KEYPOINT, the pose pipeline (detector, comfyui_controlnet_aux) has to be installed for the data type to exist.
Where people get burned
The classic three: rendering at the wrong size (keep_input_size false), feeding enhanced colours to ControlNet, and using the Xinsir toggle on a model that doesn't want it. And one more that's easy to miss - if you compose several scaled-down people onto one canvas, the hands and face dots merge into solid noise. Drop face_dot_radius to 1, or just hit body_only: ControlNet still reads the body skeleton accurately, and your output will look a lot less "ink blot at head height".
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| pose_keypoint | POSE_KEYPOINT | — | |
| keep_input_size | BOOLEAN | true | True: render at POSE_KEYPOINT canvas size (recommended for ControlNet). False: use explicit dimensions below. |
| canvas_width | INT | 102464–8192 | — |
| canvas_height | INT | 102464–8192 | — |
| color_mode | COMBO | dwpose | 2 options: dwpose, enhanced |
| line_width | INT | 41–16 | Enhanced mode only. DWPose mode always uses stickwidth=4. |
| joint_radius | INT | 41–20 | Enhanced mode only. DWPose mode always uses radius=4. |
| face_dot_radius | INT | 21–8 | Face keypoint dot size. Default 2 for DWPose, scales with joint_radius in Enhanced. |
| draw_face | BOOLEAN | true | — |
| draw_hands | BOOLEAN | true | — |
| draw_feet | BOOLEAN | true | — |
| body_only | BOOLEAN | false | Disable face, hands and feet in one click. Overrides the individual toggles above. |
| xinsr_stick_scaling | BOOLEAN | false | Scale stick thickness for xinsir/controlnet-openpose-sdxl-1.0. At 1024px: stickwidth=12. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| skeleton_image | IMAGE | — |