refactoring: function readSfMData() to read sfm files

This commit is contained in:
Simone Gasparini 2019-01-14 18:24:49 +01:00
parent e1c5a6c5e7
commit c0eb556eea
No known key found for this signature in database
GPG key ID: 82846D6BBE0A3362
2 changed files with 36 additions and 43 deletions

View file

@ -8,6 +8,7 @@ import meshroom
meshroom.setupEnvironment()
import meshroom.core.graph
from meshroom.nodes.aliceVision.CameraInit import readSfMData
from meshroom import multiview
parser = argparse.ArgumentParser(description='Launch the full photogrammetry pipeline.')
@ -47,27 +48,9 @@ if not args.input and not args.inputImages:
exit(1)
if args.input and os.path.isfile(args.input):
# with open(args.input) as jsonFile:
with io.open(args.input, 'r', encoding='utf-8', errors='ignore') as jsonFile:
fileData = json.load(jsonFile)
intrinsics = fileData.get("intrinsics", [])
views, intrinsics = readSfMData(args.input)
print(views)
print(intrinsics)
intrinsics = [{k: v for k, v in item.items()} for item in fileData.get("intrinsics", [])]
for intrinsic in intrinsics:
pp = intrinsic['principalPoint']
intrinsic['principalPoint'] = {}
intrinsic['principalPoint']['x'] = pp[0]
intrinsic['principalPoint']['y'] = pp[1]
# convert empty string distortionParams (i.e: Pinhole model) to empty list
if intrinsic['distortionParams'] == '':
intrinsic['distortionParams'] = list()
print(intrinsics)
# views = fileData.get("views", [])
views = [{k: v for k, v in item.items()} for item in fileData.get("views", [])]
for view in views:
view['metadata'] = json.dumps(view['metadata']) # convert metadata to string
# print(views)
graph = multiview.photogrammetry(inputViewpoints=views, inputIntrinsics=intrinsics, inputImages=args.inputImages, output=args.output)
graph.findNode('DepthMap_1').downscale.value = args.scale

View file

@ -45,6 +45,38 @@ Intrinsic = [
value=False, uid=[0]),
]
def readSfMData(sfmFile):
""" Read views and intrinsics from a .sfm file
Args:
sfmFile: the .sfm file containing views and intrinsics
Returns:
The views and intrinsics of the .sfm as two separate lists
"""
import io # use io.open for Python2/3 compatibility (allow to specify encoding + errors handling)
# skip decoding errors to avoid potential exceptions due to non utf-8 characters in images metadata
with io.open(sfmFile, 'r', encoding='utf-8', errors='ignore') as f:
data = json.load(f)
intrinsicsKeys = [i.name for i in Intrinsic]
intrinsics = [{k: v for k, v in item.items() if k in intrinsicsKeys} for item in data.get("intrinsics", [])]
for intrinsic in intrinsics:
pp = intrinsic['principalPoint']
intrinsic['principalPoint'] = {}
intrinsic['principalPoint']['x'] = pp[0]
intrinsic['principalPoint']['y'] = pp[1]
# convert empty string distortionParams (i.e: Pinhole model) to empty list
if intrinsic['distortionParams'] == '':
intrinsic['distortionParams'] = list()
print('intrinsics:', intrinsics)
viewsKeys = [v.name for v in Viewpoint]
views = [{k: v for k, v in item.items() if k in viewsKeys} for item in data.get("views", [])]
for view in views:
view['metadata'] = json.dumps(view['metadata']) # convert metadata to string
print('views:', views)
return views, intrinsics
class CameraInit(desc.CommandLineNode):
commandLine = 'aliceVision_cameraInit {allParams} --allowSingleView 1' # don't throw an error if there is only one image
@ -134,28 +166,7 @@ class CameraInit(desc.CommandLineNode):
# Reload result of aliceVision_cameraInit
cameraInitSfM = node.output.value
import io # use io.open for Python2/3 compatibility (allow to specify encoding + errors handling)
# skip decoding errors to avoid potential exceptions due to non utf-8 characters in images metadata
with io.open(cameraInitSfM, 'r', encoding='utf-8', errors='ignore') as f:
data = json.load(f)
intrinsicsKeys = [i.name for i in Intrinsic]
intrinsics = [{k: v for k, v in item.items() if k in intrinsicsKeys} for item in data.get("intrinsics", [])]
for intrinsic in intrinsics:
pp = intrinsic['principalPoint']
intrinsic['principalPoint'] = {}
intrinsic['principalPoint']['x'] = pp[0]
intrinsic['principalPoint']['y'] = pp[1]
# convert empty string distortionParams (i.e: Pinhole model) to empty list
if intrinsic['distortionParams'] == '':
intrinsic['distortionParams'] = list()
# print('intrinsics:', intrinsics)
viewsKeys = [v.name for v in Viewpoint]
views = [{k: v for k, v in item.items() if k in viewsKeys} for item in data.get("views", [])]
for view in views:
view['metadata'] = json.dumps(view['metadata']) # convert metadata to string
# print('views:', views)
return views, intrinsics
return readSfMData(cameraInitSfM)
except Exception:
raise
@ -198,4 +209,3 @@ class CameraInit(desc.CommandLineNode):
def processChunk(self, chunk):
self.createViewpointsFile(chunk.node)
desc.CommandLineNode.processChunk(self, chunk)