- 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>
853 lines
15 KiB
JSON
853 lines
15 KiB
JSON
{
|
||
"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
|
||
}
|