diff --git a/modules/odm_orthophoto/src/OdmOrthoPhoto.cpp b/modules/odm_orthophoto/src/OdmOrthoPhoto.cpp index 846ce93f..8d7990b2 100644 --- a/modules/odm_orthophoto/src/OdmOrthoPhoto.cpp +++ b/modules/odm_orthophoto/src/OdmOrthoPhoto.cpp @@ -1075,8 +1075,11 @@ void OdmOrthoPhoto::renderPixel(int row, int col, float s, float t, const cv::Ma b += static_cast(tr[0]) * dl * db; b += static_cast(bl[0]) * dr * dt; b += static_cast(br[0]) * dl * dt; - - photo_.at >(row,col) = cv::Vec(static_cast(b), static_cast(g), static_cast(r), static_cast(maxRange())); + + photo_.at >(row,col) = cv::Vec(static_cast(b), + static_cast(g), + static_cast(r), + static_cast(maxRange())); } void OdmOrthoPhoto::getBarycentricCoordinates(pcl::PointXYZ v1, pcl::PointXYZ v2, pcl::PointXYZ v3, float x, float y, float &l1, float &l2, float &l3) const diff --git a/opendm/cropper.py b/opendm/cropper.py index 2d82be9a..b372842a 100644 --- a/opendm/cropper.py +++ b/opendm/cropper.py @@ -17,7 +17,7 @@ class Cropper: return os.path.join(self.storage_dir, '{}.{}'.format(self.files_prefix, suffix)) @staticmethod - def crop(gpkg_path, geotiff_path, gdal_options, keep_original=True): + def crop(gpkg_path, geotiff_path, gdal_options, keep_original=True, warp_options=[]): if not os.path.exists(gpkg_path) or not os.path.exists(geotiff_path): log.ODM_WARNING("Either {} or {} does not exist, will skip cropping.".format(gpkg_path, geotiff_path)) return geotiff_path @@ -44,12 +44,14 @@ class Cropper: 'geotiffInput': original_geotiff, 'geotiffOutput': geotiff_path, 'options': ' '.join(map(lambda k: '-co {}={}'.format(k, gdal_options[k]), gdal_options)), + 'warpOptions': ' '.join(warp_options), 'max_memory': get_max_memory() } run('gdalwarp -cutline {gpkg_path} ' '-crop_to_cutline ' '{options} ' + '{warpOptions} ' '{geotiffInput} ' '{geotiffOutput} ' '--config GDAL_CACHEMAX {max_memory}%'.format(**kwargs)) diff --git a/opendm/orthophoto.py b/opendm/orthophoto.py index 09e3944c..e04c855b 100644 --- a/opendm/orthophoto.py +++ b/opendm/orthophoto.py @@ -1,5 +1,8 @@ +import os from opendm import log from opendm import system +from opendm.cropper import Cropper +from opendm.concurrency import get_max_memory def get_orthophoto_vars(args): return { @@ -20,4 +23,23 @@ def build_overviews(orthophoto_file): system.run('gdaladdo -ro -r average ' '--config BIGTIFF_OVERVIEW IF_SAFER ' '--config COMPRESS_OVERVIEW JPEG ' - '{orthophoto} 2 4 8 16'.format(**kwargs)) \ No newline at end of file + '{orthophoto} 2 4 8 16'.format(**kwargs)) + +def generate_png(orthophoto_file): + log.ODM_INFO("Generating PNG") + base, ext = os.path.splitext(orthophoto_file) + orthophoto_png = base + '.png' + + system.run('gdal_translate -of png "%s" "%s" ' + '--config GDAL_CACHEMAX %s%% ' % (orthophoto_file, orthophoto_png, get_max_memory())) + + +def post_orthophoto_steps(args, bounds_file_path, orthophoto_file): + if args.crop > 0: + Cropper.crop(bounds_file_path, orthophoto_file, get_orthophoto_vars(args), warp_options=['-dstalpha']) + + if args.build_overviews: + build_overviews(orthophoto_file) + + if args.orthophoto_png: + generate_png(orthophoto_file) \ No newline at end of file diff --git a/stages/odm_orthophoto.py b/stages/odm_orthophoto.py index 99189104..2dfc59ce 100644 --- a/stages/odm_orthophoto.py +++ b/stages/odm_orthophoto.py @@ -8,7 +8,6 @@ from opendm import types from opendm import gsd from opendm import orthophoto from opendm.concurrency import get_max_memory -from opendm.cropper import Cropper from opendm.cutline import compute_cutline @@ -98,8 +97,10 @@ class ODMOrthoPhotoStage(types.ODM_Stage): system.run('gdal_translate -a_ullr {ulx} {uly} {lrx} {lry} ' '{vars} ' + '-b 1 -b 2 -b 3 -mask 4 ' '-a_srs \"{proj}\" ' '--config GDAL_CACHEMAX {max_memory}% ' + '--config GDAL_TIFF_INTERNAL_MASK YES ' '{input} {output} > {log}'.format(**kwargs)) bounds_file_path = os.path.join(tree.odm_georeferencing, 'odm_georeferenced_model.bounds.gpkg') @@ -114,11 +115,7 @@ class ODMOrthoPhotoStage(types.ODM_Stage): tmpdir=os.path.join(tree.odm_orthophoto, "grass_cutline_tmpdir"), scale=0.25) - if args.crop > 0: - Cropper.crop(bounds_file_path, tree.odm_orthophoto_tif, orthophoto_vars) - - if args.build_overviews: - orthophoto.build_overviews(tree.odm_orthophoto_tif) + orthophoto.post_orthophoto_steps(args, bounds_file_path, tree.odm_orthophoto_tif) geotiffcreated = True if not geotiffcreated: diff --git a/stages/splitmerge.py b/stages/splitmerge.py index bf0a2afb..bbacd552 100644 --- a/stages/splitmerge.py +++ b/stages/splitmerge.py @@ -283,14 +283,7 @@ class ODMMergeStage(types.ODM_Stage): os.remove(merged_geotiff) - # Crop - if args.crop > 0: - Cropper.crop(merged_bounds_file, tree.odm_orthophoto_tif, orthophoto_vars) - - # Overviews - if args.build_overviews: - orthophoto.build_overviews(tree.odm_orthophoto_tif) - + orthophoto.post_orthophoto_steps(args, merged_bounds_file, tree.odm_orthophoto_tif) elif len(all_orthos_and_cutlines) == 1: # Simply copy log.ODM_WARNING("A single orthophoto/cutline pair was found between all submodels.") diff --git a/start-dev-env.sh b/start-dev-env.sh index 1cdb68bd..69fa4ad6 100755 --- a/start-dev-env.sh +++ b/start-dev-env.sh @@ -15,6 +15,11 @@ if [ "$1" = "--setup" ]; then chown -R $3:$4 /code /var/www fi + echo "Adding $2 to /etc/passwd" + echo "$2:x:$3:$4::/home/$2:/bin/bash" >> /etc/passwd + echo "Adding $2 to /etc/group" + echo "$2:x:$4:" >> /etc/group + echo "echo '' && echo '' && echo '' && echo '###################################' && echo 'ODM Dev Environment Ready. Hack on!' && echo '###################################' && echo '' && cd /code" > $HOME/.bashrc # Install qt creator @@ -32,8 +37,8 @@ if [ "$1" = "--setup" ]; then fi if [ -e "$HOME/liquidprompt" ]; then - echo "export LP_PS1_PREFIX='(odmdev)'" >> $HOME/.bashrc echo "source $HOME/liquidprompt/liquidprompt" >> $HOME/.bashrc + echo "export LP_PS1_PREFIX='(odmdev)'" >> $HOME/.bashrc fi # Colors @@ -95,5 +100,5 @@ USER_ID=$(id -u) GROUP_ID=$(id -g) USER=$(id -un) xhost + -docker run -ti --entrypoint bash --name odmdev -v $(pwd):/code -v "$DATA":/datasets -p $PORT:3000 --privileged -e DISPLAY -e LANG=C.UTF-8 -e LC_ALL=C.UTF-8 -v="/etc/passwd:/etc/passwd:ro" -v="/tmp/.X11-unix:/tmp/.X11-unix:rw" -v="$HOME/.odm-dev-home:/home/$USER" opendronemap/nodeodm -c "/code/start-dev-env.sh --setup $USER $USER_ID $GROUP_ID $QTC" +docker run -ti --entrypoint bash --name odmdev -v $(pwd):/code -v "$DATA":/datasets -p $PORT:3000 --privileged -e DISPLAY -e LANG=C.UTF-8 -e LC_ALL=C.UTF-8 -v="/tmp/.X11-unix:/tmp/.X11-unix:rw" -v="$HOME/.odm-dev-home:/home/$USER" opendronemap/nodeodm -c "/code/start-dev-env.sh --setup $USER $USER_ID $GROUP_ID $QTC" exit 0 \ No newline at end of file