Jakub Kropacek 9b1342122b new file: i/IOTK/IOTK-1.2.2-intel-2021a.eb
new file:   i/IRODS/IRODS-0.7.3.eb
	new file:   l/libxc/libxc-5.1.5-intel-2020a.eb
	new file:   n/NodeODM/NodeODM-2.2.0-GCCcore-11.3.0.eb
	new file:   o/ODM/ODM-2.8.7/.dockerignore
	new file:   o/ODM/ODM-2.8.7/.github/workflows/publish-docker-and-wsl.yaml
	new file:   o/ODM/ODM-2.8.7/.github/workflows/publish-docker-gpu.yaml
	new file:   o/ODM/ODM-2.8.7/.github/workflows/publish-snap.yml
	new file:   o/ODM/ODM-2.8.7/.github/workflows/publish-windows.yml
	new file:   o/ODM/ODM-2.8.7/.github/workflows/test-build-prs.yaml
	new file:   o/ODM/ODM-2.8.7/.gitignore
	new file:   o/ODM/ODM-2.8.7/.gitmodules
	new file:   o/ODM/ODM-2.8.7/CNAME
	new file:   o/ODM/ODM-2.8.7/CONTRIBUTING.md
	new file:   o/ODM/ODM-2.8.7/Dockerfile
	new file:   o/ODM/ODM-2.8.7/LICENSE
	new file:   o/ODM/ODM-2.8.7/README.md
	new file:   o/ODM/ODM-2.8.7/SuperBuild/CMakeLists.txt
	new file:   o/ODM/ODM-2.8.7/SuperBuild/cmake/External-Ceres.cmake
	new file:   o/ODM/ODM-2.8.7/SuperBuild/cmake/External-Entwine.cmake
	new file:   o/ODM/ODM-2.8.7/SuperBuild/cmake/External-FPCFilter.cmake
	new file:   o/ODM/ODM-2.8.7/SuperBuild/cmake/External-GFlags.cmake
	new file:   o/ODM/ODM-2.8.7/SuperBuild/cmake/External-Hexer.cmake
	new file:   o/ODM/ODM-2.8.7/SuperBuild/cmake/External-LASzip.cmake
	new file:   o/ODM/ODM-2.8.7/SuperBuild/cmake/External-MvsTexturing.cmake
	new file:   o/ODM/ODM-2.8.7/SuperBuild/cmake/External-Obj2Tiles.cmake
	new file:   o/ODM/ODM-2.8.7/SuperBuild/cmake/External-OpenCV.cmake
	new file:   o/ODM/ODM-2.8.7/SuperBuild/cmake/External-OpenMVS.cmake
	new file:   o/ODM/ODM-2.8.7/SuperBuild/cmake/External-OpenSfM.cmake
	new file:   o/ODM/ODM-2.8.7/SuperBuild/cmake/External-PCL.cmake
	new file:   o/ODM/ODM-2.8.7/SuperBuild/cmake/External-PDAL.cmake
	new file:   o/ODM/ODM-2.8.7/SuperBuild/cmake/External-PyPopsift.cmake
	new file:   o/ODM/ODM-2.8.7/SuperBuild/cmake/External-Untwine.cmake
	new file:   o/ODM/ODM-2.8.7/SuperBuild/cmake/ExternalProject-Setup.cmake
	new file:   o/ODM/ODM-2.8.7/VERSION
	new file:   o/ODM/ODM-2.8.7/code_of_conduct.md
	new file:   o/ODM/ODM-2.8.7/configure.py
	new file:   o/ODM/ODM-2.8.7/configure.sh
	new file:   o/ODM/ODM-2.8.7/console.bat
	new file:   o/ODM/ODM-2.8.7/contrib/blender/README.md
	new file:   o/ODM/ODM-2.8.7/contrib/blender/common.py
	new file:   o/ODM/ODM-2.8.7/contrib/blender/odm_photo.py
	new file:   o/ODM/ODM-2.8.7/contrib/blender/odm_video.py
	new file:   o/ODM/ODM-2.8.7/contrib/blender/photo_360.blend
	new file:   o/ODM/ODM-2.8.7/contrib/blender/photo_vr.blend
	new file:   o/ODM/ODM-2.8.7/contrib/grass/README.md
	new file:   o/ODM/ODM-2.8.7/contrib/grass/odm_grass.py
	new file:   o/ODM/ODM-2.8.7/contrib/mergepreview/README.md
	new file:   o/ODM/ODM-2.8.7/contrib/mergepreview/mergepreview.py
	new file:   o/ODM/ODM-2.8.7/contrib/ndvi/README.md
	new file:   o/ODM/ODM-2.8.7/contrib/ndvi/agricultural_indices.py
	new file:   o/ODM/ODM-2.8.7/contrib/ndvi/ndvi.py
	new file:   o/ODM/ODM-2.8.7/contrib/ndvi/rename_sentera_agx710_multispectral_tif.py
	new file:   o/ODM/ODM-2.8.7/contrib/orthorectify/README.md
	new file:   o/ODM/ODM-2.8.7/contrib/orthorectify/orthorectify.py
	new file:   o/ODM/ODM-2.8.7/contrib/orthorectify/run.sh
	new file:   o/ODM/ODM-2.8.7/contrib/pc2dem/README.md
	new file:   o/ODM/ODM-2.8.7/contrib/pc2dem/pc2dem.py
	new file:   o/ODM/ODM-2.8.7/contrib/resize/README.md
	new file:   o/ODM/ODM-2.8.7/contrib/resize/requirements.txt
	new file:   o/ODM/ODM-2.8.7/contrib/resize/resize.py
	new file:   o/ODM/ODM-2.8.7/contrib/shell/odm_exif2utm.sh
	new file:   o/ODM/ODM-2.8.7/contrib/visveg/readme.md
	new file:   o/ODM/ODM-2.8.7/contrib/visveg/vegind.py
	new file:   o/ODM/ODM-2.8.7/docker/README
	new file:   o/ODM/ODM-2.8.7/docker/g++
	new file:   o/ODM/ODM-2.8.7/docker/gcc
	new file:   o/ODM/ODM-2.8.7/docs/issue_template.md
	new file:   o/ODM/ODM-2.8.7/gpu.Dockerfile
	new file:   o/ODM/ODM-2.8.7/innosetup.iss
	new file:   o/ODM/ODM-2.8.7/licenses/libext_copyright.txt
	new file:   o/ODM/ODM-2.8.7/licenses/libx11_copyright.txt
	new file:   o/ODM/ODM-2.8.7/licenses/license.md
	new file:   o/ODM/ODM-2.8.7/odm_docker_readme.txt
	new file:   o/ODM/ODM-2.8.7/opendm/__init__.py
	new file:   o/ODM/ODM-2.8.7/opendm/boundary.py
	new file:   o/ODM/ODM-2.8.7/opendm/camera.py
	new file:   o/ODM/ODM-2.8.7/opendm/cogeo.py
	new file:   o/ODM/ODM-2.8.7/opendm/concurrency.py
	new file:   o/ODM/ODM-2.8.7/opendm/config.py
	new file:   o/ODM/ODM-2.8.7/opendm/context.py
	new file:   o/ODM/ODM-2.8.7/opendm/cropper.py
	new file:   o/ODM/ODM-2.8.7/opendm/cutline.py
	new file:   o/ODM/ODM-2.8.7/opendm/dem/__init__.py
	new file:   o/ODM/ODM-2.8.7/opendm/dem/commands.py
	new file:   o/ODM/ODM-2.8.7/opendm/dem/ground_rectification/__init__.py
	new file:   o/ODM/ODM-2.8.7/opendm/dem/ground_rectification/bounds/__init__.py
	new file:   o/ODM/ODM-2.8.7/opendm/dem/ground_rectification/bounds/types.py
	new file:   o/ODM/ODM-2.8.7/opendm/dem/ground_rectification/bounds/utils.py
	new file:   o/ODM/ODM-2.8.7/opendm/dem/ground_rectification/extra_dimensions/__init__.py
	new file:   o/ODM/ODM-2.8.7/opendm/dem/ground_rectification/extra_dimensions/dimension.py
	new file:   o/ODM/ODM-2.8.7/opendm/dem/ground_rectification/extra_dimensions/distance_dimension.py
	new file:   o/ODM/ODM-2.8.7/opendm/dem/ground_rectification/extra_dimensions/extended_dimension.py
	new file:   o/ODM/ODM-2.8.7/opendm/dem/ground_rectification/extra_dimensions/partition_dimension.py
	new file:   o/ODM/ODM-2.8.7/opendm/dem/ground_rectification/grid/__init__.py
	new file:   o/ODM/ODM-2.8.7/opendm/dem/ground_rectification/grid/builder.py
	new file:   o/ODM/ODM-2.8.7/opendm/dem/ground_rectification/io/__init__.py
	new file:   o/ODM/ODM-2.8.7/opendm/dem/ground_rectification/io/las_io.py
	new file:   o/ODM/ODM-2.8.7/opendm/dem/ground_rectification/partition/__init__.py
	new file:   o/ODM/ODM-2.8.7/opendm/dem/ground_rectification/partition/one_partition.py
	new file:   o/ODM/ODM-2.8.7/opendm/dem/ground_rectification/partition/partition_plan.py
	new file:   o/ODM/ODM-2.8.7/opendm/dem/ground_rectification/partition/quad_partitions.py
	new file:   o/ODM/ODM-2.8.7/opendm/dem/ground_rectification/partition/selector.py
	new file:   o/ODM/ODM-2.8.7/opendm/dem/ground_rectification/partition/surrounding_partitions.py
	new file:   o/ODM/ODM-2.8.7/opendm/dem/ground_rectification/point_cloud.py
	new file:   o/ODM/ODM-2.8.7/opendm/dem/ground_rectification/rectify.py
	new file:   o/ODM/ODM-2.8.7/opendm/dem/merge.py
	new file:   o/ODM/ODM-2.8.7/opendm/dem/pdal.py
	new file:   o/ODM/ODM-2.8.7/opendm/dem/utils.py
	new file:   o/ODM/ODM-2.8.7/opendm/dls.py
	new file:   o/ODM/ODM-2.8.7/opendm/entwine.py
	new file:   o/ODM/ODM-2.8.7/opendm/gcp.py
	new file:   o/ODM/ODM-2.8.7/opendm/geo.py
	new file:   o/ODM/ODM-2.8.7/opendm/get_image_size.py
	new file:   o/ODM/ODM-2.8.7/opendm/gpu.py
	new file:   o/ODM/ODM-2.8.7/opendm/gsd.py
	new file:   o/ODM/ODM-2.8.7/opendm/io.py
	new file:   o/ODM/ODM-2.8.7/opendm/location.py
	new file:   o/ODM/ODM-2.8.7/opendm/log.py
	new file:   o/ODM/ODM-2.8.7/opendm/loghelpers.py
	new file:   o/ODM/ODM-2.8.7/opendm/mesh.py
	new file:   o/ODM/ODM-2.8.7/opendm/multispectral.py
	new file:   o/ODM/ODM-2.8.7/opendm/nvm.py
	new file:   o/ODM/ODM-2.8.7/opendm/ogctiles.py
	new file:   o/ODM/ODM-2.8.7/opendm/orthophoto.py
	new file:   o/ODM/ODM-2.8.7/opendm/osfm.py
	new file:   o/ODM/ODM-2.8.7/opendm/photo.py
	new file:   o/ODM/ODM-2.8.7/opendm/point_cloud.py
	new file:   o/ODM/ODM-2.8.7/opendm/progress.py
	new file:   o/ODM/ODM-2.8.7/opendm/pseudogeo.py
	new file:   o/ODM/ODM-2.8.7/opendm/remote.py
	new file:   o/ODM/ODM-2.8.7/opendm/report/dsm_gradient.png
	new file:   o/ODM/ODM-2.8.7/opendm/report/overlap_color_map.txt
	new file:   o/ODM/ODM-2.8.7/opendm/report/overlap_diagram_legend.png
	new file:   o/ODM/ODM-2.8.7/opendm/rollingshutter.py
	new file:   o/ODM/ODM-2.8.7/opendm/shots.py
	new file:   o/ODM/ODM-2.8.7/opendm/system.py
	new file:   o/ODM/ODM-2.8.7/opendm/thermal.py
	new file:   o/ODM/ODM-2.8.7/opendm/thermal_tools/__init__.py
	new file:   o/ODM/ODM-2.8.7/opendm/thermal_tools/dji_unpack.py
	new file:   o/ODM/ODM-2.8.7/opendm/thermal_tools/flir_unpack.py
	new file:   o/ODM/ODM-2.8.7/opendm/thermal_tools/thermal_utils.py
	new file:   o/ODM/ODM-2.8.7/opendm/tiles/color_relief.txt
	new file:   o/ODM/ODM-2.8.7/opendm/tiles/gdal2tiles.py
	new file:   o/ODM/ODM-2.8.7/opendm/tiles/hsv_merge.py
	new file:   o/ODM/ODM-2.8.7/opendm/tiles/tiler.py
	new file:   o/ODM/ODM-2.8.7/opendm/types.py
	new file:   o/ODM/ODM-2.8.7/opendm/utils.py
	new file:   o/ODM/ODM-2.8.7/opendm/vendor/__init__.py
	new file:   o/ODM/ODM-2.8.7/opendm/vendor/gdal_fillnodata.py
	new file:   o/ODM/ODM-2.8.7/portable.Dockerfile
	new file:   o/ODM/ODM-2.8.7/requirements.txt
	new file:   o/ODM/ODM-2.8.7/run.bat
	new file:   o/ODM/ODM-2.8.7/run.py
	new file:   o/ODM/ODM-2.8.7/run.sh
	new file:   o/ODM/ODM-2.8.7/snap/snapcraft.yaml
	new file:   o/ODM/ODM-2.8.7/snap/snapcraft21.yaml
	new file:   o/ODM/ODM-2.8.7/stages/__init__.py
	new file:   o/ODM/ODM-2.8.7/stages/dataset.py
	new file:   o/ODM/ODM-2.8.7/stages/mvstex.py
	new file:   o/ODM/ODM-2.8.7/stages/odm_app.py
	new file:   o/ODM/ODM-2.8.7/stages/odm_dem.py
	new file:   o/ODM/ODM-2.8.7/stages/odm_filterpoints.py
	new file:   o/ODM/ODM-2.8.7/stages/odm_georeferencing.py
	new file:   o/ODM/ODM-2.8.7/stages/odm_meshing.py
	new file:   o/ODM/ODM-2.8.7/stages/odm_orthophoto.py
	new file:   o/ODM/ODM-2.8.7/stages/odm_postprocess.py
	new file:   o/ODM/ODM-2.8.7/stages/odm_report.py
	new file:   o/ODM/ODM-2.8.7/stages/openmvs.py
	new file:   o/ODM/ODM-2.8.7/stages/run_opensfm.py
	new file:   o/ODM/ODM-2.8.7/stages/splitmerge.py
	new file:   o/ODM/ODM-2.8.7/start-dev-env.sh
	new file:   o/ODM/ODM-2.8.7/test.sh
	new file:   o/ODM/ODM-2.8.7/tests/assets/.gitignore
	new file:   o/ODM/ODM-2.8.7/tests/assets/gcp_extras.txt
	new file:   o/ODM/ODM-2.8.7/tests/assets/gcp_latlon_south.txt
	new file:   o/ODM/ODM-2.8.7/tests/assets/gcp_latlon_valid.txt
	new file:   o/ODM/ODM-2.8.7/tests/assets/gcp_michigan_feet_valid.txt
	new file:   o/ODM/ODM-2.8.7/tests/assets/gcp_utm_north_valid.txt
	new file:   o/ODM/ODM-2.8.7/tests/assets/images/DJI_0002.JPG
	new file:   o/ODM/ODM-2.8.7/tests/assets/reconstruction.json
	new file:   o/ODM/ODM-2.8.7/tests/assets/sample.json
	new file:   o/ODM/ODM-2.8.7/tests/test_camera.py
	new file:   o/ODM/ODM-2.8.7/tests/test_gcp.py
	new file:   o/ODM/ODM-2.8.7/tests/test_osfm.py
	new file:   o/ODM/ODM-2.8.7/tests/test_remote.py
	new file:   o/ODM/ODM-2.8.7/tests/test_types.py
	new file:   o/ODM/ODM-2.8.7/vcpkg-requirements.txt
	new file:   o/ODM/ODM-2.8.7/win32env.bat
	new file:   o/ODM/ODM-2.8.7/winrun.bat
	new file:   o/ODM/v2.8.7.tar.gz
	new file:   y/Yambo/Yambo-5.1.0-intel-2020a.eb
	new file:   y/Yambo/Yambo-5.1.0-intel-2020a.eb.bak_20220715124556_61837
	new file:   y/Yambo/Yambo-5.1.0-intel-2021a.eb.old
	deleted:    y/Yambo/Yambo-5.1.0-intel-2021a.eb
