Save Pose to JSON (from Keypoint)
Stop Redrawing Poses — Save Them as JSON Instead
- pose_point
- pose_image
- filename
Every good pose deserves to be a file. That's the whole job of SavePoseToJson: it takes the keypoint data that OpenPose/DWPose produces and writes it to a JSON file in your ComfyUI output folder, so you never have to redraw the same skeleton twice. It ships with the DocKr OpenPose Editor pack, and it's the quiet half of the pack - the editor gets all the attention, this node is what makes your hand-tuned poses last longer than one workflow run.
Where it fits
Pose conditioning lives on ControlNet - OpenPose/DWPose is one of the standard "spatial" conditions, and it's how you force a character into a stance the prompt alone can't nail. The usual flow is: drop a reference photo in, run it through an OpenPose/DWPose preprocessor, and feed the skeleton to a ControlNet. The problem is that extracted pose evaporates when the workflow closes. SavePoseToJson is the persistence layer: extract once, save, and reload that JSON into the editor later (its pose_point input) when you want to tweak it.
How it works
The reference workflow in the pack wires it straight from OpenposePreprocessor (the one in ControlNet Auxiliary Preprocessors): that preprocessor's output 1 is POSE_KEYPOINT, output 0 is the pose render image. The node reads the canvas size from the keypoint data (canvas_width/canvas_height, defaulting to 512×512), converts each joint from the 0–1 relative coordinates the preprocessor emits into absolute pixels, and writes one people[] entry per person - 18 joints as 54 floats (x, y, confidence per point), the classic OpenPose JSON shape, plus width/height and the canvas fields. Files land in ComfyUI/output/ via the same get_save_image_path machinery SaveImage uses, with a counter appended so nothing gets clobbered.
The inputs that matter
pose_point(POSE_KEYPOINT, required) - the keypoints. Comes from the OpenPose/DWPose preprocessor, or from the editor's own pose data.filename_prefix(STRING, default"poses/pose") - where the file goes relative to the output folder.pose_image(IMAGE, optional) - a matching render; the first image of the batch is saved alongside as PNG with the same base name.- output:
filename(STRING) - the relative path, e.g.poses/pose_00001.json.
Gotchas worth knowing
Only the 18 body joints survive - if you extracted hands and face with openpose_full, they're silently dropped, because the node only writes pose_keypoints_2d. The canvas size matters: if the keypoint data doesn't carry canvas_width/canvas_height, it assumes 512×512, so a pose extracted from a 1024px reference will be saved scaled for 512. And the filename output is relative, not absolute - don't feed it to a node expecting a full path.
Install
ComfyUI Manager, search "OpenPose Editor (DocKr)". Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/DocWorkBox/ComfyUI-OpenPose-Editor-DocKr.git
cd ComfyUI-OpenPose-Editor-DocKr
pip install -r requirements.txt
Then restart. Dependencies are light (torch, numpy, opencv-python==4.10.0.84, Pillow) - the pack even auto-installs anything missing on startup, which is convenient until a pinned opencv version collides with something else you've got installed. One caveat: this is a small community fork (Chinese-language README, no real Reddit footprint), so don't expect much support if you hit a wall. For the basic "save the pose" job, it just works.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| pose_point | POSE_KEYPOINT | — | |
| filename_prefix | STRING | poses/pose | — |
| pose_imageopt | IMAGE | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| filename | STRING | — |