mirror of
https://github.com/alicevision/Meshroom.git
synced 2025-06-07 05:12:00 +02:00
[ui] Several nodes can hold the SfM
StructureFromMotion, StructureFromMotion, PanoramaEstimation, SfMTransfer, SfMTransform, SfMAlignment, GlobalSfM
This commit is contained in:
parent
c3ae491bac
commit
bcc7fc4123
1 changed files with 16 additions and 16 deletions
|
@ -382,6 +382,9 @@ def parseSfMJsonFile(sfmJsonFile):
|
||||||
return views, poses, intrinsics
|
return views, poses, intrinsics
|
||||||
|
|
||||||
|
|
||||||
|
sfmHolderNodeTypes = ["StructureFromMotion", "GlobalSfM", "PanoramaEstimation", "SfMTransfer", "SfMTransform", "SfMAlignment"]
|
||||||
|
|
||||||
|
|
||||||
class Reconstruction(UIGraph):
|
class Reconstruction(UIGraph):
|
||||||
"""
|
"""
|
||||||
Specialization of a UIGraph designed to manage a 3D reconstruction.
|
Specialization of a UIGraph designed to manage a 3D reconstruction.
|
||||||
|
@ -530,9 +533,6 @@ class Reconstruction(UIGraph):
|
||||||
|
|
||||||
self.setSfm(self.lastSfmNode())
|
self.setSfm(self.lastSfmNode())
|
||||||
|
|
||||||
if not self.sfm:
|
|
||||||
self.sfm = self.lastNodeOfType("PanoramaEstimation", self._cameraInit, Status.SUCCESS)
|
|
||||||
|
|
||||||
# TODO: listen specifically for cameraInit creation/deletion
|
# TODO: listen specifically for cameraInit creation/deletion
|
||||||
self._graph.nodes.countChanged.connect(self.updateCameraInits)
|
self._graph.nodes.countChanged.connect(self.updateCameraInits)
|
||||||
|
|
||||||
|
@ -569,19 +569,19 @@ class Reconstruction(UIGraph):
|
||||||
|
|
||||||
def updateFeatureExtraction(self):
|
def updateFeatureExtraction(self):
|
||||||
""" Set the current FeatureExtraction node based on the current CameraInit node. """
|
""" Set the current FeatureExtraction node based on the current CameraInit node. """
|
||||||
self.featureExtraction = self.lastNodeOfType('FeatureExtraction', self.cameraInit) if self.cameraInit else None
|
self.featureExtraction = self.lastNodeOfType(['FeatureExtraction'], self.cameraInit) if self.cameraInit else None
|
||||||
|
|
||||||
def updateFeatureMatching(self):
|
def updateFeatureMatching(self):
|
||||||
""" Set the current FeatureMatching node based on the current CameraInit node. """
|
""" Set the current FeatureMatching node based on the current CameraInit node. """
|
||||||
self.featureMatching = self.lastNodeOfType('FeatureMatching', self.cameraInit) if self.cameraInit else None
|
self.featureMatching = self.lastNodeOfType(['FeatureMatching'], self.cameraInit) if self.cameraInit else None
|
||||||
|
|
||||||
def updateDepthMapNode(self):
|
def updateDepthMapNode(self):
|
||||||
""" Set the current FeatureExtraction node based on the current CameraInit node. """
|
""" Set the current FeatureExtraction node based on the current CameraInit node. """
|
||||||
self.depthMap = self.lastNodeOfType('DepthMapFilter', self.cameraInit) if self.cameraInit else None
|
self.depthMap = self.lastNodeOfType(['DepthMapFilter'], self.cameraInit) if self.cameraInit else None
|
||||||
|
|
||||||
def updateLdr2hdrNode(self):
|
def updateLdr2hdrNode(self):
|
||||||
""" Set the current LDR2HDR node based on the current CameraInit node. """
|
""" Set the current LDR2HDR node based on the current CameraInit node. """
|
||||||
self.ldr2hdr = self.lastNodeOfType('LDRToHDR', self.cameraInit) if self.cameraInit else None
|
self.ldr2hdr = self.lastNodeOfType(['LDRToHDR'], self.cameraInit) if self.cameraInit else None
|
||||||
|
|
||||||
@Slot()
|
@Slot()
|
||||||
def setupLDRToHDRCameraInit(self):
|
def setupLDRToHDRCameraInit(self):
|
||||||
|
@ -624,19 +624,19 @@ class Reconstruction(UIGraph):
|
||||||
|
|
||||||
def updatePanoramaInitNode(self):
|
def updatePanoramaInitNode(self):
|
||||||
""" Set the current FeatureExtraction node based on the current CameraInit node. """
|
""" Set the current FeatureExtraction node based on the current CameraInit node. """
|
||||||
self.panoramaInit = self.lastNodeOfType('PanoramaInit', self.cameraInit) if self.cameraInit else None
|
self.panoramaInit = self.lastNodeOfType(["PanoramaInit"], self.cameraInit) if self.cameraInit else None
|
||||||
|
|
||||||
def lastSfmNode(self):
|
def lastSfmNode(self):
|
||||||
""" Retrieve the last SfM node from the initial CameraInit node. """
|
""" Retrieve the last SfM node from the initial CameraInit node. """
|
||||||
return self.lastNodeOfType("StructureFromMotion", self._cameraInit, Status.SUCCESS)
|
return self.lastNodeOfType(sfmHolderNodeTypes, self._cameraInit, Status.SUCCESS)
|
||||||
|
|
||||||
def lastNodeOfType(self, nodeType, startNode, preferredStatus=None):
|
def lastNodeOfType(self, nodeTypes, startNode, preferredStatus=None):
|
||||||
"""
|
"""
|
||||||
Returns the last node of the given type starting from 'startNode'.
|
Returns the last node of the given type starting from 'startNode'.
|
||||||
If 'preferredStatus' is specified, the last node with this status will be considered in priority.
|
If 'preferredStatus' is specified, the last node with this status will be considered in priority.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
nodeType (str): the node type
|
nodeTypes (str list): the node types
|
||||||
startNode (Node): the node to start from
|
startNode (Node): the node to start from
|
||||||
preferredStatus (Status): (optional) the node status to prioritize
|
preferredStatus (Status): (optional) the node status to prioritize
|
||||||
|
|
||||||
|
@ -645,7 +645,7 @@ class Reconstruction(UIGraph):
|
||||||
"""
|
"""
|
||||||
if not startNode:
|
if not startNode:
|
||||||
return None
|
return None
|
||||||
nodes = self._graph.nodesFromNode(startNode, nodeType)[0]
|
nodes = self._graph.nodesFromNode(startNode, nodeTypes)[0]
|
||||||
if not nodes:
|
if not nodes:
|
||||||
return None
|
return None
|
||||||
node = nodes[-1]
|
node = nodes[-1]
|
||||||
|
@ -939,7 +939,7 @@ class Reconstruction(UIGraph):
|
||||||
@Slot(QObject)
|
@Slot(QObject)
|
||||||
def setActiveNodeOfType(self, node):
|
def setActiveNodeOfType(self, node):
|
||||||
""" Set node as the active node of its type. """
|
""" Set node as the active node of its type. """
|
||||||
if node.nodeType == "StructureFromMotion" or node.nodeType == "PanoramaEstimation":
|
if node.nodeType in sfmHolderNodeTypes:
|
||||||
self.sfm = node
|
self.sfm = node
|
||||||
elif node.nodeType == "FeatureExtraction":
|
elif node.nodeType == "FeatureExtraction":
|
||||||
self.featureExtraction = node
|
self.featureExtraction = node
|
||||||
|
@ -960,7 +960,7 @@ class Reconstruction(UIGraph):
|
||||||
"""
|
"""
|
||||||
Update internal views, poses and solved intrinsics based on the current SfM node.
|
Update internal views, poses and solved intrinsics based on the current SfM node.
|
||||||
"""
|
"""
|
||||||
if not self._sfm:
|
if not self._sfm or ('outputViewsAndPoses' not in self._sfm.getAttributes().keys()):
|
||||||
self._views = dict()
|
self._views = dict()
|
||||||
self._poses = dict()
|
self._poses = dict()
|
||||||
self._solvedIntrinsics = dict()
|
self._solvedIntrinsics = dict()
|
||||||
|
@ -1003,8 +1003,8 @@ class Reconstruction(UIGraph):
|
||||||
self._sfm.destroyed.disconnect(self._unsetSfm)
|
self._sfm.destroyed.disconnect(self._unsetSfm)
|
||||||
self._setSfm(node)
|
self._setSfm(node)
|
||||||
|
|
||||||
self.texturing = self.lastNodeOfType("Texturing", self._sfm, Status.SUCCESS)
|
self.texturing = self.lastNodeOfType(["Texturing"], self._sfm, Status.SUCCESS)
|
||||||
self.prepareDenseScene = self.lastNodeOfType("PrepareDenseScene", self._sfm, Status.SUCCESS)
|
self.prepareDenseScene = self.lastNodeOfType(["PrepareDenseScene"], self._sfm, Status.SUCCESS)
|
||||||
|
|
||||||
@Slot(QObject, result=bool)
|
@Slot(QObject, result=bool)
|
||||||
def isInViews(self, viewpoint):
|
def isInViews(self, viewpoint):
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue