diff --git a/bin/meshroom_photogrammetry b/bin/meshroom_photogrammetry index 966c81d7..8ad506db 100755 --- a/bin/meshroom_photogrammetry +++ b/bin/meshroom_photogrammetry @@ -6,14 +6,14 @@ 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.') -parser.add_argument('--input', metavar='FOLDER', type=str, +parser.add_argument('--input', metavar='FOLDER_OR_SFM', type=str, 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='*', + default=[], help='Input images.') parser.add_argument('--output', metavar='FOLDER', type=str, required=True, 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.') 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) -else: - graph = multiview.photogrammetry(inputFolder=args.input, inputImages=args.inputImages, output=args.output) +views, intrinsics = [], [] +# Build image files list from inputImages arguments +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 +cameraInit = graph.findNode('CameraInit') +views, intrinsics = cameraInit.nodeDesc.buildIntrinsics(cameraInit, images) +cameraInit.viewpoints.value = views +cameraInit.intrinsics.value = intrinsics + if args.save: graph.save(args.save) print('File successfully saved:', args.save) diff --git a/meshroom/multiview.py b/meshroom/multiview.py index ef4d320d..307a4f1a 100644 --- a/meshroom/multiview.py +++ b/meshroom/multiview.py @@ -27,12 +27,11 @@ def findImageFiles(folder): 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. Args: - inputFolder (str, optional): folder containing image files inputImages (list of str, optional): list of image file paths inputViewpoints (list of Viewpoint, optional): list of Viewpoints output (str, optional): the path to export reconstructed model to @@ -44,15 +43,9 @@ def photogrammetry(inputFolder='', inputImages=(), inputViewpoints=(), inputIntr with GraphModification(graph): sfmNodes, mvsNodes = photogrammetryPipeline(graph) cameraInit = sfmNodes[0] - if inputFolder: - images = findImageFiles(inputFolder) - cameraInit.viewpoints.extend([{'path': image} for image in images]) - if inputImages: - cameraInit.viewpoints.extend([{'path': image} for image in inputImages]) - if inputViewpoints: - cameraInit.viewpoints.extend(inputViewpoints) - if inputIntrinsics: - cameraInit.intrinsics.extend(inputIntrinsics) + cameraInit.viewpoints.extend([{'path': image} for image in inputImages]) + cameraInit.viewpoints.extend(inputViewpoints) + cameraInit.intrinsics.extend(inputIntrinsics) if output: texturing = mvsNodes[-1]