ComfyUI Node

OpenPose

This \"OpenPose\" node doesn't detect a single keypoint — and that's fine

By AIGODLIKE·Created 2 years ago·Updated 10 months ago· 61
OpenPose
    • IMAGE
    • MASK
    image
    frame0

    Look, here's the thing nobody tells you when you search for "ComfyUI OpenPose": this node named OpenPose does zero pose detection. It doesn't run a keypoint model, doesn't need DWPose or any .pth weights, and it won't help you one bit if you just want a pose skeleton from a photo you dragged into the web UI. What it actually does is load a pose image that something else already rendered, and that something else is Blender.

    The full story: OpenPose belongs to ComfyUI-CUP, the bridge package from AIGODLIKE that exists to serve their Blender addon, ComfyUI-BlenderAI-node. The README is upfront about it - "this repo do not provide any nodes for web-end." The addon in Blender animates a 3D scene, computes a pose skeleton for each animation frame, and writes those control images to a folder. Your ComfyUI side then has a matching node per control type to pick the right frame back up. This node is that pickup, for plain body-pose skeletons.

    How it actually works

    OpenPose is a subclass of OpenPoseBase with a hardcoded posetype = "openpose". When it runs, it takes the image input - which is a directory path, not a tensor - and looks inside <image>/openpose/ for a file named like Image0000.png. The frame integer you see on the node tells it which Image%04d.png to grab: frame 0 reads Image0000.png, frame 12 reads Image0012.png. It converts that PNG to an RGB tensor (0–1 normalized) and returns it alongside a mask built from the PNG's alpha channel. No detection, no ControlNet preprocessing - it's a frame-indexed file loader with extra steps.

    That frame input is the whole point. In an animation workflow, you run the graph once per Blender timeline frame, and this node advances with it, feeding the skeleton for exactly that frame into your sampler. It's how you get frame-accurate pose control on a moving character instead of one static pose plastered over every frame.

    The two inputs that matter

    • image - a STRING holding the path to the directory of rendered control images. In normal use the Blender addon fills this automatically; you'll almost never type it. If you feed it a random folder in the web UI, you'll get the silent failure below.
    • frame - INT, which frame's control image to load. Defaults to 0.

    Both outputs are the standard ComfyUI tensor types: IMAGE (the pose skeleton, ready to wire into an Apply ControlNet node with an openpose ControlNet model) and MASK (from the image's alpha, useful if you're compositing or masking around the figure). MASK is genuinely optional; IMAGE is the one that drives generation.

    Installing it

    Via ComfyUI Manager, search ComfyUI-CUP and install, or clone it manually:

    cd ComfyUI/custom_nodes
    git clone https://github.com/AIGODLIKE/ComfyUI-CUP.git
    

    Restart ComfyUI afterwards. There are no extra pip requirements and no model downloads - the pack ships zero weights, and its only runtime dependencies (numpy, torch, PIL) are already ComfyUI's own. If a node file imports torchaudio, that's lazy and only for the audio nodes, not this one.

    Where people get burned

    The name invites the wrong mental model, so: this is not a replacement for the ControlNet preprocessors you know from other packs, and installing CUP alone gives you nothing to do in the web UI. If you feed image a wrong path or a frame that doesn't exist, the node doesn't throw - it logs Frame Not Found to stderr and silently returns a blank 64×64 black image and mask. A black pose map fed into ControlNet quietly wrecks your output, so when things look broken, check that Blender actually rendered that frame and that the path matches. And remember the prerequisite: without ComfyUI-BlenderAI-node installed in Blender, this whole family of nodes has no reason to exist.

    CategoryOpenPose

    Inputs (2)

    NameTypeDefaultDescription
    imageSTRING
    frameINT0-2147483648–2147483648

    Outputs (2)

    NameTypeDescription
    IMAGEIMAGE
    MASKMASK