Openpose Editor Node
ComfyUI's Local OpenPose Editor
- POSE_KEYPOINT
- POSE_IMAGE
- POSE_KEYPOINT
- POSE_JSON
OpenPose gives you the skeleton, but it doesn't let you fix the skeleton. That's the whole gap this node exists to close. You run an image through a DWPose/OpenPose detector, the ControlNet pose map comes back with the arm crossing the chest, and you just want to nudge the elbow - not regenerate, not fight the prompt. Openpose Editor Node lets you grab the stickman and move it, entirely inside ComfyUI, no extra web app and no internet round-trip.
It's a rewritten, expanded version of huchenlei's ComfyUI-openpose-editor, which was the go-to for years but leaned on a remote service. This one renders and edits everything locally, so it keeps working with your internet off. One node does what used to take two: it edits and renders the pose image, which is why the author also spun the rendering half out as a separate ultimate-openpose-render pack if you want the render without the editor.
How it works
The node accepts poses in three flavors - an image (POSE_IMAGE output of a pose detector), raw keypoints (POSE_KEYPOINT), or a JSON string (POSE_JSON) - and can also run with no input at all, giving you a blank canvas to draw a fresh pose from scratch. When you wire up both keypoints and JSON, the keypoints win for editing; on the output side, JSON wins (that's POSE_JSON > POSE_KEYPOINT for output, POSE_KEYPOINT > POSE_JSON for edit - worth remembering when your edited pose "doesn't apply").
Right-click the node → Open in Openpose Editor, and a canvas pops up showing the rendered stick figure. Drag joints, send it back, and your edits land in the node's POSE_JSON widget. The render itself is plain local drawing - the pack just needs matplotlib/OpenCV, no pose model of its own. Close the editor with ESC or SHIFT+ESC (click the window's outer area first so it's focused).
The inputs that actually matter
You don't need to touch most of these. The ones a beginner actually sets:
- POSE_KEYPOINT / POSE_JSON - where the pose comes from. Leave both empty to draw from a blank canvas.
- show_body / show_face / show_hands - which parts render. Turn hands off when a detector's hand estimates are garbage; it keeps the pose map cleaner.
- body_scale / head_scale / hands_scale / overall_scale - quick procedural scaling without opening the editor. Useful for "the hands are too small in this pose" fixes.
- resolution_x - render width;
-1keeps the original. With no input it defaults to a 512×768 blank.
The trickier ones: only_scale_pose_index targets one person in a multi-person image (a value larger than the person count scales everyone; negative indexes count from the end), and scalelist_behavior / match_scalelist_method decide how a list of scale values is applied per-pose or per-image and how short lists extend - only relevant for batch or animation work.
Outputs: POSE_IMAGE (the rendered ControlNet-ready image - wire this into your ControlNet), POSE_KEYPOINT (the raw dict, feeds other keypoint nodes), and POSE_JSON (the serialized poses, handy for saving or scripting).
Installing it
Through ComfyUI Manager, search ultimate-openpose-editor. Manual install is the same as any node:
cd ComfyUI/custom_nodes
git clone https://github.com/westNeighbor/ComfyUI-ultimate-openpose-editor
cd ComfyUI-ultimate-openpose-editor
pip install -r requirements.txt # torch, polygraphy, numpy, opencv-python, matplotlib
Portable Windows? Use E:/ComfyUI_windows_portable/python_embeded/python.exe -m pip install -r requirements.txt. Restart ComfyUI, then add the node via Right Click → ultimate-openpose → Openpose Editor Node. No model downloads - the pack renders keypoints, it doesn't detect them. To produce POSE_KEYPOINT input you'll still want comfyui_controlnet_aux (DWPose/OpenPose Pose node), which is what defines the POSE_KEYPOINT type.
The gotcha people hit
Where people get burned: installing via Manager renames the folder, and the extension file hardcodes the path to the editor UI. The editor opens a blank window or nothing at all. Check your folder name under custom_nodes - if it's westNeighbor_ComfyUI-ultimate-openpose-editor instead of ComfyUI-ultimate-openpose-editor, open js/openpose_editor.js around line 110 and change src: "extensions/ComfyUI-ultimate-openpose-editor/ui/OpenposeEditor.html" to match your actual folder name. It's a two-second fix, but it's the top complaint in the community - people report "missing nodes" and an editor that never opens, and this folder mismatch is usually why. If your graph still can't find the node at all after a clean install, you're almost certainly missing comfyui_controlnet_aux and the POSE_KEYPOINT type it defines.
Inputs (16)
| Name | Type | Default | Description |
|---|---|---|---|
| show_bodyopt | BOOLEAN | true | — |
| show_faceopt | BOOLEAN | true | — |
| show_handsopt | BOOLEAN | true | — |
| resolution_xopt | INT | -1-1–12800 | Resolution X. -1 means use the original resolution. |
| pose_marker_sizeopt | INT | 40–100 | — |
| face_marker_sizeopt | INT | 30–100 | — |
| hand_marker_sizeopt | INT | 20–100 | — |
| hands_scaleopt | FLOAT | 1.000–10 | — |
| body_scaleopt | FLOAT | 1.000–10 | — |
| head_scaleopt | FLOAT | 1.000–10 | — |
| overall_scaleopt | FLOAT | 1.000–10 | — |
| scalelist_behavioropt | COMBO | poses | When the scale input is a list, this determines how the scale list takes effect, the differences appear when there are multiple persons(poses) in one image. |
| match_scalelist_methodopt | COMBO | loop extend | Match the scale list to the input poses or images when the scale list length is shorter. No extend: Beyound the scale list will be 1.0. Loop: Loop the scale list to match the poses or images length. Clamp: Use the last scale value to extend the scale list. |
| only_scale_pose_indexopt | INT | 99-100–100 | For multiple poses in one image, the scale will be only applied at desired index. If set to a number larger than the number of poses in the image, the scale will be applied to all poses. Negative number will apply to the pose from the end. |
| POSE_JSONopt | STRING | — | |
| POSE_KEYPOINTopt | POSE_KEYPOINT | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| POSE_IMAGE | IMAGE | — |
| POSE_KEYPOINT | POSE_KEYPOINT | — |
| POSE_JSON | STRING | — |