Updated start-dev-env.sh, fix photo.py (get_xmp), misc Python 2 --> 3 changes

Former-commit-id: 07fc3c3ff8
pull/1161/head
Piero Toffanin 2020-09-09 12:10:24 -04:00
rodzic 443560f047
commit 4ba6716a54
7 zmienionych plików z 43 dodań i 34 usunięć

3
.gitignore vendored
Wyświetl plik

@ -24,4 +24,5 @@ ceres-solver.tar.gz
*.pyc
opencv.zip
settings.yaml
.setupdevenv
.setupdevenv
__pycache__

Wyświetl plik

@ -14,7 +14,6 @@ check_version(){
exit 1
fi
}
check_version
if [[ $2 =~ ^[0-9]+$ ]] ; then
processes=$2
@ -36,7 +35,11 @@ install() {
echo "Installing sudo"
apt-get update && apt-get install -y sudo
fi
sudo apt-get update && sudo apt-get install software-properties-common -y --no-install-recommends
sudo apt-get update && sudo apt-get install software-properties-common lsb-release tzdata -y --no-install-recommends
# Check version
check_version
sudo add-apt-repository -y ppa:ubuntugis/ubuntugis-unstable
sudo apt-get update
@ -110,6 +113,8 @@ install() {
}
uninstall() {
check_version
echo "Removing SuperBuild and build directories"
cd ${RUNPATH}/SuperBuild
rm -rfv build src download install
@ -118,6 +123,8 @@ uninstall() {
}
reinstall() {
check_version
echo "Reinstalling ODM modules"
uninstall
install

Wyświetl plik

@ -1,4 +1,3 @@
import io
import logging
import re
@ -8,6 +7,7 @@ from six import string_types
from datetime import datetime, timedelta
import pytz
from opendm import io
from opendm import log
from opendm import system
import xmltodict as x2d
@ -15,8 +15,7 @@ from opendm import get_image_size
from xml.parsers.expat import ExpatError
class ODM_Photo:
""" ODMPhoto - a class for ODMPhotos
"""
"""ODMPhoto - a class for ODMPhotos"""
def __init__(self, path_file):
# Standard tags (virtually all photos have these)
@ -85,13 +84,13 @@ class ODM_Photo:
try:
if 'Image Make' in tags:
try:
self.camera_make = tags['Image Make'].values.encode('utf8')
self.camera_make = tags['Image Make'].values
except UnicodeDecodeError:
log.ODM_WARNING("EXIF Image Make might be corrupted")
self.camera_make = "unknown"
if 'Image Model' in tags:
try:
self.camera_model = tags['Image Model'].values.encode('utf8')
self.camera_model = tags['Image Model'].values
except UnicodeDecodeError:
log.ODM_WARNING("EXIF Image Model might be corrupted")
self.camera_model = "unknown"
@ -129,7 +128,7 @@ class ODM_Photo:
if 'Image BitsPerSample' in tags:
self.bits_per_sample = self.int_value(tags['Image BitsPerSample'])
if 'EXIF DateTimeOriginal' in tags:
str_time = tags['EXIF DateTimeOriginal'].values.encode('utf8')
str_time = tags['EXIF DateTimeOriginal'].values
utc_time = datetime.strptime(str_time, "%Y:%m:%d %H:%M:%S")
subsec = 0
if 'EXIF SubSecTime' in tags:
@ -146,7 +145,7 @@ class ODM_Photo:
epoch = timezone.localize(datetime.utcfromtimestamp(0))
self.utc_time = (timezone.localize(utc_time) - epoch).total_seconds() * 1000.0
except Exception as e:
log.ODM_WARNING("Cannot read extended EXIF tags for %s: %s" % (_path_file, e.message))
log.ODM_WARNING("Cannot read extended EXIF tags for %s: %s" % (_path_file, str(e)))
# Extract XMP tags
@ -262,15 +261,15 @@ class ODM_Photo:
# From https://github.com/mapillary/OpenSfM/blob/master/opensfm/exif.py
def get_xmp(self, file):
img_str = str(file.read())
xmp_start = img_str.find('<x:xmpmeta')
xmp_end = img_str.find('</x:xmpmeta')
img_bytes = file.read()
xmp_start = img_bytes.find(b'<x:xmpmeta')
xmp_end = img_bytes.find(b'</x:xmpmeta')
if xmp_start < xmp_end:
xmp_str = img_str[xmp_start:xmp_end + 12]
xmp_str = img_bytes[xmp_start:xmp_end + 12].decode('utf8')
try:
xdict = x2d.parse(xmp_str)
except ExpatError:
except ExpatError as e:
from bs4 import BeautifulSoup
xmp_str = str(BeautifulSoup(xmp_str, 'xml'))
xdict = x2d.parse(xmp_str)
@ -297,7 +296,7 @@ class ODM_Photo:
def float_values(self, tag):
if isinstance(tag.values, list):
return map(lambda v: float(v.num) / float(v.den), tag.values)
return [float(v.num) / float(v.den) for v in tag.values]
else:
return [float(tag.values.num) / float(tag.values.den)]
@ -308,7 +307,7 @@ class ODM_Photo:
def int_values(self, tag):
if isinstance(tag.values, list):
return map(int, tag.values)
return [int(v) for v in tag.values]
else:
return [int(tag.values)]

Wyświetl plik

@ -32,7 +32,7 @@ class Broadcaster:
global_progress = 100
try:
sock.sendto("PGUP/{}/{}/{}".format(self.pid, self.project_name, float(global_progress)).encode('utf-8'), (UDP_IP, self.port))
sock.sendto("PGUP/{}/{}/{}".format(self.pid, self.project_name, float(global_progress)), (UDP_IP, self.port))
except:
log.ODM_WARNING("Failed to broadcast progress update on UDP port %s" % str(self.port))

3
run.sh
Wyświetl plik

@ -1,7 +1,6 @@
#!/bin/bash
RUNPATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
export PYTHONPATH=$RUNPATH/SuperBuild/install/lib/python2.7/dist-packages:$RUNPATH/SuperBuild/src/opensfm:$PYTHONPATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$RUNPATH/SuperBuild/install/lib
python $RUNPATH/run.py "$@"
python3 $RUNPATH/run.py "$@"

Wyświetl plik

@ -6,19 +6,19 @@ from opendm import io
from opendm import system
from opendm import log
from dataset import ODMLoadDatasetStage
from run_opensfm import ODMOpenSfMStage
from mve import ODMMveStage
from odm_slam import ODMSlamStage
from odm_meshing import ODMeshingStage
from mvstex import ODMMvsTexStage
from odm_georeferencing import ODMGeoreferencingStage
from odm_orthophoto import ODMOrthoPhotoStage
from odm_dem import ODMDEMStage
from odm_filterpoints import ODMFilterPoints
from splitmerge import ODMSplitStage, ODMMergeStage
from odm_report import ODMReport
from stages.dataset import ODMLoadDatasetStage
from stages.run_opensfm import ODMOpenSfMStage
from stages.mve import ODMMveStage
from stages.odm_slam import ODMSlamStage
from stages.odm_meshing import ODMeshingStage
from stages.mvstex import ODMMvsTexStage
from stages.odm_georeferencing import ODMGeoreferencingStage
from stages.odm_orthophoto import ODMOrthoPhotoStage
from stages.odm_dem import ODMDEMStage
from stages.odm_filterpoints import ODMFilterPoints
from stages.splitmerge import ODMSplitStage, ODMMergeStage
from stages.odm_report import ODMReport
class ODMApp:
def __init__(self, args):

Wyświetl plik

@ -75,6 +75,7 @@ fi
export PORT="${PORT:=3000}"
export QTC="${QTC:=NO}"
export IMAGE="${IMAGE:=opendronemap/nodeodm}"
if [ -z "$DATA" ]; then
echo "Usage: DATA=/path/to/datasets [VARS] $0"
@ -82,6 +83,7 @@ if [ -z "$DATA" ]; then
echo "VARS:"
echo " DATA Path to directory that contains datasets for testing. The directory will be mounted in /datasets. If you don't have any, simply set it to a folder outside the ODM repository."
echo " PORT Port to expose for NodeODM (default: $PORT)"
echo " IMAGE Docker image to use (default: $IMAGE)"
echo " QTC When set to YES, installs QT Creator for C++ development (default: $QTC)"
exit 1
fi
@ -89,8 +91,9 @@ fi
echo "Starting development environment..."
echo "Datasets path: $DATA"
echo "NodeODM port: $PORT"
echo "Expose port: $PORT"
echo "QT Creator: $QTC"
echo "Image: $IMAGE"
if [ ! -e "$HOME"/.odm-dev-home ]; then
mkdir -p "$HOME"/.odm-dev-home
@ -100,5 +103,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="/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" $IMAGE -c "/code/start-dev-env.sh --setup $USER $USER_ID $GROUP_ID $QTC"
exit 0