[bin][photogrammetry] initialize CameraInit node using 'buildIntrinsics'

* build the complete image files list in meshroom_photogrammetry from input arguments
* initialize CameraInit with input sfm data (views/intrinsics) if any
* call buildIntrinsics with the resolved input images list
This commit is contained in:
Yann Lanthony 2019-01-29 15:06:58 +01:00
parent c6a3f0d587
commit 44371211d5
2 changed files with 25 additions and 21 deletions

View file

@ -6,14 +6,14 @@ import meshroom
meshroom.setupEnvironment() meshroom.setupEnvironment()
import meshroom.core.graph import meshroom.core.graph
from meshroom.nodes.aliceVision.CameraInit import readSfMData
from meshroom import multiview from meshroom import multiview
parser = argparse.ArgumentParser(description='Launch the full photogrammetry pipeline.') parser = argparse.ArgumentParser(description='Launch the full photogrammetry pipeline.')
parser.add_argument('--input', metavar='FOLDER', type=str, parser.add_argument('--input', metavar='FOLDER_OR_SFM', type=str,
default='', default='',
help='Input folder or json file.') help='Input folder with images or SfM file (.sfm, .json).')
parser.add_argument('--inputImages', metavar='IMAGES', type=str, nargs='*', parser.add_argument('--inputImages', metavar='IMAGES', type=str, nargs='*',
default=[],
help='Input images.') help='Input images.')
parser.add_argument('--output', metavar='FOLDER', type=str, required=True, parser.add_argument('--output', metavar='FOLDER', type=str, required=True,
help='Output folder.') help='Output folder.')
@ -45,17 +45,28 @@ if not args.input and not args.inputImages:
print('Nothing to compute. You need to set --input or --inputImages.') print('Nothing to compute. You need to set --input or --inputImages.')
exit(1) exit(1)
if args.input and os.path.isfile(args.input):
views, intrinsics = readSfMData(args.input)
# print(views)
# print(intrinsics)
graph = multiview.photogrammetry(inputViewpoints=views, inputIntrinsics=intrinsics, inputImages=args.inputImages, output=args.output) views, intrinsics = [], []
else: # Build image files list from inputImages arguments
graph = multiview.photogrammetry(inputFolder=args.input, inputImages=args.inputImages, output=args.output) images = [f for f in args.inputImages if multiview.isImageFile(f)]
if os.path.isdir(args.input):
# args.input is a folder: extend images list with images in that folder
images += multiview.findImageFiles(args.input)
elif os.path.isfile(args.input) and os.path.splitext(args.input)[-1] in ('.json', '.sfm'):
# args.input is a sfmData file: setup pre-calibrated views and intrinsics
from meshroom.nodes.aliceVision.CameraInit import readSfMData
views, intrinsics = readSfMData(args.input)
graph = multiview.photogrammetry(inputViewpoints=views, inputIntrinsics=intrinsics, output=args.output)
graph.findNode('DepthMap_1').downscale.value = args.scale graph.findNode('DepthMap_1').downscale.value = args.scale
cameraInit = graph.findNode('CameraInit')
views, intrinsics = cameraInit.nodeDesc.buildIntrinsics(cameraInit, images)
cameraInit.viewpoints.value = views
cameraInit.intrinsics.value = intrinsics
if args.save: if args.save:
graph.save(args.save) graph.save(args.save)
print('File successfully saved:', args.save) print('File successfully saved:', args.save)

View file

@ -27,12 +27,11 @@ def findImageFiles(folder):
return [os.path.join(folder, filename) for filename in os.listdir(folder) if isImageFile(filename)] return [os.path.join(folder, filename) for filename in os.listdir(folder) if isImageFile(filename)]
def photogrammetry(inputFolder='', inputImages=(), inputViewpoints=(), inputIntrinsics=(), output=''): def photogrammetry(inputImages=list(), inputViewpoints=list(), inputIntrinsics=list(), output=''):
""" """
Create a new Graph with a complete photogrammetry pipeline. Create a new Graph with a complete photogrammetry pipeline.
Args: Args:
inputFolder (str, optional): folder containing image files
inputImages (list of str, optional): list of image file paths inputImages (list of str, optional): list of image file paths
inputViewpoints (list of Viewpoint, optional): list of Viewpoints inputViewpoints (list of Viewpoint, optional): list of Viewpoints
output (str, optional): the path to export reconstructed model to output (str, optional): the path to export reconstructed model to
@ -44,15 +43,9 @@ def photogrammetry(inputFolder='', inputImages=(), inputViewpoints=(), inputIntr
with GraphModification(graph): with GraphModification(graph):
sfmNodes, mvsNodes = photogrammetryPipeline(graph) sfmNodes, mvsNodes = photogrammetryPipeline(graph)
cameraInit = sfmNodes[0] cameraInit = sfmNodes[0]
if inputFolder: cameraInit.viewpoints.extend([{'path': image} for image in inputImages])
images = findImageFiles(inputFolder) cameraInit.viewpoints.extend(inputViewpoints)
cameraInit.viewpoints.extend([{'path': image} for image in images]) cameraInit.intrinsics.extend(inputIntrinsics)
if inputImages:
cameraInit.viewpoints.extend([{'path': image} for image in inputImages])
if inputViewpoints:
cameraInit.viewpoints.extend(inputViewpoints)
if inputIntrinsics:
cameraInit.intrinsics.extend(inputIntrinsics)
if output: if output:
texturing = mvsNodes[-1] texturing = mvsNodes[-1]