2022-07-19 15:02:22 +02:00

144 lines
5.4 KiB
Python

import os, json
from opendm import log
from opendm.pseudogeo import get_pseudogeo_utm, get_pseudogeo_scale
from opendm.location import transformer
from pyproj import CRS
from osgeo import gdal
import numpy as np
import cv2
def get_rotation_matrix(rotation):
"""Get rotation as a 3x3 matrix."""
return cv2.Rodrigues(rotation)[0]
def matrix_to_rotation(rotation_matrix):
R = np.array(rotation_matrix, dtype=float)
# if not np.isclose(np.linalg.det(R), 1):
# raise ValueError("Determinant != 1")
# if not np.allclose(np.linalg.inv(R), R.T):
# raise ValueError("Not orthogonal")
return cv2.Rodrigues(R)[0].ravel()
def get_origin(shot):
"""The origin of the pose in world coordinates."""
return -get_rotation_matrix(np.array(shot['rotation'])).T.dot(np.array(shot['translation']))
def get_geojson_shots_from_opensfm(reconstruction_file, utm_srs=None, utm_offset=None, pseudo_geotiff=None):
"""
Extract shots from OpenSfM's reconstruction.json
"""
pseudo_geocoords = None
if pseudo_geotiff is not None and os.path.exists(pseudo_geotiff):
# pseudogeo transform
utm_srs = get_pseudogeo_utm()
# the pseudo-georeferencing CRS UL corner is at 0,0
# but our shot coordinates aren't, so we need to offset them
raster = gdal.Open(pseudo_geotiff)
ulx, xres, _, uly, _, yres = raster.GetGeoTransform()
lrx = ulx + (raster.RasterXSize * xres)
lry = uly + (raster.RasterYSize * yres)
pseudo_geocoords = np.array([[1.0 / get_pseudogeo_scale() ** 2, 0, 0, ulx + lrx / 2.0],
[0, 1.0 / get_pseudogeo_scale() ** 2, 0, uly + lry / 2.0],
[0, 0, 1, 0],
[0, 0, 0, 1]])
raster = None
pseudo = True
# Couldn't get a SRS?
if utm_srs is None:
return None
crstrans = transformer(CRS.from_proj4(utm_srs), CRS.from_epsg("4326"))
if os.path.exists(reconstruction_file):
with open(reconstruction_file, 'r') as fin:
reconstructions = json.loads(fin.read())
feats = []
added_shots = {}
for recon in reconstructions:
cameras = recon.get('cameras', {})
for filename in recon.get('shots', {}):
shot = recon['shots'][filename]
cam = shot.get('camera')
if (not cam in cameras) or (filename in added_shots):
continue
cam = cameras[cam]
if pseudo_geocoords is not None:
Rs, T = pseudo_geocoords[:3, :3], pseudo_geocoords[:3, 3]
Rs1 = np.linalg.inv(Rs)
origin = get_origin(shot)
# Translation
utm_coords = np.dot(Rs, origin) + T
trans_coords = crstrans.TransformPoint(utm_coords[0], utm_coords[1], utm_coords[2])
# Rotation
rotation_matrix = get_rotation_matrix(np.array(shot['rotation']))
rotation = matrix_to_rotation(np.dot(rotation_matrix, Rs1))
translation = origin
else:
rotation = shot['rotation']
# Just add UTM offset
origin = get_origin(shot)
utm_coords = [origin[0] + utm_offset[0],
origin[1] + utm_offset[1],
origin[2]]
translation = utm_coords
trans_coords = crstrans.TransformPoint(utm_coords[0], utm_coords[1], utm_coords[2])
feats.append({
'type': 'Feature',
'properties': {
'filename': filename,
'focal': cam.get('focal', cam.get('focal_x')), # Focal ratio = focal length (mm) / max(sensor_width, sensor_height) (mm)
'width': cam.get('width', 0),
'height': cam.get('height', 0),
'translation': list(translation),
'rotation': list(rotation)
},
'geometry':{
'type': 'Point',
'coordinates': list(trans_coords)
}
})
added_shots[filename] = True
return {
'type': 'FeatureCollection',
'features': feats
}
else:
raise RuntimeError("%s does not exist." % reconstruction_file)
def merge_geojson_shots(geojson_shots_files, output_geojson_file):
result = {}
added_files = {}
for shot_file in geojson_shots_files:
with open(shot_file, "r") as f:
shots = json.loads(f.read())
if len(result) == 0:
for feat in shots.get('features', []):
added_files[feat['properties']['filename']] = True
# Use first file as base
result = shots
else:
# Append features if filename not already added
for feat in shots.get('features', []):
if not feat['properties']['filename'] in added_files:
result['features'].append(feat)
with open(output_geojson_file, "w") as f:
f.write(json.dumps(result))