Files
Alexankharin-camera-comfyUI/workflows/PointCloud.json
T
Alexander KharinandClaude Fable 5 d77af07189 Apply workflow improvements: runnable defaults, templates, dep trim, CI
- Bundle example inputs (example_inputs/: pinhole + fisheye JPEG, example
  trajectory .npy); install.py copies them into ComfyUI's input/ folder and
  every LoadImage/LoadTrajectory default now points at them, so the shipped
  workflows queue on a fresh install.
- Template browser: add same-name .jpg thumbnails for 10 workflows
  (workflows/ is already a recognized template dir); drop the stray
  workflows/__init__.py.
- Move superseded reference graphs to workflows/legacy/ (SD-checkpoint
  outpaint variant, manual multi-view fisheye depth) - out of the template
  browser, still documented.
- video_camera.json: remove dead-end BlurMaskFast (radius 0/0 no-op),
  easy-mathInt pad math and dangling VHS_VideoInfo; swap KJNodes
  GetImageRangeFromBatch for built-in ImageFromBatch. Pack deps cut from
  five to two (VideoHelperSuite + Florence2).
- New workflows/record_trajectory.json - produces the .npy trajectory that
  PC_enricher and wan_vace_ref_to_video consume.
- Stamp extra.camera_comfyui_rev=1 in all workflows for future migrations;
  prune 8 pre-existing stale link references found by a bidirectional
  integrity sweep.
- CI: .github/workflows/validate.yml runs the schema validator,
  installer-logic tests and 4D smoke suite (CPU torch) on PRs and main.
- README + docs/workflows_review.md updated accordingly.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 18:49:14 +03:00

