Skip to content

Commit

Permalink
Merge pull request #2588 from alicevision/dev/sfmChecker
Browse files Browse the repository at this point in the history
[nodes] Add new `SfMChecking` node
  • Loading branch information
cbentejac authored Oct 31, 2024
2 parents 35914bd + 9ec0a17 commit c8a0008
Showing 1 changed file with 77 additions and 0 deletions.
77 changes: 77 additions & 0 deletions meshroom/nodes/aliceVision/SfMChecking.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
__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()

0 comments on commit c8a0008

Please sign in to comment.