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

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
}