Files
Alexankharin-camera-comfyUI/workflows/sbs180_workflow.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

1325 lines
22 KiB
JSON

{
"id": "4e89c8a4-594b-4d15-a089-da088966adee",
"revision": 0,
"last_node_id": 45,
"last_link_id": 87,
"nodes": [
{
"id": 30,
"type": "DepthToPointCloud",
"pos": [
2300.80615234375,
2022.771240234375
],
"size": [
315,
170
],
"flags": {},
"order": 5,
"mode": 0,
"inputs": [
{
"name": "image",
"type": "IMAGE",
"link": 45
},
{
"name": "depthmap",
"shape": 7,
"type": "TENSOR",
"link": 43
},
{
"name": "mask",
"shape": 7,
"type": "MASK",
"link": 44
}
],
"outputs": [
{
"name": "pointcloud",
"type": "TENSOR",
"links": [
48
]
}
],
"properties": {
"Node name for S&R": "DepthToPointCloud"
},
"widgets_values": [
"FISHEYE",
180,
1,
false
]
},
{
"id": 32,
"type": "TransformPointCloud",
"pos": [
2825.2060546875,
1832.0804443359375
],
"size": [
493.8000183105469,
46
],
"flags": {},
"order": 9,
"mode": 0,
"inputs": [
{
"name": "pointcloud",
"type": "TENSOR",
"link": 50
},
{
"name": "transform_matrix",
"type": "MAT_4X4",
"link": 51
}
],
"outputs": [
{
"name": "transformed pointcloud",
"type": "TENSOR",
"links": [
53
]
}
],
"properties": {
"Node name for S&R": "TransformPointCloud"
},
"widgets_values": []
},
{
"id": 28,
"type": "FisheyeDepthEstimator",
"pos": [
1827.8929443359375,
1735.1136474609375
],
"size": [
315,
246
],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [
{
"name": "image",
"type": "IMAGE",
"link": 36
}
],
"outputs": [
{
"name": "depthmap",
"type": "TENSOR",
"links": [
38,
43
]
},
{
"name": "mask",
"type": "MASK",
"links": [
44
]
}
],
"properties": {
"Node name for S&R": "FisheyeDepthEstimator"
},
"widgets_values": [
"Depth-Anything-V2-Metric-Indoor-Base-hf",
1,
90,
1024,
4096,
"DISTANCE_AWARE",
25,
1
]
},
{
"id": 17,
"type": "MaskToImage",
"pos": [
3318.493408203125,
1596.000244140625
],
"size": [
184.62362670898438,
26
],
"flags": {},
"order": 13,
"mode": 0,
"inputs": [
{
"name": "mask",
"type": "MASK",
"link": 60
}
],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": [
22
]
}
],
"properties": {
"Node name for S&R": "MaskToImage"
},
"widgets_values": []
},
{
"id": 29,
"type": "DepthToImageNode",
"pos": [
2889.773681640625,
1182.0992431640625
],
"size": [
315,
58
],
"flags": {},
"order": 4,
"mode": 0,
"inputs": [
{
"name": "depth",
"type": "TENSOR",
"link": 38
}
],
"outputs": [
{
"name": "depth image",
"type": "IMAGE",
"links": [
39
]
}
],
"properties": {
"Node name for S&R": "DepthToImageNode"
},
"widgets_values": [
false
]
},
{
"id": 5,
"type": "PreviewImage",
"pos": [
3339.436279296875,
1152.5965576171875
],
"size": [
140,
246
],
"flags": {},
"order": 7,
"mode": 0,
"inputs": [
{
"name": "images",
"type": "IMAGE",
"link": 39
}
],
"outputs": [],
"properties": {
"Node name for S&R": "PreviewImage"
},
"widgets_values": []
},
{
"id": 12,
"type": "PreviewImage",
"pos": [
3172.22607421875,
1381.792724609375
],
"size": [
140,
246
],
"flags": {},
"order": 11,
"mode": 0,
"inputs": [
{
"name": "images",
"type": "IMAGE",
"link": 54
}
],
"outputs": [],
"properties": {
"Node name for S&R": "PreviewImage"
},
"widgets_values": []
},
{
"id": 20,
"type": "PreviewImage",
"pos": [
4084.4384765625,
1416.01318359375
],
"size": [
140,
246.0001220703125
],
"flags": {},
"order": 21,
"mode": 0,
"inputs": [
{
"name": "images",
"type": "IMAGE",
"link": 68
}
],
"outputs": [],
"properties": {
"Node name for S&R": "PreviewImage"
},
"widgets_values": []
},
{
"id": 39,
"type": "PreviewImage",
"pos": [
3710.058837890625,
1380.8360595703125
],
"size": [
140,
246
],
"flags": {},
"order": 19,
"mode": 0,
"inputs": [
{
"name": "images",
"type": "IMAGE",
"link": 83
}
],
"outputs": [],
"properties": {
"Node name for S&R": "PreviewImage"
},
"widgets_values": []
},
{
"id": 16,
"type": "InvertMask",
"pos": [
3491.69091796875,
2060.49462890625
],
"size": [
140,
26
],
"flags": {},
"order": 12,
"mode": 0,
"inputs": [
{
"name": "mask",
"type": "MASK",
"link": 55
}
],
"outputs": [
{
"name": "MASK",
"type": "MASK",
"links": [
60,
75
]
}
],
"properties": {
"Node name for S&R": "InvertMask"
},
"widgets_values": []
},
{
"id": 38,
"type": "OutpaintAnyProjection",
"pos": [
3742.106201171875,
1847.061279296875
],
"size": [
400,
492
],
"flags": {},
"order": 14,
"mode": 0,
"inputs": [
{
"name": "image",
"type": "IMAGE",
"link": 72
},
{
"name": "mask",
"shape": 7,
"type": "MASK",
"link": 75
}
],
"outputs": [
{
"name": "final_image",
"type": "IMAGE",
"links": [
77
]
},
{
"name": "needs_inpaint_mask",
"type": "MASK",
"links": [
78
]
}
],
"properties": {
"Node name for S&R": "OutpaintAnyProjection"
},
"widgets_values": [
"FISHEYE",
180,
"FISHEYE",
180,
4096,
4096,
"PINHOLE",
90,
1024,
45,
0,
"",
10,
false,
30,
1,
false
]
},
{
"id": 40,
"type": "OutpaintAnyProjection",
"pos": [
4194.630859375,
1868.2874755859375
],
"size": [
400,
492
],
"flags": {},
"order": 16,
"mode": 0,
"inputs": [
{
"name": "image",
"type": "IMAGE",
"link": 77
},
{
"name": "mask",
"shape": 7,
"type": "MASK",
"link": 78
}
],
"outputs": [
{
"name": "final_image",
"type": "IMAGE",
"links": [
79
]
},
{
"name": "needs_inpaint_mask",
"type": "MASK",
"links": [
80
]
}
],
"properties": {
"Node name for S&R": "OutpaintAnyProjection"
},
"widgets_values": [
"FISHEYE",
180,
"FISHEYE",
180,
4096,
4096,
"PINHOLE",
90,
1024,
-45,
0,
"",
10,
false,
30,
1,
false
]
},
{
"id": 41,
"type": "OutpaintAnyProjection",
"pos": [
4633.0263671875,
1854.4434814453125
],
"size": [
400,
492
],
"flags": {},
"order": 17,
"mode": 0,
"inputs": [
{
"name": "image",
"type": "IMAGE",
"link": 79
},
{
"name": "mask",
"shape": 7,
"type": "MASK",
"link": 80
}
],
"outputs": [
{
"name": "final_image",
"type": "IMAGE",
"links": [
81
]
},
{
"name": "needs_inpaint_mask",
"type": "MASK",
"links": [
82
]
}
],
"properties": {
"Node name for S&R": "OutpaintAnyProjection"
},
"widgets_values": [
"FISHEYE",
180,
"FISHEYE",
180,
4096,
4096,
"PINHOLE",
90,
1024,
0,
45,
"",
10,
false,
30,
1,
false
]
},
{
"id": 42,
"type": "OutpaintAnyProjection",
"pos": [
5052.3095703125,
1850.2620849609375
],
"size": [
400,
492
],
"flags": {},
"order": 18,
"mode": 0,
"inputs": [
{
"name": "image",
"type": "IMAGE",
"link": 81
},
{
"name": "mask",
"shape": 7,
"type": "MASK",
"link": 82
}
],
"outputs": [
{
"name": "final_image",
"type": "IMAGE",
"links": [
83,
84
]
},
{
"name": "needs_inpaint_mask",
"type": "MASK",
"links": []
}
],
"properties": {
"Node name for S&R": "OutpaintAnyProjection"
},
"widgets_values": [
"FISHEYE",
180,
"FISHEYE",
180,
4096,
4096,
"PINHOLE",
90,
1024,
0,
-45,
"",
10,
false,
30,
1,
false
]
},
{
"id": 18,
"type": "PreviewImage",
"pos": [
3533.38916015625,
1426.0350341796875
],
"size": [
140,
246
],
"flags": {},
"order": 15,
"mode": 0,
"inputs": [
{
"name": "images",
"type": "IMAGE",
"link": 22
}
],
"outputs": [],
"properties": {
"Node name for S&R": "PreviewImage"
},
"widgets_values": []
},
{
"id": 33,
"type": "TransformToMatrix",
"pos": [
2689.815185546875,
2013.3233642578125
],
"size": [
315,
154
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "transformation matrix",
"type": "MAT_4X4",
"links": [
51
]
}
],
"properties": {
"Node name for S&R": "TransformToMatrix"
},
"widgets_values": [
0.10000000000000002,
0,
0,
0,
0
],
"title": "Eye baseline (shiftX 0.1)"
},
{
"id": 31,
"type": "PointCloudCleaner",
"pos": [
2393.899169921875,
1825.4063720703125
],
"size": [
367.79998779296875,
130
],
"flags": {},
"order": 8,
"mode": 0,
"inputs": [
{
"name": "pointcloud",
"type": "TENSOR",
"link": 48
}
],
"outputs": [
{
"name": "cleaned_pointcloud",
"type": "TENSOR",
"links": [
50
]
}
],
"properties": {
"Node name for S&R": "PointCloudCleaner"
},
"widgets_values": [
1024,
1024,
1,
8
]
},
{
"id": 36,
"type": "ReprojectImage",
"pos": [
5468.1796875,
2178.5615234375
],
"size": [
430.8000183105469,
266
],
"flags": {},
"order": 20,
"mode": 0,
"inputs": [
{
"name": "image",
"type": "IMAGE",
"link": 84
},
{
"name": "mask",
"shape": 7,
"type": "MASK",
"link": null
},
{
"name": "transform_matrix",
"shape": 7,
"type": "MAT_4X4",
"link": null
}
],
"outputs": [
{
"name": "reprojected image",
"type": "IMAGE",
"links": [
68,
69
]
},
{
"name": "reprojected mask",
"type": "MASK",
"links": null
}
],
"properties": {
"Node name for S&R": "ReprojectImage"
},
"widgets_values": [
180,
180,
"FISHEYE",
"EQUIRECTANGULAR",
4096,
4096,
false,
40
]
},
{
"id": 34,
"type": "ProjectPointCloud",
"pos": [
3049.35498046875,
1952.12939453125
],
"size": [
315,
218
],
"flags": {},
"order": 10,
"mode": 0,
"inputs": [
{
"name": "pointcloud",
"type": "TENSOR",
"link": 53
}
],
"outputs": [
{
"name": "image",
"type": "IMAGE",
"links": [
54,
72
]
},
{
"name": "mask",
"type": "MASK",
"links": [
55
]
},
{
"name": "depth",
"type": "TENSOR",
"links": null
}
],
"properties": {
"Node name for S&R": "ProjectPointCloud"
},
"widgets_values": [
"FISHEYE",
180,
1024,
1024,
3,
false
]
},
{
"id": 37,
"type": "SaveImage",
"pos": [
5578.32861328125,
1834.2066650390625
],
"size": [
315,
270
],
"flags": {},
"order": 22,
"mode": 0,
"inputs": [
{
"name": "images",
"type": "IMAGE",
"link": 69
}
],
"outputs": [],
"properties": {},
"widgets_values": [
"shifted_camera_equirect"
],
"title": "Right eye (equirect)"
},
{
"id": 27,
"type": "LoadImage",
"pos": [
1489.3206787109375,
1821.21142578125
],
"size": [
315,
314
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": [
36,
45,
87
]
},
{
"name": "MASK",
"type": "MASK",
"links": null
}
],
"properties": {
"Node name for S&R": "LoadImage"
},
"widgets_values": [
"camera_example_fisheye.jpg",
"image"
]
},
{
"id": 43,
"type": "ReprojectImage",
"pos": [
5192.03466796875,
1422.08984375
],
"size": [
430.8000183105469,
266
],
"flags": {},
"order": 3,
"mode": 0,
"inputs": [
{
"name": "image",
"type": "IMAGE",
"link": 87
},
{
"name": "mask",
"shape": 7,
"type": "MASK",
"link": null
},
{
"name": "transform_matrix",
"shape": 7,
"type": "MAT_4X4",
"link": null
}
],
"outputs": [
{
"name": "reprojected image",
"type": "IMAGE",
"links": [
86
]
},
{
"name": "reprojected mask",
"type": "MASK",
"links": null
}
],
"properties": {
"Node name for S&R": "ReprojectImage"
},
"widgets_values": [
180,
180,
"FISHEYE",
"EQUIRECTANGULAR",
4096,
4096,
false,
40
]
},
{
"id": 44,
"type": "SaveImage",
"pos": [
5903.30322265625,
1833.707763671875
],
"size": [
315,
270
],
"flags": {},
"order": 6,
"mode": 0,
"inputs": [
{
"name": "images",
"type": "IMAGE",
"link": 86
}
],
"outputs": [],
"properties": {},
"widgets_values": [
"init_camera_equirect"
],
"title": "Left eye (equirect)"
},
{
"id": 45,
"type": "MarkdownNote",
"title": "About this workflow",
"pos": [
929.3206787109375,
1152.5965576171875
],
"size": [
520,
262
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [],
"properties": {},
"widgets_values": [
"# SBS VR180: synthesize the second eye\n\nFrom one 180° fisheye view, synthesizes a stereo pair: fisheye metric depth → point cloud → clean → shift the camera by the eye baseline (TransformToMatrix shiftX = 0.1) → re-project to fisheye → four chained OutpaintAnyProjection passes fill the disocclusions → both eyes are exported as 180° equirectangular images.\n\n- **Set:** fisheye input (e.g. from `Outpaint_fisheye180.json`); the baseline (0.1 ≈ 6.5 cm when depth is metric); prompts optional.\n- **Requires:** inpainting_flux (auto-installed), Depth-Anything V2.\n- **Output:** `init_camera_equirect` + `shifted_camera_equirect` — combine side-by-side for a VR180 player."
],
"color": "#432",
"bgcolor": "#653"
}
],
"links": [
[
22,
17,
0,
18,
0,
"IMAGE"
],
[
36,
27,
0,
28,
0,
"IMAGE"
],
[
38,
28,
0,
29,
0,
"TENSOR"
],
[
39,
29,
0,
5,
0,
"IMAGE"
],
[
43,
28,
0,
30,
1,
"TENSOR"
],
[
44,
28,
1,
30,
2,
"MASK"
],
[
45,
27,
0,
30,
0,
"IMAGE"
],
[
48,
30,
0,
31,
0,
"TENSOR"
],
[
50,
31,
0,
32,
0,
"TENSOR"
],
[
51,
33,
0,
32,
1,
"MAT_4X4"
],
[
53,
32,
0,
34,
0,
"TENSOR"
],
[
54,
34,
0,
12,
0,
"IMAGE"
],
[
55,
34,
1,
16,
0,
"MASK"
],
[
60,
16,
0,
17,
0,
"MASK"
],
[
68,
36,
0,
20,
0,
"IMAGE"
],
[
69,
36,
0,
37,
0,
"IMAGE"
],
[
72,
34,
0,
38,
0,
"IMAGE"
],
[
75,
16,
0,
38,
1,
"MASK"
],
[
77,
38,
0,
40,
0,
"IMAGE"
],
[
78,
38,
1,
40,
1,
"MASK"
],
[
79,
40,
0,
41,
0,
"IMAGE"
],
[
80,
40,
1,
41,
1,
"MASK"
],
[
81,
41,
0,
42,
0,
"IMAGE"
],
[
82,
41,
1,
42,
1,
"MASK"
],
[
83,
42,
0,
39,
0,
"IMAGE"
],
[
84,
42,
0,
36,
0,
"IMAGE"
],
[
86,
43,
0,
44,
0,
"IMAGE"
],
[
87,
27,
0,
43,
0,
"IMAGE"
]
],
"groups": [
{
"id": 1,
"title": "1. Fisheye metric depth",
"bounding": [
1474.8399658203125,
1625.7159423828125,
679.0551147460938,
582.09521484375
],
"color": "#3f789e",
"font_size": 24,
"flags": {}
},
{
"id": 2,
"title": "2. Point cloud & eye-baseline shift",
"bounding": [
2231.516845703125,
1746.5635986328125,
1201.385009765625,
465.3291015625
],
"color": "#3f789e",
"font_size": 24,
"flags": {}
},
{
"id": 4,
"title": "3. Outpaint disocclusions & export equirect",
"bounding": [
3721.45654296875,
1723.2581787109375,
2169.7470703125,
772.406494140625
],
"color": "#3f789e",
"font_size": 24,
"flags": {}
},
{
"id": 5,
"title": "Previews",
"bounding": [
2852.595703125,
1071.784912109375,
1400.6845703125,
617.4415893554688
],
"color": "#3f789e",
"font_size": 24,
"flags": {}
}
],
"config": {},
"extra": {
"ds": {
"scale": 1.3513057093104064,
"offset": [
-5500.948642760503,
-1811.182955009025
]
},
"frontendVersion": "1.20.4",
"camera_comfyui_rev": 1
},
"version": 0.4
}