DINOv3 Point Collector
Click the thing, right-click the not-thing
- image
- positive_points
- negative_points
This is the node that makes the pack worth installing. DINOv3 Point Collector is the interactive front-end: you feed it an image, it shows you the image on a little canvas right on the node, and you click to say "this thing" and right-click to say "not this thing." Out the other side come clean, normalized point prompts in a format SAM3 understands - which is exactly what you need when you want to say "everything in this image that looks like that," not just "the left third."
It sits upstream of the whole pipeline. Click your points here, then feed the positive_points and negative_points outputs into DINOv3 Process's optional inputs to get per-point similarity heatmaps, or hand them to SAM3 segmentation nodes for actual masks. If you've used SAM or SAM3's point prompting in ComfyUI, the mental model is identical - this pack just borrows the same SAM3_POINTS_PROMPT data structure so the pieces fit.
How it works
Half of this node is JavaScript. The pack ships a web/dinov3_point_widget.js that registers a custom canvas on the node: left-click adds a positive point (green), right-click adds a negative point (red), right-click on an existing point deletes it, and a Clear All button resets everything. Every click is serialized into three STRING widgets - coordinates, neg_coordinates, and points_store - which the widget then hides so you never see them.
When the workflow runs, the Python side parses those JSON strings, normalizes pixel coordinates to 0–1, and builds two SAM3-compatible dicts of {points, labels}, where positive points get label 1 and negative points label 0. It also base64-encodes the input image and pushes it back to the widget in the node's ui payload - that's how the canvas gets its picture. The node is marked as an output node, so it always executes even if nothing downstream needs the result.
The inputs and outputs you care about
- image - connect your loaded image here. It's the only input you touch; the three string widgets (
coordinates,neg_coordinates,points_store) are internal storage that the widget fills in and hides. - positive_points (SAM3_POINTS_PROMPT) - the green clicks, label 1.
- negative_points (SAM3_POINTS_PROMPT) - the red clicks, label 0.
A couple of gotchas
- Run the workflow once before clicking. The canvas only shows your image after the node has executed and pushed the base64 image back to the widget. Wire it up, hit queue, let it run once, then click. Trying to click an empty grey canvas gets you nothing.
- Points persist. Your clicks live in the hidden widgets, so they stick around across runs until you Clear All. That's usually what you want - you don't want to re-click every time - but it also means the collector keeps firing stale points if you swap the input image without clearing.
Install
Same as the rest of the pack, and the dinov3 source clone is required even if you only want this node, because the loader needs it:
cd ComfyUI/custom_nodes
git clone https://github.com/xuheyao/comfyui-dinov3-point-prompt
cd comfyui-dinov3-point-prompt
git clone https://github.com/facebookresearch/dinov3
Restart ComfyUI, and grab the DINOv3 checkpoint (gated on Hugging Face - accept the terms on the model card before the download link works). This is a one-commit pack from December 2025, so the widget is basic - no drag-to-delete, no zoom - but for clicking a handful of points it does the job without ceremony.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | Input image to display for point selection | |
| points_store | STRING | {} | Internal storage for points |
| coordinates | STRING | [] | Click coordinates in JSON format |
| neg_coordinates | STRING | [] | Negative point coordinates in JSON format |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| positive_points | SAM3_POINTS_PROMPT | — |
| negative_points | SAM3_POINTS_PROMPT | — |