OpenPose Pose
Pose skeletons for ControlNet
- image
- IMAGE
- POSE_KEYPOINT
Give it a photo of a person and it spits out a stick-figure skeleton - the classic colored-line OpenPose rig with joints for the body, dots for the face, and lines for the fingers. Hand that skeleton to a pose ControlNet and the model generates a new person striking the exact same pose. This is how you take control of composition: copy a pose from a reference, then prompt whatever character, style, and setting you want on top of it. It's one of the three or four things that made ControlNet the biggest deal since Stable Diffusion itself.
How it works
OpenPose detects human keypoints: 18 body joints, up to 70 face landmarks, and 21 keypoints per hand. It draws them as the recognizable skeleton - and crucially, that skeleton is abstract. It encodes where the limbs are, not who the person is or what they're wearing, so the model is free to reinvent everything except the posture. That abstraction is the whole point.
The inputs that matter
The three toggles are the meat of this node, and they map directly onto the OpenPose "modes" you may have seen elsewhere:
detect_body(default enable) - the core skeleton. Leave it on unless you specifically only want a face.detect_hand(default enable) - adds the finger keypoints. Hands are where pose detection is weakest, so this is a mixed blessing: when it nails the hand it helps, when it misreads it you can get a worse result than leaving hands out. If your hands come out mangled, try disabling this and letting the model improvise.detect_face(default enable) - adds facial landmarks, which pin head orientation and rough expression.
Turning body + hand + face all on is the equivalent of openpose_full; face-only or hand-only combinations give you the narrower modes. There's also scale_stick_for_xinsr_cn (default disable) - a compatibility switch that thickens the skeleton sticks for xinsir's SDXL ControlNet, which was trained expecting fatter limbs. Flip it on only if you're specifically pairing with that model; otherwise leave it. And resolution (512) sets the working size - match it to your render.
The two outputs
IMAGE- the rendered skeleton. This is what goes into your ControlNet Apply node.POSE_KEYPOINT- the pose as structured data (OpenPose-format JSON under the hood). This is the underrated one: route it into a pose-editor node to nudge a limb by hand before generating, or into the pack's "Save Pose Keypoints" node to save the coordinates. If you're building a batch pipeline, this is the machine-readable version of the pose.
A word on DWPose
OpenPose is the original detector, and it's fine. But the community consensus is that DWPose - a separate node in this same pack - is the better detector now, especially for hands and crowded scenes. If OpenPose keeps flubbing your hands, try DWPose before you try anything else. The skeleton output is compatible with the same pose ControlNets.
Installing it
ComfyUI Manager: search ComfyUI's ControlNet Auxiliary Preprocessors, install, restart. Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/Fannovel16/comfyui_controlnet_aux
pip install -r requirements.txt
Restart ComfyUI. The pose model weights download from HuggingFace on first run.
Where people get burned
First, the universal one: the skeleton is just a hint image - you still need a pose ControlNet model loaded and wired for anything to happen. Second, detection quality depends on the input. A clean, well-lit full-body reference detects cleanly; a busy, low-contrast, or partially-cropped shot gives you a broken skeleton, and a broken skeleton produces a broken generation. Third, if pose adherence feels too rigid, drop the ControlNet weight and end it early (around half the steps) - locking the pose through the entire sample can leave anatomy stiff and detail flat. Pose sets the composition; you don't need to hold it to the finish line.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| detect_handopt | COMBO | enable | 2 options: enable, disable |
| detect_bodyopt | COMBO | enable | 2 options: enable, disable |
| detect_faceopt | COMBO | enable | 2 options: enable, disable |
| resolutionopt | INT | 51264–16384 | — |
| scale_stick_for_xinsr_cnopt | COMBO | disable | 2 options: disable, enable |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |
| POSE_KEYPOINT | POSE_KEYPOINT | — |