kopia lustrzana https://github.com/OpenDroneMap/ODM
Updated start-dev-env.sh, fix photo.py (get_xmp), misc Python 2 --> 3 changes
Former-commit-id: 07fc3c3ff8
pull/1161/head
rodzic
443560f047
commit
4ba6716a54
|
@ -24,4 +24,5 @@ ceres-solver.tar.gz
|
||||||
*.pyc
|
*.pyc
|
||||||
opencv.zip
|
opencv.zip
|
||||||
settings.yaml
|
settings.yaml
|
||||||
.setupdevenv
|
.setupdevenv
|
||||||
|
__pycache__
|
||||||
|
|
11
configure.sh
11
configure.sh
|
@ -14,7 +14,6 @@ check_version(){
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
check_version
|
|
||||||
|
|
||||||
if [[ $2 =~ ^[0-9]+$ ]] ; then
|
if [[ $2 =~ ^[0-9]+$ ]] ; then
|
||||||
processes=$2
|
processes=$2
|
||||||
|
@ -36,7 +35,11 @@ install() {
|
||||||
echo "Installing sudo"
|
echo "Installing sudo"
|
||||||
apt-get update && apt-get install -y sudo
|
apt-get update && apt-get install -y sudo
|
||||||
fi
|
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 add-apt-repository -y ppa:ubuntugis/ubuntugis-unstable
|
||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
|
|
||||||
|
@ -110,6 +113,8 @@ install() {
|
||||||
}
|
}
|
||||||
|
|
||||||
uninstall() {
|
uninstall() {
|
||||||
|
check_version
|
||||||
|
|
||||||
echo "Removing SuperBuild and build directories"
|
echo "Removing SuperBuild and build directories"
|
||||||
cd ${RUNPATH}/SuperBuild
|
cd ${RUNPATH}/SuperBuild
|
||||||
rm -rfv build src download install
|
rm -rfv build src download install
|
||||||
|
@ -118,6 +123,8 @@ uninstall() {
|
||||||
}
|
}
|
||||||
|
|
||||||
reinstall() {
|
reinstall() {
|
||||||
|
check_version
|
||||||
|
|
||||||
echo "Reinstalling ODM modules"
|
echo "Reinstalling ODM modules"
|
||||||
uninstall
|
uninstall
|
||||||
install
|
install
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
import io
|
|
||||||
import logging
|
import logging
|
||||||
import re
|
import re
|
||||||
|
|
||||||
|
@ -8,6 +7,7 @@ from six import string_types
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
import pytz
|
import pytz
|
||||||
|
|
||||||
|
from opendm import io
|
||||||
from opendm import log
|
from opendm import log
|
||||||
from opendm import system
|
from opendm import system
|
||||||
import xmltodict as x2d
|
import xmltodict as x2d
|
||||||
|
@ -15,8 +15,7 @@ from opendm import get_image_size
|
||||||
from xml.parsers.expat import ExpatError
|
from xml.parsers.expat import ExpatError
|
||||||
|
|
||||||
class ODM_Photo:
|
class ODM_Photo:
|
||||||
""" ODMPhoto - a class for ODMPhotos
|
"""ODMPhoto - a class for ODMPhotos"""
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self, path_file):
|
def __init__(self, path_file):
|
||||||
# Standard tags (virtually all photos have these)
|
# Standard tags (virtually all photos have these)
|
||||||
|
@ -85,13 +84,13 @@ class ODM_Photo:
|
||||||
try:
|
try:
|
||||||
if 'Image Make' in tags:
|
if 'Image Make' in tags:
|
||||||
try:
|
try:
|
||||||
self.camera_make = tags['Image Make'].values.encode('utf8')
|
self.camera_make = tags['Image Make'].values
|
||||||
except UnicodeDecodeError:
|
except UnicodeDecodeError:
|
||||||
log.ODM_WARNING("EXIF Image Make might be corrupted")
|
log.ODM_WARNING("EXIF Image Make might be corrupted")
|
||||||
self.camera_make = "unknown"
|
self.camera_make = "unknown"
|
||||||
if 'Image Model' in tags:
|
if 'Image Model' in tags:
|
||||||
try:
|
try:
|
||||||
self.camera_model = tags['Image Model'].values.encode('utf8')
|
self.camera_model = tags['Image Model'].values
|
||||||
except UnicodeDecodeError:
|
except UnicodeDecodeError:
|
||||||
log.ODM_WARNING("EXIF Image Model might be corrupted")
|
log.ODM_WARNING("EXIF Image Model might be corrupted")
|
||||||
self.camera_model = "unknown"
|
self.camera_model = "unknown"
|
||||||
|
@ -129,7 +128,7 @@ class ODM_Photo:
|
||||||
if 'Image BitsPerSample' in tags:
|
if 'Image BitsPerSample' in tags:
|
||||||
self.bits_per_sample = self.int_value(tags['Image BitsPerSample'])
|
self.bits_per_sample = self.int_value(tags['Image BitsPerSample'])
|
||||||
if 'EXIF DateTimeOriginal' in tags:
|
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")
|
utc_time = datetime.strptime(str_time, "%Y:%m:%d %H:%M:%S")
|
||||||
subsec = 0
|
subsec = 0
|
||||||
if 'EXIF SubSecTime' in tags:
|
if 'EXIF SubSecTime' in tags:
|
||||||
|
@ -146,7 +145,7 @@ class ODM_Photo:
|
||||||
epoch = timezone.localize(datetime.utcfromtimestamp(0))
|
epoch = timezone.localize(datetime.utcfromtimestamp(0))
|
||||||
self.utc_time = (timezone.localize(utc_time) - epoch).total_seconds() * 1000.0
|
self.utc_time = (timezone.localize(utc_time) - epoch).total_seconds() * 1000.0
|
||||||
except Exception as e:
|
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
|
# Extract XMP tags
|
||||||
|
@ -262,15 +261,15 @@ class ODM_Photo:
|
||||||
|
|
||||||
# From https://github.com/mapillary/OpenSfM/blob/master/opensfm/exif.py
|
# From https://github.com/mapillary/OpenSfM/blob/master/opensfm/exif.py
|
||||||
def get_xmp(self, file):
|
def get_xmp(self, file):
|
||||||
img_str = str(file.read())
|
img_bytes = file.read()
|
||||||
xmp_start = img_str.find('<x:xmpmeta')
|
xmp_start = img_bytes.find(b'<x:xmpmeta')
|
||||||
xmp_end = img_str.find('</x:xmpmeta')
|
xmp_end = img_bytes.find(b'</x:xmpmeta')
|
||||||
|
|
||||||
if xmp_start < xmp_end:
|
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:
|
try:
|
||||||
xdict = x2d.parse(xmp_str)
|
xdict = x2d.parse(xmp_str)
|
||||||
except ExpatError:
|
except ExpatError as e:
|
||||||
from bs4 import BeautifulSoup
|
from bs4 import BeautifulSoup
|
||||||
xmp_str = str(BeautifulSoup(xmp_str, 'xml'))
|
xmp_str = str(BeautifulSoup(xmp_str, 'xml'))
|
||||||
xdict = x2d.parse(xmp_str)
|
xdict = x2d.parse(xmp_str)
|
||||||
|
@ -297,7 +296,7 @@ class ODM_Photo:
|
||||||
|
|
||||||
def float_values(self, tag):
|
def float_values(self, tag):
|
||||||
if isinstance(tag.values, list):
|
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:
|
else:
|
||||||
return [float(tag.values.num) / float(tag.values.den)]
|
return [float(tag.values.num) / float(tag.values.den)]
|
||||||
|
|
||||||
|
@ -308,7 +307,7 @@ class ODM_Photo:
|
||||||
|
|
||||||
def int_values(self, tag):
|
def int_values(self, tag):
|
||||||
if isinstance(tag.values, list):
|
if isinstance(tag.values, list):
|
||||||
return map(int, tag.values)
|
return [int(v) for v in tag.values]
|
||||||
else:
|
else:
|
||||||
return [int(tag.values)]
|
return [int(tag.values)]
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,7 @@ class Broadcaster:
|
||||||
global_progress = 100
|
global_progress = 100
|
||||||
|
|
||||||
try:
|
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:
|
except:
|
||||||
log.ODM_WARNING("Failed to broadcast progress update on UDP port %s" % str(self.port))
|
log.ODM_WARNING("Failed to broadcast progress update on UDP port %s" % str(self.port))
|
||||||
|
|
||||||
|
|
3
run.sh
3
run.sh
|
@ -1,7 +1,6 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
RUNPATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
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
|
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$RUNPATH/SuperBuild/install/lib
|
||||||
python $RUNPATH/run.py "$@"
|
python3 $RUNPATH/run.py "$@"
|
||||||
|
|
||||||
|
|
|
@ -6,19 +6,19 @@ from opendm import io
|
||||||
from opendm import system
|
from opendm import system
|
||||||
from opendm import log
|
from opendm import log
|
||||||
|
|
||||||
from dataset import ODMLoadDatasetStage
|
from stages.dataset import ODMLoadDatasetStage
|
||||||
from run_opensfm import ODMOpenSfMStage
|
from stages.run_opensfm import ODMOpenSfMStage
|
||||||
from mve import ODMMveStage
|
from stages.mve import ODMMveStage
|
||||||
from odm_slam import ODMSlamStage
|
from stages.odm_slam import ODMSlamStage
|
||||||
from odm_meshing import ODMeshingStage
|
from stages.odm_meshing import ODMeshingStage
|
||||||
from mvstex import ODMMvsTexStage
|
from stages.mvstex import ODMMvsTexStage
|
||||||
from odm_georeferencing import ODMGeoreferencingStage
|
from stages.odm_georeferencing import ODMGeoreferencingStage
|
||||||
from odm_orthophoto import ODMOrthoPhotoStage
|
from stages.odm_orthophoto import ODMOrthoPhotoStage
|
||||||
from odm_dem import ODMDEMStage
|
from stages.odm_dem import ODMDEMStage
|
||||||
from odm_filterpoints import ODMFilterPoints
|
from stages.odm_filterpoints import ODMFilterPoints
|
||||||
from splitmerge import ODMSplitStage, ODMMergeStage
|
from stages.splitmerge import ODMSplitStage, ODMMergeStage
|
||||||
from odm_report import ODMReport
|
|
||||||
|
|
||||||
|
from stages.odm_report import ODMReport
|
||||||
|
|
||||||
class ODMApp:
|
class ODMApp:
|
||||||
def __init__(self, args):
|
def __init__(self, args):
|
||||||
|
|
|
@ -75,6 +75,7 @@ fi
|
||||||
|
|
||||||
export PORT="${PORT:=3000}"
|
export PORT="${PORT:=3000}"
|
||||||
export QTC="${QTC:=NO}"
|
export QTC="${QTC:=NO}"
|
||||||
|
export IMAGE="${IMAGE:=opendronemap/nodeodm}"
|
||||||
|
|
||||||
if [ -z "$DATA" ]; then
|
if [ -z "$DATA" ]; then
|
||||||
echo "Usage: DATA=/path/to/datasets [VARS] $0"
|
echo "Usage: DATA=/path/to/datasets [VARS] $0"
|
||||||
|
@ -82,6 +83,7 @@ if [ -z "$DATA" ]; then
|
||||||
echo "VARS:"
|
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 " 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 " 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)"
|
echo " QTC When set to YES, installs QT Creator for C++ development (default: $QTC)"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
@ -89,8 +91,9 @@ fi
|
||||||
|
|
||||||
echo "Starting development environment..."
|
echo "Starting development environment..."
|
||||||
echo "Datasets path: $DATA"
|
echo "Datasets path: $DATA"
|
||||||
echo "NodeODM port: $PORT"
|
echo "Expose port: $PORT"
|
||||||
echo "QT Creator: $QTC"
|
echo "QT Creator: $QTC"
|
||||||
|
echo "Image: $IMAGE"
|
||||||
|
|
||||||
if [ ! -e "$HOME"/.odm-dev-home ]; then
|
if [ ! -e "$HOME"/.odm-dev-home ]; then
|
||||||
mkdir -p "$HOME"/.odm-dev-home
|
mkdir -p "$HOME"/.odm-dev-home
|
||||||
|
@ -100,5 +103,5 @@ USER_ID=$(id -u)
|
||||||
GROUP_ID=$(id -g)
|
GROUP_ID=$(id -g)
|
||||||
USER=$(id -un)
|
USER=$(id -un)
|
||||||
xhost +
|
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
|
exit 0
|
Ładowanie…
Reference in New Issue