kopia lustrzana https://github.com/OpenDroneMap/ODM
120 wiersze
4.7 KiB
Python
120 wiersze
4.7 KiB
Python
import os
|
|
|
|
import ecto
|
|
|
|
from opendm import log
|
|
from opendm import io
|
|
from opendm import system
|
|
from opendm import context
|
|
|
|
|
|
class ODMTexturingCell(ecto.Cell):
|
|
def declare_params(self, params):
|
|
params.declare("resize", 'resizes images by the largest side', 2400)
|
|
params.declare("resolution", 'The resolution of the output textures. Must be '
|
|
'greater than textureWithSize.', 4096)
|
|
params.declare("size", 'The resolution to rescale the images performing '
|
|
'the texturing.', 3600)
|
|
params.declare("verbose", 'print additional messages to console', False)
|
|
|
|
def declare_io(self, params, inputs, outputs):
|
|
inputs.declare("tree", "Struct with paths", [])
|
|
inputs.declare("args", "The application arguments.", {})
|
|
inputs.declare("reconstruction", "Clusters output. list of ODMReconstructions", [])
|
|
outputs.declare("reconstruction", "Clusters output. list of ODMReconstructions", [])
|
|
|
|
def process(self, inputs, outputs):
|
|
|
|
# Benchmarking
|
|
start_time = system.now_raw()
|
|
|
|
log.ODM_INFO('Running ODM Texturing Cell')
|
|
|
|
# get inputs
|
|
args = self.inputs.args
|
|
tree = self.inputs.tree
|
|
verbose = '-verbose' if self.params.verbose else ''
|
|
|
|
# define paths and create working directories
|
|
system.mkdir_p(tree.odm_texturing)
|
|
if args.use_25dmesh: system.mkdir_p(tree.odm_25dtexturing)
|
|
|
|
# check if we rerun cell or not
|
|
rerun_cell = (args.rerun is not None and
|
|
args.rerun == 'odm_texturing') or \
|
|
(args.rerun_all) or \
|
|
(args.rerun_from is not None and
|
|
'odm_texturing' in args.rerun_from)
|
|
|
|
# Undistort radial distortion
|
|
if not os.path.isdir(tree.odm_texturing_undistorted_image_path) or rerun_cell:
|
|
system.run(' '.join([
|
|
'cd {} &&'.format(tree.opensfm),
|
|
'PYTHONPATH={}:{}'.format(context.pyopencv_path,
|
|
context.opensfm_path),
|
|
'python',
|
|
os.path.join(context.odm_modules_src_path,
|
|
'odm_slam/src/undistort_radial.py'),
|
|
'--output',
|
|
tree.odm_texturing_undistorted_image_path,
|
|
tree.opensfm,
|
|
]))
|
|
|
|
system.run(
|
|
'PYTHONPATH=%s %s/bin/export_bundler %s' %
|
|
(context.pyopencv_path, context.opensfm_path, tree.opensfm))
|
|
else:
|
|
log.ODM_WARNING(
|
|
'Found a valid Bundler file in: %s' %
|
|
(tree.opensfm_reconstruction))
|
|
|
|
|
|
runs = [{
|
|
'out_dir': tree.odm_texturing,
|
|
'model': tree.odm_mesh
|
|
}]
|
|
|
|
if args.use_25dmesh:
|
|
runs += [{
|
|
'out_dir': tree.odm_25dtexturing,
|
|
'model': tree.odm_25dmesh
|
|
}]
|
|
|
|
for r in runs:
|
|
odm_textured_model_obj = os.path.join(r['out_dir'], tree.odm_textured_model_obj)
|
|
|
|
if not io.file_exists(odm_textured_model_obj) or rerun_cell:
|
|
log.ODM_DEBUG('Writing ODM Textured file in: %s'
|
|
% odm_textured_model_obj)
|
|
|
|
# odm_texturing definitions
|
|
kwargs = {
|
|
'bin': context.odm_modules_path,
|
|
'out_dir': r['out_dir'],
|
|
'bundle': tree.opensfm_bundle,
|
|
'imgs_path': tree.odm_texturing_undistorted_image_path,
|
|
'imgs_list': tree.opensfm_bundle_list,
|
|
'model': r['model'],
|
|
'log': os.path.join(r['out_dir'], tree.odm_texuring_log),
|
|
'resize': self.params.resize,
|
|
'resolution': self.params.resolution,
|
|
'size': self.params.size,
|
|
'verbose': verbose
|
|
}
|
|
|
|
# run texturing binary
|
|
system.run('{bin}/odm_texturing -bundleFile {bundle} '
|
|
'-imagesPath {imgs_path} -imagesListPath {imgs_list} '
|
|
'-inputModelPath {model} -outputFolder {out_dir}/ '
|
|
'-textureResolution {resolution} -bundleResizedTo {resize} {verbose} '
|
|
'-textureWithSize {size} -logFile {log}'.format(**kwargs))
|
|
else:
|
|
log.ODM_WARNING('Found a valid ODM Texture file in: %s'
|
|
% odm_textured_model_obj)
|
|
|
|
if args.time:
|
|
system.benchmark(start_time, tree.benchmarking, 'Texturing')
|
|
|
|
log.ODM_INFO('Running ODM Texturing Cell - Finished')
|
|
return ecto.OK if args.end_with != 'odm_texturing' else ecto.QUIT
|