- 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>
332 lines
6.2 KiB
JSON
332 lines
6.2 KiB
JSON
{
|
|
"id": "de69fe58-2f01-4527-92b1-681a151b1ce3",
|
|
"revision": 0,
|
|
"last_node_id": 8,
|
|
"last_link_id": 8,
|
|
"nodes": [
|
|
{
|
|
"id": 3,
|
|
"type": "LoadImage",
|
|
"pos": [
|
|
-897.7078247070312,
|
|
314.2335205078125
|
|
],
|
|
"size": [
|
|
315,
|
|
314
|
|
],
|
|
"flags": {},
|
|
"order": 0,
|
|
"mode": 0,
|
|
"inputs": [],
|
|
"outputs": [
|
|
{
|
|
"localized_name": "IMAGE",
|
|
"name": "IMAGE",
|
|
"type": "IMAGE",
|
|
"links": [
|
|
2
|
|
]
|
|
},
|
|
{
|
|
"localized_name": "MASK",
|
|
"name": "MASK",
|
|
"type": "MASK",
|
|
"links": null
|
|
}
|
|
],
|
|
"properties": {
|
|
"Node name for S&R": "LoadImage"
|
|
},
|
|
"widgets_values": [
|
|
"camera_example_pinhole.jpg",
|
|
"image",
|
|
""
|
|
]
|
|
},
|
|
{
|
|
"id": 1,
|
|
"type": "TransformToMatrix",
|
|
"pos": [
|
|
-871.939697265625,
|
|
694.5091552734375
|
|
],
|
|
"size": [
|
|
315,
|
|
154
|
|
],
|
|
"flags": {},
|
|
"order": 1,
|
|
"mode": 0,
|
|
"inputs": [],
|
|
"outputs": [
|
|
{
|
|
"localized_name": "MAT_4X4",
|
|
"name": "MAT_4X4",
|
|
"type": "MAT_4X4",
|
|
"links": [
|
|
5
|
|
]
|
|
}
|
|
],
|
|
"properties": {
|
|
"Node name for S&R": "TransformToMatrix"
|
|
},
|
|
"widgets_values": [
|
|
0,
|
|
0,
|
|
0,
|
|
60,
|
|
0
|
|
],
|
|
"title": "Rotate camera (pitch 60°)"
|
|
},
|
|
{
|
|
"id": 6,
|
|
"type": "MaskToImage",
|
|
"pos": [
|
|
-169.98599243164062,
|
|
763.4010009765625
|
|
],
|
|
"size": [
|
|
264.5999755859375,
|
|
26
|
|
],
|
|
"flags": {},
|
|
"order": 4,
|
|
"mode": 0,
|
|
"inputs": [
|
|
{
|
|
"localized_name": "mask",
|
|
"name": "mask",
|
|
"type": "MASK",
|
|
"link": 6
|
|
}
|
|
],
|
|
"outputs": [
|
|
{
|
|
"localized_name": "IMAGE",
|
|
"name": "IMAGE",
|
|
"type": "IMAGE",
|
|
"links": [
|
|
7
|
|
]
|
|
}
|
|
],
|
|
"properties": {
|
|
"Node name for S&R": "MaskToImage"
|
|
}
|
|
},
|
|
{
|
|
"id": 4,
|
|
"type": "PreviewImage",
|
|
"pos": [
|
|
299.262451171875,
|
|
609.4740600585938
|
|
],
|
|
"size": [
|
|
210,
|
|
246
|
|
],
|
|
"flags": {},
|
|
"order": 5,
|
|
"mode": 0,
|
|
"inputs": [
|
|
{
|
|
"localized_name": "images",
|
|
"name": "images",
|
|
"type": "IMAGE",
|
|
"link": 7
|
|
}
|
|
],
|
|
"outputs": [],
|
|
"properties": {
|
|
"Node name for S&R": "PreviewImage"
|
|
},
|
|
"widgets_values": [
|
|
""
|
|
],
|
|
"title": "Coverage mask (white = hole)"
|
|
},
|
|
{
|
|
"id": 7,
|
|
"type": "PreviewImage",
|
|
"pos": [
|
|
-14.518107414245605,
|
|
366.5712585449219
|
|
],
|
|
"size": [
|
|
210,
|
|
246
|
|
],
|
|
"flags": {},
|
|
"order": 3,
|
|
"mode": 0,
|
|
"inputs": [
|
|
{
|
|
"localized_name": "images",
|
|
"name": "images",
|
|
"type": "IMAGE",
|
|
"link": 8
|
|
}
|
|
],
|
|
"outputs": [],
|
|
"properties": {
|
|
"Node name for S&R": "PreviewImage"
|
|
},
|
|
"widgets_values": [
|
|
""
|
|
],
|
|
"title": "Reprojected image"
|
|
},
|
|
{
|
|
"id": 2,
|
|
"type": "ReprojectImage",
|
|
"pos": [
|
|
-468.4571838378906,
|
|
358.2191467285156
|
|
],
|
|
"size": [
|
|
315,
|
|
266
|
|
],
|
|
"flags": {},
|
|
"order": 2,
|
|
"mode": 0,
|
|
"inputs": [
|
|
{
|
|
"localized_name": "image",
|
|
"name": "image",
|
|
"type": "IMAGE",
|
|
"link": 2
|
|
},
|
|
{
|
|
"localized_name": "mask",
|
|
"name": "mask",
|
|
"shape": 7,
|
|
"type": "MASK",
|
|
"link": null
|
|
},
|
|
{
|
|
"localized_name": "transform_matrix",
|
|
"name": "transform_matrix",
|
|
"shape": 7,
|
|
"type": "MAT_4X4",
|
|
"link": 5
|
|
}
|
|
],
|
|
"outputs": [
|
|
{
|
|
"localized_name": "IMAGE",
|
|
"name": "IMAGE",
|
|
"type": "IMAGE",
|
|
"links": [
|
|
8
|
|
]
|
|
},
|
|
{
|
|
"localized_name": "MASK",
|
|
"name": "MASK",
|
|
"type": "MASK",
|
|
"links": [
|
|
6
|
|
]
|
|
}
|
|
],
|
|
"properties": {
|
|
"Node name for S&R": "ReprojectImage"
|
|
},
|
|
"widgets_values": [
|
|
90,
|
|
180,
|
|
"PINHOLE",
|
|
"EQUIRECTANGULAR",
|
|
1024,
|
|
1024,
|
|
false,
|
|
7
|
|
],
|
|
"title": "Pinhole 90° → Equirect 180°"
|
|
},
|
|
{
|
|
"id": 8,
|
|
"type": "MarkdownNote",
|
|
"title": "About this workflow",
|
|
"pos": [
|
|
-1457.7078247070312,
|
|
314.2335205078125
|
|
],
|
|
"size": [
|
|
520,
|
|
314
|
|
],
|
|
"flags": {},
|
|
"order": 0,
|
|
"mode": 0,
|
|
"inputs": [],
|
|
"outputs": [],
|
|
"properties": {},
|
|
"widgets_values": [
|
|
"# Camera reprojection demo\n\nMinimal example of the two core nodes: **TransformToMatrix** rotates the virtual camera (theta = 60° pitch) and **ReprojectImage** converts a 90° pinhole image into a 180° equirectangular view.\n\nPreviews show the reprojected image and the coverage mask (white = pixels the source image cannot see).\n\n- **Set:** the image in LoadImage.\n- **Requires:** nothing beyond this pack (no models).\n- **Try:** switch `output_projection` to FISHEYE, or raise `feathering` to soften the mask edge."
|
|
],
|
|
"color": "#432",
|
|
"bgcolor": "#653"
|
|
}
|
|
],
|
|
"links": [
|
|
[
|
|
2,
|
|
3,
|
|
0,
|
|
2,
|
|
0,
|
|
"IMAGE"
|
|
],
|
|
[
|
|
5,
|
|
1,
|
|
0,
|
|
2,
|
|
2,
|
|
"MAT_4X4"
|
|
],
|
|
[
|
|
6,
|
|
2,
|
|
1,
|
|
6,
|
|
0,
|
|
"MASK"
|
|
],
|
|
[
|
|
7,
|
|
6,
|
|
0,
|
|
4,
|
|
0,
|
|
"IMAGE"
|
|
],
|
|
[
|
|
8,
|
|
2,
|
|
0,
|
|
7,
|
|
0,
|
|
"IMAGE"
|
|
]
|
|
],
|
|
"groups": [],
|
|
"config": {},
|
|
"extra": {
|
|
"ds": {
|
|
"scale": 0.8264462809917362,
|
|
"offset": [
|
|
806.6857406850668,
|
|
-309.49182798364893
|
|
]
|
|
},
|
|
"camera_comfyui_rev": 1
|
|
},
|
|
"version": 0.4
|
|
}
|