Meshroom/meshroom/nodes/aliceVision/Split360Images.py
2024-09-12 10:54:18 +02:00

145 lines
5.1 KiB
Python

__version__ = "3.0"
from meshroom.core import desc
from meshroom.core.utils import VERBOSE_LEVEL
class Split360InputNodeSize(desc.DynamicNodeSize):
'''
The Split360Images will increase the amount of views in the SfMData.
This class converts the number of input views into the number of split output views.
'''
def computeSize(self, node):
s = super(Split360InputNodeSize, self).computeSize(node)
factor = 0
mode = node.attribute('splitMode')
if mode.value == 'equirectangular':
factor = node.attribute('equirectangularGroup.equirectangularNbSplits').value
elif mode.value == 'dualfisheye':
factor = 2
return s * factor
class Split360Images(desc.AVCommandLineNode):
commandLine = 'aliceVision_split360Images {allParams}'
size = Split360InputNodeSize('input')
category = 'Utils'
documentation = "This node is used to extract multiple images from equirectangular or dualfisheye images."
inputs = [
desc.File(
name="input",
label="Input",
description="Single image, image folder or SfMData file.",
value="",
),
desc.ChoiceParam(
name="splitMode",
label="Split Mode",
description="Split mode (equirectangular, dualfisheye).",
value="equirectangular",
values=["equirectangular", "dualfisheye"],
exclusive=True,
),
desc.GroupAttribute(
name="dualFisheyeGroup",
label="Dual Fisheye",
description="Dual Fisheye.",
group=None,
enabled=lambda node: node.splitMode.value == "dualfisheye",
groupDesc=[
desc.ChoiceParam(
name="dualFisheyeOffsetPresetX",
label="X Offset Preset",
description="Dual-Fisheye X offset preset.",
value="center",
values=["center", "left", "right"],
exclusive=True,
),
desc.ChoiceParam(
name="dualFisheyeOffsetPresetY",
label="Y Offset Preset",
description="Dual-Fisheye Y offset preset.",
value="center",
values=["center", "top", "bottom"],
exclusive=True,
),
desc.ChoiceParam(
name="dualFisheyeCameraModel",
label="Camera Model",
description="Dual-Fisheye camera model.",
value="fisheye4",
values=["fisheye4", "equidistant_r3"],
exclusive=True,
),
],
),
desc.GroupAttribute(
name="equirectangularGroup",
label="Equirectangular",
description="Equirectangular",
group=None,
enabled=lambda node: node.splitMode.value == "equirectangular",
groupDesc=[
desc.IntParam(
name="equirectangularNbSplits",
label="Nb Splits",
description="Equirectangular number of splits.",
value=2,
range=(1, 100, 1),
),
desc.IntParam(
name="equirectangularSplitResolution",
label="Split Resolution",
description="Equirectangular split resolution.",
value=1200,
range=(100, 10000, 1),
),
desc.BoolParam(
name="equirectangularPreviewMode",
label="Preview Mode",
description="Export a SVG file that simulates the split.",
value=False,
),
desc.FloatParam(
name="fov",
label="Field Of View",
description="Field of View to extract (in degrees).",
value=110.0,
range=(0.0, 180.0, 1.0),
),
],
),
desc.ChoiceParam(
name="extension",
label="Output File Extension",
description="Output image file extension.",
value="",
values=["", "exr", "jpg", "tiff", "png"],
exclusive=True,
),
desc.ChoiceParam(
name="verboseLevel",
label="Verbose Level",
description="Verbosity level (fatal, error, warning, info, debug, trace).",
values=VERBOSE_LEVEL,
value="info",
exclusive=True,
),
]
outputs = [
desc.File(
name="output",
label="Folder",
description="Output folder for extracted frames.",
value=desc.Node.internalFolder,
),
desc.File(
name="outSfMData",
label="SfMData File",
description="Output SfMData file.",
value=desc.Node.internalFolder + "rig.sfm",
),
]