OpenDroneMap-ODM/scripts/odm_app.py

137 wiersze
6.2 KiB
Python
Czysty Zwykły widok Historia

2015-11-26 12:15:02 +00:00
import ecto
2016-02-29 14:45:00 +00:00
import os
2015-11-26 12:15:02 +00:00
2015-11-27 16:52:27 +00:00
from opendm import context
from opendm import types
from opendm import config
2016-02-29 14:45:00 +00:00
from opendm import io
from opendm import system
2015-11-27 16:52:27 +00:00
2015-11-26 12:15:02 +00:00
from dataset import ODMLoadDatasetCell
2015-11-27 16:52:27 +00:00
from resize import ODMResizeCell
2015-11-30 15:51:29 +00:00
from opensfm import ODMOpenSfMCell
from pmvs import ODMPmvsCell
from cmvs import ODMCmvsCell
2015-11-30 15:51:29 +00:00
from odm_meshing import ODMeshingCell
from odm_texturing import ODMTexturingCell
from odm_georeferencing import ODMGeoreferencingCell
from odm_orthophoto import ODMOrthoPhotoCell
2015-11-26 12:15:02 +00:00
2015-11-26 12:15:02 +00:00
class ODMApp(ecto.BlackBox):
"""ODMApp - a class for ODM Activities
"""
2015-11-26 12:15:02 +00:00
def __init__(self, *args, **kwargs):
ecto.BlackBox.__init__(self, *args, **kwargs)
self.tree = None
2015-11-26 12:15:02 +00:00
@staticmethod
def declare_direct_params(p):
p.declare("args", "The application arguments.", {})
@staticmethod
def declare_cells(p):
"""
Implement the virtual function from the base class
Only cells from which something is forwarded have to be declared
"""
cells = {'args': ecto.Constant(value=p.args),
'dataset': ODMLoadDatasetCell(force_focal=p.args['force_focal'],
force_ccd=p.args['force_ccd']),
'resize': ODMResizeCell(resize_to=p.args['resize_to']),
'opensfm': ODMOpenSfMCell(use_exif_size=False,
feature_process_size=p.args['resize_to'],
feature_min_frames=p.args['min_num_features'],
processes=context.num_cores,
matching_gps_neighbors=p.args['matcher_neighbors'],
matching_gps_distance=p.args['matcher_distance']),
'cmvs': ODMCmvsCell(max_images=p.args['cmvs_maxImages']),
'pmvs': ODMPmvsCell(level=p.args['pmvs_level'],
csize=p.args['pmvs_csize'],
thresh=p.args['pmvs_threshold'],
wsize=p.args['pmvs_wsize'],
min_imgs=p.args['pmvs_minImageNum'],
cores=p.args['pmvs_num_cores']),
'meshing': ODMeshingCell(max_vertex=p.args['odm_meshing_maxVertexCount'],
oct_tree=p.args['odm_meshing_octreeDepth'],
samples=p.args['odm_meshing_samplesPerNode'],
solver=p.args['odm_meshing_solverDivide']),
'texturing': ODMTexturingCell(resize=p.args['resize_to'],
resolution=p.args['odm_texturing_textureResolution'],
size=p.args['odm_texturing_textureWithSize']),
'georeferencing': ODMGeoreferencingCell(img_size=p.args['resize_to'],
gcp_file=p.args['odm_georeferencing_gcpFile'],
use_gcp=p.args['odm_georeferencing_useGcp']),
'orthophoto': ODMOrthoPhotoCell(resolution=p.args['odm_orthophoto_resolution'])
}
return cells
2015-11-26 12:15:02 +00:00
def configure(self, p, _i, _o):
2015-12-10 17:17:39 +00:00
tree = types.ODM_Tree(p.args['project_path'])
self.tree = ecto.Constant(value=tree)
2015-11-27 16:52:27 +00:00
2016-02-29 14:45:00 +00:00
# TODO(dakota) put this somewhere better maybe
if config.args.get('time') and io.file_exists(tree.benchmarking):
# Delete the previously made file
os.remove(tree.benchmarking)
with open(tree.benchmarking, 'a') as b:
b.write('ODM Benchmarking file created %s\nNumber of Cores: %s\n\n' % (system.now(), context.num_cores))
2016-02-29 14:45:00 +00:00
def connections(self, _p):
# define initial task
# TODO: What is this?
# initial_task = _p.args['start_with']
# initial_task_id = config.processopts.index(initial_task)
2015-11-26 12:15:02 +00:00
# define the connections like you would for the plasm
# connections = []
# load the dataset
connections = [self.tree[:] >> self.dataset['tree']]
2015-12-11 21:26:39 +00:00
# run resize cell
connections += [self.tree[:] >> self.resize['tree'],
self.args[:] >> self.resize['args'],
self.dataset['photos'] >> self.resize['photos']]
2015-12-11 21:26:39 +00:00
# run opensfm with images from load dataset
connections += [self.tree[:] >> self.opensfm['tree'],
self.args[:] >> self.opensfm['args'],
self.resize['photos'] >> self.opensfm['photos']]
2015-12-11 21:26:39 +00:00
# run cmvs
connections += [self.tree[:] >> self.cmvs['tree'],
self.args[:] >> self.cmvs['args'],
self.opensfm['reconstruction'] >> self.cmvs['reconstruction']]
2015-12-11 21:26:39 +00:00
# run pmvs
connections += [self.tree[:] >> self.pmvs['tree'],
self.args[:] >> self.pmvs['args'],
self.cmvs['reconstruction'] >> self.pmvs['reconstruction']]
2015-12-11 21:26:39 +00:00
# create odm mesh
connections += [self.tree[:] >> self.meshing['tree'],
self.args[:] >> self.meshing['args'],
self.pmvs['reconstruction'] >> self.meshing['reconstruction']]
2015-12-11 21:26:39 +00:00
# create odm texture
connections += [self.tree[:] >> self.texturing['tree'],
self.args[:] >> self.texturing['args'],
self.meshing['reconstruction'] >> self.texturing['reconstruction']]
2015-12-11 21:26:39 +00:00
# create odm georeference
connections += [self.tree[:] >> self.georeferencing['tree'],
self.args[:] >> self.georeferencing['args'],
self.dataset['photos'] >> self.georeferencing['photos'],
self.texturing['reconstruction'] >> self.georeferencing['reconstruction']]
# create odm orthophoto
connections += [self.tree[:] >> self.orthophoto['tree'],
self.args[:] >> self.orthophoto['args'],
self.georeferencing['reconstruction'] >> self.orthophoto['reconstruction']]
2015-12-30 14:36:56 +00:00
return connections