Nodes/Mickmumpitz-Nodes/OpenPose Image → Keypoints
ComfyUI Node

OpenPose Image → Keypoints

Resurrect OpenPose keypoints from a plain skeleton image

By mickmumpitz·Created 8 months ago·Updated 17 days ago· 48
OpenPose Image → Keypoints
  • openpose_image
  • pose_keypoint
  • debug_overlay
  • info
color_tolerance40
min_dot_area4
reconstruct_hands_facetrue

You've got a rendered OpenPose skeleton - a pose ControlNet output, a DWPose map, some workflow you downloaded that only saved the final image. Now you want to crop the hand region for a detailer pass, but every crop node needs POSE_KEYPOINT data, and all you have is pixels. This node is the adapter: it walks the skeleton image backwards and recovers the keypoint data from what's drawn.

Why it works at all

OpenPose renderings are color-coded, and that's the whole trick. The controlnet_aux drawer paints each of the 18 body joints as a solid, unique-color filled circle, drawn on top of the limb sticks (which are dimmed). So each joint's color is effectively a label. The node isolates each exact color, finds the connected blobs (one per person), and takes the centroid of each blob as the joint position. Hands are clusters of blue dots and the face is a cluster of small white dots - optionally recovered too and attached to the nearest wrist or nose, so hand and face crops come out accurate.

It's a clever bit of reverse-engineering, and it drops into any node that consumes POSE_KEYPOINT, including this pack's own OpenPose Part Mask and OpenPose Part Crop.

Inputs

  • openpose_image - a rendered OpenPose / DWPose skeleton image. Nothing else.
  • color_tolerance (default 40) - per-channel color match tolerance for joint detection. If joints aren't being found, your renderer may be using slightly off colors; nudge this up.
  • min_dot_area (default 4) - ignore color blobs smaller than this many pixels. Filters noise dots.
  • reconstruct_hands_face (default true) - also recover the blue hand and white face dot clusters. Turn off only if a busy image is producing spurious clusters.

Outputs

  • pose_keypoint - the recovered POSE_KEYPOINT, ready for the crop/mask nodes.
  • debug_overlay - the skeleton image with detected joint positions circled and numbered, so you can see exactly what it found.
  • info - a string with frame count and people detected.

Honest limits

This is a decoder for rendered skeletons, so its accuracy is bounded by the render. It needs the standard OpenPose color scheme - if someone saved a pose map in a custom palette, the defaults won't match and you'll have to lean on color_tolerance. And it reconstructs positions from pixels, so it can't recover joint confidence values the way a live detector would. If you still have the original image and a pose detector handy, running DWPose fresh will always beat recovering from a rendering - this node is for when the skeleton image is all you've got, which is a genuinely common situation with downloaded workflows.

Install

Part of Mickmumpitz-Nodes (MIT, deps: numpy, Pillow, opencv-python - no models needed). ComfyUI Manager, search "Mickmumpitz", or:

cd ComfyUI/custom_nodes && git clone https://github.com/mickmumpitz/ComfyUI-Mickmumpitz-Nodes.git

Restart, find it under Mickmumpitz/OpenPosePartCropper as "OpenPose Image → Keypoints". Pair it with OpenPose Part Crop + OpenPose Part Stitch for a full pose-driven detailer loop.

CategoryMickmumpitz/OpenPosePartCropper

Inputs (4)

NameTypeDefaultDescription
openpose_imageIMAGEA rendered OpenPose / DWPose skeleton image.
color_toleranceoptINT400–128Per-channel color match tolerance for joint detection.
min_dot_areaoptINT41–200Ignore color blobs smaller than this (px).
reconstruct_hands_faceoptBOOLEANtrueAlso recover hand (blue) and face (white) dot clusters.

Outputs (3)

NameTypeDescription
pose_keypointPOSE_KEYPOINT
debug_overlayIMAGE
infoSTRING