OpenDWPose JK๐
One clean skeleton from DWPose + OpenPose
- DWPose
- OpenPose
- pose_image
Pose control has a good news / bad news problem. DWPose detects hands and faces better than anything. OpenPose gives you cleaner, more reliable body lines. What you actually want for driving a video generation is both - and they come out of their preprocessors as two separate skeleton images that don't line up with each other. OpenDWPose JK is the node that merges them into one composite pose image. The output is a single clean skeleton you can feed straight into a ControlNet apply node or a Wan Animate / pose-control workflow.
The mechanism, and it's refreshingly concrete
The node takes two IMAGE inputs - DWPose and OpenPose - and combines them by color arithmetic. Skeleton images aren't just lines; they're colored lines, and the two detectors color-code their parts differently. So:
- From the DWPose image, it removes a specific list of colors (the blue and magenta body/face/hand lines that would double up or fight with OpenPose's lines).
- From the OpenPose image, it reserves only the colors it wants to keep (its cleaner body and head lines).
- It adds the two images together, pixel by pixel.
The tolerance is small (a 1% color distance threshold), so it's exact-match-ish on the standard skeleton palette. The result on pose_image is one image that has DWPose's superior hand/face detail riding on top of OpenPose's clean body skeleton.
Why you'd reach for it
This is a workflow-quality fix, not a convenience. If you've ever tried pose-driven video generation and watched the hands collapse into a flailing mess, the fix is often "the hand skeleton wasn't good enough," and DWPose is the detector that fixes exactly that. But DWPose's body lines can be noisier than OpenPose's. This node is Jake's way of having both - it shipped in v1.9.9 and became standard plumbing in the pack's Wan pose-control workflows (Wan Animate, Steady Dance, SCAIL and friends) as of v2.5.0.
The wider context: in the ControlNet world, pose conditioning works because the preprocessor extracts the skeleton and the model matches generation to it. Better skeleton in, better motion out. That's the whole game.
Install
Same pack install:
cd ComfyUI/custom_nodes
git clone https://github.com/jakechai/ComfyUI-JakeUpgrade
pip install -r requirements.txt
Restart, then run DWPose and OpenPose preprocessors (ComfyUI ControlNet Aux has both) on the same frame and wire them in. Note: the pack depends on opencv-python, which this node needs for the image work - that's in the requirements file, so a normal install gets it. If you're seeing missing-image or type errors, make sure the two inputs are both RGB IMAGE tensors at the same resolution; the node doesn't resize, and mismatched sizes will trip you up.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| DWPose | IMAGE | โ | |
| OpenPose | IMAGE | โ |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| pose_image | IMAGE | โ |