mirror of
https://github.com/alicevision/Meshroom.git
synced 2025-06-03 11:21:52 +02:00
77 lines
2.4 KiB
Python
77 lines
2.4 KiB
Python
__version__ = "1.0"
|
|
|
|
from meshroom.core import desc
|
|
from meshroom.core.utils import VERBOSE_LEVEL
|
|
|
|
|
|
class SfMChecking(desc.Node):
|
|
|
|
category = "Utils"
|
|
documentation = """
|
|
Check an input SfM for validity.
|
|
Throw an error if the SfM does not satisfy constraints.
|
|
"""
|
|
|
|
inputs = [
|
|
desc.File(
|
|
name="input",
|
|
label="SfMData",
|
|
description="Input SfMData file.",
|
|
value="",
|
|
),
|
|
desc.FloatParam(
|
|
name="poseCompletion",
|
|
label="Completion Percentage",
|
|
description="Minimal percent of the views reconstructed.",
|
|
value=80.0,
|
|
range=(0.0, 100.0, 1.0),
|
|
),
|
|
desc.ChoiceParam(
|
|
name="verboseLevel",
|
|
label="Verbose Level",
|
|
description="Verbosity level (fatal, error, warning, info, debug, trace).",
|
|
values=VERBOSE_LEVEL,
|
|
value="info",
|
|
)
|
|
]
|
|
|
|
outputs = [
|
|
desc.File(
|
|
name="output",
|
|
label="SfM File",
|
|
description="Path to the output SfM file.",
|
|
value=desc.Node.internalFolder + "sfmData.abc",
|
|
)
|
|
]
|
|
|
|
def processChunk(self, chunk):
|
|
from pyalicevision import sfmData as avsfmdata
|
|
from pyalicevision import sfmDataIO as avsfmdataio
|
|
|
|
chunk.logManager.start(chunk.node.verboseLevel.value)
|
|
chunk.logger.info("Open input file")
|
|
|
|
data = avsfmdata.SfMData()
|
|
ret = avsfmdataio.load(data, chunk.node.input.value, avsfmdataio.ALL)
|
|
if not ret:
|
|
chunk.logger.error("Cannot open input")
|
|
chunk.logManager.end()
|
|
raise RuntimeError()
|
|
|
|
total = len(data.getViews())
|
|
valid = len(data.getValidViews())
|
|
ratio = (100.0 * float(valid)) / float(total)
|
|
|
|
chunk.logger.info(f"Total views: {total}")
|
|
chunk.logger.info(f"Reconstructed views: {valid}")
|
|
chunk.logger.info(f"Percentage of reconstructed views: {ratio}")
|
|
|
|
if ratio < chunk.node.poseCompletion.value:
|
|
chunk.logger.error("Percentage of reconstructed views is insufficient.")
|
|
chunk.logger.error(f"Expected {chunk.node.poseCompletion.value}, got {ratio}.")
|
|
chunk.logManager.end()
|
|
raise RuntimeError()
|
|
|
|
avsfmdataio.save(data, chunk.node.output.value, avsfmdataio.ALL)
|
|
|
|
chunk.logManager.end()
|