kopia lustrzana https://github.com/OpenDroneMap/ODM
Multispectral split-merge, GCP names fix, bump version
rodzic
d55202daad
commit
8cb70002f5
|
@ -25,7 +25,7 @@ ExternalProject_Add(${_proj_name}
|
||||||
#--Download step--------------
|
#--Download step--------------
|
||||||
DOWNLOAD_DIR ${SB_DOWNLOAD_DIR}
|
DOWNLOAD_DIR ${SB_DOWNLOAD_DIR}
|
||||||
GIT_REPOSITORY https://github.com/OpenDroneMap/OpenSfM/
|
GIT_REPOSITORY https://github.com/OpenDroneMap/OpenSfM/
|
||||||
GIT_TAG 302
|
GIT_TAG 303
|
||||||
#--Update/Patch step----------
|
#--Update/Patch step----------
|
||||||
UPDATE_COMMAND git submodule update --init --recursive
|
UPDATE_COMMAND git submodule update --init --recursive
|
||||||
#--Configure step-------------
|
#--Configure step-------------
|
||||||
|
|
2
VERSION
2
VERSION
|
@ -1 +1 @@
|
||||||
3.0.2
|
3.0.3
|
||||||
|
|
|
@ -58,7 +58,7 @@ def rectify(lasFile, debug=False, reclassify_threshold=5, min_area=750, min_poin
|
||||||
min_area=min_area, min_points=min_points)
|
min_area=min_area, min_points=min_points)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise Exception("Error rectifying ground in file %s: %s" % (lasFile, str(e)))
|
log.ODM_WARNING("Error rectifying ground in file %s: %s" % (lasFile, str(e)))
|
||||||
|
|
||||||
log.ODM_INFO('Created %s in %s' % (lasFile, datetime.now() - start))
|
log.ODM_INFO('Created %s in %s' % (lasFile, datetime.now() - start))
|
||||||
return lasFile
|
return lasFile
|
||||||
|
|
|
@ -216,8 +216,8 @@ def merge(input_ortho_and_ortho_cuts, output_orthophoto, orthophoto_vars={}):
|
||||||
left, bottom, right, top = src.bounds
|
left, bottom, right, top = src.bounds
|
||||||
xs.extend([left, right])
|
xs.extend([left, right])
|
||||||
ys.extend([bottom, top])
|
ys.extend([bottom, top])
|
||||||
if src.profile["count"] < 4:
|
if src.profile["count"] < 2:
|
||||||
raise ValueError("Inputs must be at least 4-band rasters")
|
raise ValueError("Inputs must be at least 2-band rasters")
|
||||||
dst_w, dst_s, dst_e, dst_n = min(xs), min(ys), max(xs), max(ys)
|
dst_w, dst_s, dst_e, dst_n = min(xs), min(ys), max(xs), max(ys)
|
||||||
log.ODM_INFO("Output bounds: %r %r %r %r" % (dst_w, dst_s, dst_e, dst_n))
|
log.ODM_INFO("Output bounds: %r %r %r %r" % (dst_w, dst_s, dst_e, dst_n))
|
||||||
|
|
||||||
|
|
|
@ -144,3 +144,13 @@ def which(program):
|
||||||
p=os.path.join(p,program)
|
p=os.path.join(p,program)
|
||||||
if os.path.exists(p) and os.access(p,os.X_OK):
|
if os.path.exists(p) and os.access(p,os.X_OK):
|
||||||
return p
|
return p
|
||||||
|
|
||||||
|
def link_file(src, dst):
|
||||||
|
if os.path.isdir(dst):
|
||||||
|
dst = os.path.join(dst, os.path.basename(src))
|
||||||
|
|
||||||
|
if not os.path.isfile(dst):
|
||||||
|
if sys.platform == 'win32':
|
||||||
|
os.link(src, dst)
|
||||||
|
else:
|
||||||
|
os.symlink(os.path.relpath(os.path.abspath(src), os.path.dirname(os.path.abspath(dst))), dst)
|
||||||
|
|
|
@ -113,7 +113,7 @@ class ODM_Reconstruction(object):
|
||||||
# Convert GCP file to a UTM projection since the rest of the pipeline
|
# Convert GCP file to a UTM projection since the rest of the pipeline
|
||||||
# does not handle other SRS well.
|
# does not handle other SRS well.
|
||||||
rejected_entries = []
|
rejected_entries = []
|
||||||
utm_gcp = GCPFile(gcp.create_utm_copy(output_gcp_file, filenames=[p.filename for p in self.photos], rejected_entries=rejected_entries, include_extras=False))
|
utm_gcp = GCPFile(gcp.create_utm_copy(output_gcp_file, filenames=[p.filename for p in self.photos], rejected_entries=rejected_entries, include_extras=True))
|
||||||
|
|
||||||
if not utm_gcp.exists():
|
if not utm_gcp.exists():
|
||||||
raise RuntimeError("Could not project GCP file to UTM. Please double check your GCP file for mistakes.")
|
raise RuntimeError("Could not project GCP file to UTM. Please double check your GCP file for mistakes.")
|
||||||
|
|
|
@ -20,6 +20,7 @@ from opendm import point_cloud
|
||||||
from opendm.utils import double_quote
|
from opendm.utils import double_quote
|
||||||
from opendm.tiles.tiler import generate_dem_tiles
|
from opendm.tiles.tiler import generate_dem_tiles
|
||||||
from opendm.cogeo import convert_to_cogeo
|
from opendm.cogeo import convert_to_cogeo
|
||||||
|
from opendm import multispectral
|
||||||
|
|
||||||
class ODMSplitStage(types.ODM_Stage):
|
class ODMSplitStage(types.ODM_Stage):
|
||||||
def process(self, args, outputs):
|
def process(self, args, outputs):
|
||||||
|
@ -88,12 +89,12 @@ class ODMSplitStage(types.ODM_Stage):
|
||||||
|
|
||||||
for sp in submodel_paths:
|
for sp in submodel_paths:
|
||||||
sp_octx = OSFMContext(sp)
|
sp_octx = OSFMContext(sp)
|
||||||
|
submodel_images_dir = os.path.abspath(sp_octx.path("..", "images"))
|
||||||
|
|
||||||
# Copy filtered GCP file if needed
|
# Copy filtered GCP file if needed
|
||||||
# One in OpenSfM's directory, one in the submodel project directory
|
# One in OpenSfM's directory, one in the submodel project directory
|
||||||
if reconstruction.gcp and reconstruction.gcp.exists():
|
if reconstruction.gcp and reconstruction.gcp.exists():
|
||||||
submodel_gcp_file = os.path.abspath(sp_octx.path("..", "gcp_list.txt"))
|
submodel_gcp_file = os.path.abspath(sp_octx.path("..", "gcp_list.txt"))
|
||||||
submodel_images_dir = os.path.abspath(sp_octx.path("..", "images"))
|
|
||||||
|
|
||||||
if reconstruction.gcp.make_filtered_copy(submodel_gcp_file, submodel_images_dir):
|
if reconstruction.gcp.make_filtered_copy(submodel_gcp_file, submodel_images_dir):
|
||||||
log.ODM_INFO("Copied filtered GCP file to %s" % submodel_gcp_file)
|
log.ODM_INFO("Copied filtered GCP file to %s" % submodel_gcp_file)
|
||||||
|
@ -107,6 +108,19 @@ class ODMSplitStage(types.ODM_Stage):
|
||||||
io.copy(tree.odm_geo_file, geo_dst_path)
|
io.copy(tree.odm_geo_file, geo_dst_path)
|
||||||
log.ODM_INFO("Copied GEO file to %s" % geo_dst_path)
|
log.ODM_INFO("Copied GEO file to %s" % geo_dst_path)
|
||||||
|
|
||||||
|
# If this is a multispectral dataset,
|
||||||
|
# we need to link the multispectral images
|
||||||
|
if reconstruction.multi_camera:
|
||||||
|
submodel_images = os.listdir(submodel_images_dir)
|
||||||
|
|
||||||
|
primary_band_name = multispectral.get_primary_band_name(reconstruction.multi_camera, args.primary_band)
|
||||||
|
_, p2s = multispectral.compute_band_maps(reconstruction.multi_camera, primary_band_name)
|
||||||
|
for filename in p2s:
|
||||||
|
if filename in submodel_images:
|
||||||
|
secondary_band_photos = p2s[filename]
|
||||||
|
for p in secondary_band_photos:
|
||||||
|
system.link_file(os.path.join(tree.dataset_raw, p.filename), submodel_images_dir)
|
||||||
|
|
||||||
# Reconstruct each submodel
|
# Reconstruct each submodel
|
||||||
log.ODM_INFO("Dataset has been split into %s submodels. Reconstructing each submodel..." % len(submodel_paths))
|
log.ODM_INFO("Dataset has been split into %s submodels. Reconstructing each submodel..." % len(submodel_paths))
|
||||||
self.update_progress(25)
|
self.update_progress(25)
|
||||||
|
|
Ładowanie…
Reference in New Issue