OpenDroneMap-ODM/stages/dataset.py

131 wiersze
5.1 KiB
Python
Czysty Zwykły widok Historia

2015-11-26 12:15:02 +00:00
import os
2018-11-24 17:56:17 +00:00
import json
2015-11-26 12:15:02 +00:00
from opendm import context
from opendm import io
from opendm import types
from opendm import log
from opendm import system
from opendm.geo import GeoFile
from shutil import copyfile
2019-05-15 21:04:09 +00:00
from opendm import progress
2015-11-26 12:15:02 +00:00
2018-11-24 17:56:17 +00:00
def save_images_database(photos, database_file):
with open(database_file, 'w') as f:
2020-09-09 17:23:53 +00:00
f.write(json.dumps([p.__dict__ for p in photos]))
2018-11-24 17:56:17 +00:00
log.ODM_INFO("Wrote images database: %s" % database_file)
def load_images_database(database_file):
2018-11-24 18:00:22 +00:00
# Empty is used to create types.ODM_Photo class
# instances without calling __init__
2018-11-24 17:56:17 +00:00
class Empty:
pass
result = []
log.ODM_INFO("Loading images database: %s" % database_file)
with open(database_file, 'r') as f:
photos_json = json.load(f)
for photo_json in photos_json:
p = Empty()
for k in photo_json:
setattr(p, k, photo_json[k])
p.__class__ = types.ODM_Photo
result.append(p)
return result
2019-04-22 19:14:39 +00:00
class ODMLoadDatasetStage(types.ODM_Stage):
def process(self, args, outputs):
tree = types.ODM_Tree(args.project_path, args.gcp, args.geo)
2019-04-22 19:14:39 +00:00
outputs['tree'] = tree
if args.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))
# check if the extension is supported
2015-11-26 12:15:02 +00:00
def supported_extension(file_name):
(pathfn, ext) = os.path.splitext(file_name)
return ext.lower() in context.supported_extensions
# Get supported images from dir
def get_images(in_dir):
# filter images for its extension type
log.ODM_DEBUG(in_dir)
return [f for f in io.get_files_list(in_dir) if supported_extension(f)]
# get images directory
input_dir = tree.input_images
images_dir = tree.dataset_raw
2017-08-24 19:19:51 +00:00
if not io.dir_exists(images_dir):
log.ODM_INFO("Project directory %s doesn't exist. Creating it now. " % images_dir)
system.mkdir_p(images_dir)
copied = [copyfile(io.join_paths(input_dir, f), io.join_paths(images_dir, f)) for f in get_images(input_dir)]
2015-11-26 12:15:02 +00:00
2018-03-03 16:48:43 +00:00
# define paths and create working directories
system.mkdir_p(tree.odm_georeferencing)
if not args.use_3dmesh: system.mkdir_p(tree.odm_25dgeoreferencing)
2018-03-03 16:48:43 +00:00
log.ODM_INFO('Loading dataset from: %s' % images_dir)
2015-11-26 12:15:02 +00:00
2018-11-24 17:56:17 +00:00
# check if we rerun cell or not
images_database_file = io.join_paths(tree.root_path, 'images.json')
2019-04-22 19:14:39 +00:00
if not io.file_exists(images_database_file) or self.rerun():
2018-11-24 17:56:17 +00:00
files = get_images(images_dir)
if files:
# create ODMPhoto list
path_files = [io.join_paths(images_dir, f) for f in files]
photos = []
with open(tree.dataset_list, 'w') as dataset_list:
log.ODM_INFO("Loading %s images" % len(path_files))
for f in path_files:
photos += [types.ODM_Photo(f)]
2018-11-24 17:56:17 +00:00
dataset_list.write(photos[-1].filename + '\n')
# Check if a geo file is available
2020-09-14 20:09:26 +00:00
if tree.odm_geo_file is not None and os.path.exists(tree.odm_geo_file):
log.ODM_INFO("Found image geolocation file")
gf = GeoFile(tree.odm_geo_file)
updated = 0
for p in photos:
entry = gf.get_entry(p.filename)
if entry:
p.update_with_geo_entry(entry)
updated += 1
log.ODM_INFO("Updated %s image positions" % updated)
2018-11-24 17:56:17 +00:00
# Save image database for faster restart
save_images_database(photos, images_database_file)
else:
log.ODM_ERROR('Not enough supported images in %s' % images_dir)
2019-04-22 19:14:39 +00:00
exit(1)
else:
2018-11-24 17:56:17 +00:00
# We have an images database, just load it
photos = load_images_database(images_database_file)
log.ODM_INFO('Found %s usable images' % len(photos))
2015-11-26 12:15:02 +00:00
2019-06-20 19:39:49 +00:00
# Create reconstruction object
reconstruction = types.ODM_Reconstruction(photos)
2019-06-21 18:47:00 +00:00
2019-07-02 19:40:20 +00:00
if tree.odm_georeferencing_gcp and not args.use_exif:
2019-06-21 18:47:00 +00:00
reconstruction.georeference_with_gcp(tree.odm_georeferencing_gcp,
tree.odm_georeferencing_coords,
tree.odm_georeferencing_gcp_utm,
rerun=self.rerun())
else:
2019-06-21 18:47:00 +00:00
reconstruction.georeference_with_gps(tree.dataset_raw,
tree.odm_georeferencing_coords,
rerun=self.rerun())
2015-11-26 12:15:02 +00:00
2019-06-20 19:39:49 +00:00
reconstruction.save_proj_srs(io.join_paths(tree.odm_georeferencing, tree.odm_georeferencing_proj))
outputs['reconstruction'] = reconstruction