853 lines
15 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"id": "292f4ed4-287f-4129-9677-308e20e7b88d",
"revision": 0,
"last_node_id": 48,
"last_link_id": 94,
"nodes": [
{
"id": 25,
"type": "MedianFilterImage",
"pos": [
790.1552734375,
892.8335571289062
],
"size": [
315,
58
],
"flags": {},
"order": 10,
"mode": 0,
"inputs": [
{
"localized_name": "images",
"name": "images",
"type": "IMAGE",
"link": 63
}
],
"outputs": [
{
"localized_name": "IMAGE",
"name": "IMAGE",
"type": "IMAGE",
"links": [
55
]
}
],
"properties": {
"Node name for S&R": "MedianFilterImage"
},
"widgets_values": [
1
]
},
{
"id": 13,
"type": "MaskToImage",
"pos": [
362.97442626953125,
891.9749755859375
],
"size": [
264.5999755859375,
26
],
"flags": {},
"order": 11,
"mode": 0,
"inputs": [
{
"localized_name": "mask",
"name": "mask",
"type": "MASK",
"link": 64
}
],
"outputs": [
{
"localized_name": "IMAGE",
"name": "IMAGE",
"type": "IMAGE",
"links": [
24
]
}
],
"properties": {
"Node name for S&R": "MaskToImage"
},
"widgets_values": []
},
{
"id": 12,
"type": "PreviewImage",
"pos": [
385.2037658691406,
978.97412109375
],
"size": [
210,
246
],
"flags": {},
"order": 14,
"mode": 0,
"inputs": [
{
"localized_name": "images",
"name": "images",
"type": "IMAGE",
"link": 24
}
],
"outputs": [],
"properties": {
"Node name for S&R": "PreviewImage"
},
"widgets_values": [
""
]
},
{
"id": 18,
"type": "DepthToPointCloud",
"pos": [
-891.0863647460938,
780.7223510742188
],
"size": [
315,
170
],
"flags": {},
"order": 4,
"mode": 0,
"inputs": [
{
"localized_name": "image",
"name": "image",
"type": "IMAGE",
"link": 41
},
{
"localized_name": "depthmap",
"name": "depthmap",
"shape": 7,
"type": "TENSOR",
"link": 83
},
{
"localized_name": "mask",
"name": "mask",
"shape": 7,
"type": "IMAGE",
"link": null
}
],
"outputs": [
{
"localized_name": "pointcloud",
"name": "pointcloud",
"type": "TENSOR",
"links": [
42
]
}
],
"properties": {
"Node name for S&R": "DepthToPointCloud"
},
"widgets_values": [
"PINHOLE",
90,
1,
false
]
},
{
"id": 1,
"type": "LoadImage",
"pos": [
-1330.402099609375,
771.2842407226562
],
"size": [
315,
314
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"localized_name": "IMAGE",
"name": "IMAGE",
"type": "IMAGE",
"links": [
41,
73
]
},
{
"localized_name": "MASK",
"name": "MASK",
"type": "MASK",
"links": null
}
],
"properties": {
"Node name for S&R": "LoadImage"
},
"widgets_values": [
"camera_example_pinhole.jpg",
"image",
""
]
},
{
"id": 40,
"type": "PreviewImage",
"pos": [
-306.9321594238281,
1326.0035400390625
],
"size": [
210,
246
],
"flags": {},
"order": 7,
"mode": 0,
"inputs": [
{
"localized_name": "images",
"name": "images",
"type": "IMAGE",
"link": 79
}
],
"outputs": [],
"properties": {
"Node name for S&R": "PreviewImage"
},
"widgets_values": [
""
]
},
{
"id": 44,
"type": "PreviewImage",
"pos": [
178.53634643554688,
1371.2279052734375
],
"size": [
210,
246
],
"flags": {},
"order": 15,
"mode": 0,
"inputs": [
{
"localized_name": "images",
"name": "images",
"type": "IMAGE",
"link": 81
}
],
"outputs": [],
"properties": {
"Node name for S&R": "PreviewImage"
},
"widgets_values": [
""
]
},
{
"id": 42,
"type": "DepthToImageNode",
"pos": [
-718.5648803710938,
1373.0740966796875
],
"size": [
315,
58
],
"flags": {},
"order": 5,
"mode": 0,
"inputs": [
{
"localized_name": "depth",
"name": "depth",
"type": "TENSOR",
"link": 84
}
],
"outputs": [
{
"localized_name": "depth image",
"name": "depth image",
"type": "IMAGE",
"links": [
79
]
}
],
"properties": {
"Node name for S&R": "DepthToImageNode"
},
"widgets_values": [
false
]
},
{
"id": 6,
"type": "TransformToMatrix",
"pos": [
-781.2627563476562,
990.2046508789062
],
"size": [
315,
154
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [
{
"localized_name": "transformation matrix",
"name": "transformation matrix",
"type": "MAT_4X4",
"links": [
17
]
}
],
"properties": {
"Node name for S&R": "TransformToMatrix"
},
"widgets_values": [
-0.1,
0,
0,
0,
20
],
"title": "Move camera (dolly −0.1, yaw 20°)"
},
{
"id": 26,
"type": "PreviewImage",
"pos": [
646.3743896484375,
1141.113525390625
],
"size": [
210,
246
],
"flags": {},
"order": 13,
"mode": 0,
"inputs": [
{
"localized_name": "images",
"name": "images",
"type": "IMAGE",
"link": 55
}
],
"outputs": [],
"properties": {
"Node name for S&R": "PreviewImage"
},
"widgets_values": [
""
]
},
{
"id": 9,
"type": "TransformPointCloud",
"pos": [
-525.5206298828125,
787.8363647460938
],
"size": [
329.20001220703125,
46
],
"flags": {},
"order": 6,
"mode": 0,
"inputs": [
{
"localized_name": "pointcloud",
"name": "pointcloud",
"type": "TENSOR",
"link": 42
},
{
"localized_name": "transform_matrix",
"name": "transform_matrix",
"type": "MAT_4X4",
"link": 17
}
],
"outputs": [
{
"localized_name": "transformed pointcloud",
"name": "transformed pointcloud",
"type": "TENSOR",
"links": [
91
]
}
],
"properties": {
"Node name for S&R": "TransformPointCloud"
},
"widgets_values": []
},
{
"id": 45,
"type": "ZDepthToRayDepthNode",
"pos": [
-662.71435546875,
1212.8341064453125
],
"size": [
315,
58
],
"flags": {},
"order": 3,
"mode": 0,
"inputs": [
{
"localized_name": "depth",
"name": "depth",
"type": "TENSOR",
"link": 82
}
],
"outputs": [
{
"localized_name": "ray depth",
"name": "ray depth",
"type": "TENSOR",
"links": [
83,
84
]
}
],
"properties": {
"Node name for S&R": "ZDepthToRayDepthNode"
},
"widgets_values": [
90
]
},
{
"id": 47,
"type": "PointCloudCleaner",
"pos": [
-389.03436279296875,
960.119384765625
],
"size": [
367.79998779296875,
106
],
"flags": {},
"order": 8,
"mode": 0,
"inputs": [
{
"localized_name": "pointcloud",
"name": "pointcloud",
"type": "TENSOR",
"link": 91
}
],
"outputs": [
{
"localized_name": "cleaned pointcloud",
"name": "cleaned pointcloud",
"type": "TENSOR",
"links": [
94
]
}
],
"properties": {
"Node name for S&R": "PointCloudCleaner"
},
"widgets_values": [
1024,
1024,
1.0,
3
],
"title": "Drop stretched/occluded points"
},
{
"id": 43,
"type": "DepthToImageNode",
"pos": [
24.43135643005371,
1078.6661376953125
],
"size": [
315,
58
],
"flags": {},
"order": 12,
"mode": 0,
"inputs": [
{
"localized_name": "depth",
"name": "depth",
"type": "TENSOR",
"link": 80
}
],
"outputs": [
{
"localized_name": "depth image",
"name": "depth image",
"type": "IMAGE",
"links": [
81
]
}
],
"properties": {
"Node name for S&R": "DepthToImageNode"
},
"widgets_values": [
true
],
"title": "Novel-view depth → image"
},
{
"id": 38,
"type": "DepthEstimatorNode",
"pos": [
-1069.3040771484375,
1213.5390625
],
"size": [
315,
82
],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [
{
"localized_name": "image",
"name": "image",
"type": "IMAGE",
"link": 73
}
],
"outputs": [
{
"localized_name": "depth tensor",
"name": "depth tensor",
"type": "TENSOR",
"links": [
82
]
}
],
"properties": {
"Node name for S&R": "DepthEstimatorNode"
},
"widgets_values": [
"Depth-Anything-V2-Metric-Indoor-Base-hf",
0.10000000000000002,
1
]
},
{
"id": 31,
"type": "ProjectPointCloud",
"pos": [
-145.65357971191406,
660.8858032226562
],
"size": [
315,
218
],
"flags": {},
"order": 9,
"mode": 0,
"inputs": [
{
"localized_name": "pointcloud",
"name": "pointcloud",
"type": "TENSOR",
"link": 94
}
],
"outputs": [
{
"localized_name": "image",
"name": "image",
"type": "IMAGE",
"links": [
63
]
},
{
"localized_name": "mask",
"name": "mask",
"type": "MASK",
"links": [
64
]
},
{
"localized_name": "depth tensor",
"name": "depth tensor",
"type": "TENSOR",
"links": [
80
]
}
],
"properties": {
"Node name for S&R": "ProjectPointCloud"
},
"widgets_values": [
"PINHOLE",
90,
1024,
1024,
2,
false
],
"title": "Render novel view"
},
{
"id": 48,
"type": "MarkdownNote",
"title": "About this workflow",
"pos": [
-1890.402099609375,
660.8858032226562
],
"size": [
520,
314
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [],
"properties": {},
"widgets_values": [
"# Single image → point cloud → novel view\n\nLifts one pinhole image to a 3D point cloud via monocular metric depth, moves the camera, cleans occlusion artifacts and re-renders from the new viewpoint.\n\nStages: DepthEstimator → ZDepthToRayDepth → DepthToPointCloud → TransformPointCloud (dolly −0.1, yaw 20°) → PointCloudCleaner → ProjectPointCloud. MedianFilterImage smooths the re-render (from ComfyUI-Image-Filters, optional).\n\n- **Set:** input image; the camera move in TransformToMatrix.\n- **Requires:** Depth-Anything V2 (auto-download); ComfyUI-Image-Filters only for the median-filter preview.\n- **Note:** PointCloudCleaner params were reset to defaults during the 2026-07 schema migration — retune voxel_size / min_points_per_voxel if the render looks too sparse."
],
"color": "#432",
"bgcolor": "#653"
}
],
"links": [
[
17,
6,
0,
9,
1,
"MAT_4X4"
],
[
24,
13,
0,
12,
0,
"IMAGE"
],
[
41,
1,
0,
18,
0,
"IMAGE"
],
[
42,
18,
0,
9,
0,
"TENSOR"
],
[
55,
25,
0,
26,
0,
"IMAGE"
],
[
63,
31,
0,
25,
0,
"IMAGE"
],
[
64,
31,
1,
13,
0,
"MASK"
],
[
73,
1,
0,
38,
0,
"IMAGE"
],
[
79,
42,
0,
40,
0,
"IMAGE"
],
[
80,
31,
2,
43,
0,
"TENSOR"
],
[
81,
43,
0,
44,
0,
"IMAGE"
],
[
82,
38,
0,
45,
0,
"TENSOR"
],
[
83,
45,
0,
18,
1,
"TENSOR"
],
[
84,
45,
0,
42,
0,
"TENSOR"
],
[
91,
9,
0,
47,
0,
"TENSOR"
],
[
94,
47,
0,
31,
0,
"TENSOR"
]
],
"groups": [
{
"id": 1,
"title": "1. Image → metric ray depth",
"bounding": [
-1350.402099609375,
711.2842407226562,
1273.4699401855469,
880.7192993164062
],
"color": "#3f789e",
"font_size": 24,
"flags": {}
},
{
"id": 2,
"title": "2. Lift to 3D & move camera",
"bounding": [
-911.0863647460938,
720.7223510742188,
909.8519897460938,
443.4822998046875
],
"color": "#a1309b",
"font_size": 24,
"flags": {}
},
{
"id": 3,
"title": "3. Novel view & previews",
"bounding": [
-165.65357971191406,
600.8858032226562,
1290.808853149414,
1036.3421020507812
],
"color": "#8A8",
"font_size": 24,
"flags": {}
}
],
"config": {},
"extra": {
"ds": {
"scale": 0.8390545288824046,
"offset": [
434.57054047420326,
-733.2415275094336
]
},
"camera_comfyui_rev": 1
},
"version": 0.4
}