Difference between revisions of "Running OpenDroneMap"

From Geomaster, Lda
Jump to navigation Jump to search
 
(37 intermediate revisions by the same user not shown)
Line 1: Line 1:
 +
=== Drone Workshop ===
 +
 +
Part I
 +
 +
0. The data
 +
 +
EPSG:25832
 +
 +
0.1 The images
 +
 +
0.2 The ground control points
 +
 +
0.2.1 Discuss how to get GCP: survey or from a reference dataset
 +
 +
0.3 The flight path
 +
 +
 +
1. WebODM
 +
 +
1.2 Preparation and Installation
 +
 +
1.3 Run our first task
 +
 +
 +
2. Overview of the products
 +
 +
2.1 Orthophoto
 +
 +
2.2 Point cloud
 +
 +
2.3 DSM
 +
 +
2.4 DTM
 +
 +
Part II
 +
 +
3. Fine tunning the data
 +
 +
3.1 Clip orthophoto
 +
 +
Create a mask layer
 +
 +
Clip
 +
 +
Enable JPG compression
 +
 +
3.2 Point cloud
 +
 +
Clip with pdal
 +
 +
Classify with pdal
 +
 +
 +
 +
4. Taking advantagle of the artifacts
 +
 +
 +
 +
 +
 +
 +
 +
[[Drone workshop print screens]]
 +
 +
 +
 +
 +
 +
 +
 +
 +
1. Flight
 +
 +
WebODM
 +
 +
<syntaxhighlight lang="bash">
 +
pip install docker-compose
 +
</syntaxhighlight>
 +
 +
10:54
 +
 +
2. Data products
 +
 +
2.1 Orthophoto
 +
 +
Discussion: GCP, impact on the elevation model
 +
 +
Swipe tool
 +
 +
Point value: check ortho values
 +
 +
2.2 DEM/DSM
 +
 +
Discussion: difference between
 +
 +
Raster value
 +
 +
Profile tool
 +
 +
Visualization: hillshade
 +
 +
http://plas.io/
 +
 +
https://pdal.io/tutorial/pcl_ground/index.html#pcl-ground
 +
 +
<syntaxhighlight lang="bash">
 +
-- original
 +
pdal translate -i /code/odm_georeferencing/odm_georeferenced_model.laz -o /code/odm_georeferencing/odm_georeferenced_model.laz smrf --filters.smrf.cell=2 --filters.smrf.slope=10 --filters.smrf.window=10
 +
 +
-- VERY GOOD
 +
pdal translate -i odm_georeferencing/odm_georeferenced_model.ply -o odm_georeferencing/odm_georeferenced_model_2.laz smrf --filters.smrf.cell=2 --filters.smrf.window=10
 +
 +
-- good
 +
pdal ground -i odm_georeferencing/odm_georeferenced_model.ply -o odm_georeferencing/odm_georeferenced_model_3.laz
 +
</syntaxhighlight>
 +
 +
 +
PotreeConverter odm_georeferenced_model.ply -o ~/dev/potree/examples/odm -p qgis.drone.workshop --overwrite --projection "+proj=utm +zone=32 +ellps=GRS80 +towgs84=0.0.0.0.0.0.0 +units=m"
 +
 +
<syntaxhighlight lang="bash">
 +
jgr@zoe:~/dev/potree$ gulp watch
 +
</syntaxhighlight>
 +
 +
<syntaxhighlight lang="bash">
 +
jgr@zoe:~/dev/PotreeConverter/master/build/PotreeConverter$ PotreeConverter ~/Documentos/workshop2/odm_georeferencing/odm_georeferenced_model.ply -o ~/dev/potree/examples/odm -p qgis.drone.workshop --overwrite --projection "+proj=utm +zone=32 +ellps=GRS80 +towgs84=0.0.0.0.0.0.0 +units=m"
 +
</syntaxhighlight>
 +
 +
2.3 Point cloud
 +
 +
What we get from the software
 +
 +
Visualization tools
 +
 +
https://pdal.io/workshop/exercises/analysis/dtm/dtm.html
 +
 +
3. Processing data products
 +
 +
 +
3.1 Better classification
 +
 +
lasground
 +
 +
3.2 lasheight
 +
 +
3.3 lasclassify
 +
 +
=== DJI Mavic 2 PRO ===
 +
 +
[https://forum.dji.com/thread-167017-1-1.html Sensor size], [https://www.youtube.com/watch?v=xIncVCe6pg0 Video about sensor size]
 +
 +
==== Erro ====
 +
 +
Culpado: <syntaxhighlight lang="bash" inline>/home/jgr/PycharmProjects/OpenDroneMap/modules/odm_extract_utm</syntaxhighlight>
 +
 +
Todas as imagens estão com Exif.GPSInfo.GPSAltitude = 0.0
 +
 +
<syntaxhighlight lang="bash">
 +
      if (lon == 0.0 || lat == 0.0 || alt == 0.0) {
 +
        std::string error("Failed parsing GPS position for " + imageFilename);
 +
        throw UtmExtractorException(error);
 +
      }
 +
</syntaxhighlight>
 +
 +
==== Remendo ====
 +
 +
<syntaxhighlight lang="bash">
 +
exiv2 -pa DJI_0210.JPG
 +
Exif.GPSInfo.GPSAltitude                    Rational    1  0.0 m
 +
 +
exiv2 -M"set Exif.GPSInfo.GPSAltitude Rational 1/10" DJI_0210.JPG
 +
exiv2 -pa DJI_0210.JPG
 +
Exif.GPSInfo.GPSAltitude                    Rational    1  0.1 m
 +
</syntaxhighlight>
 +
 +
Chamada:
 +
 +
<syntaxhighlight lang="bash">
 +
[INFO]    Wrote images database: /code/images.json
 +
[INFO]    Found 106 usable images
 +
[DEBUG]  running /code/build/bin/odm_extract_utm -imagesPath /code/images/ -imageListFile /code/img_list.txt -outputCoordFile /code/odm_georeferencing/coords.txt  -logFile /code/odm_georeferencing/odm_georeferencing_utm_log.txt
 +
Error in OdmExtractUtm:
 +
Failed parsing GPS position for DJI_0301.JPG
 +
For more detailed information, see log file.
 +
</syntaxhighlight>
 +
 +
<syntaxhighlight lang="text">
 +
[INFO]    Found 106 usable images
 +
[WARNING] Could not generate coordinates file. Ignore if there is a GCP file. Error: Error in OdmExtractUtm:
 +
Failed parsing GPS position for DJI_0301.JPG
 +
For more detailed information, see log file.
 +
 +
(...)
 +
 +
Building objmodel:
 +
Saving model... done.
 +
Whole texturing procedure took: 225.586s
 +
[INFO]    Running ODM Texturing Cell - Finished
 +
[INFO]    Running ODM Georeferencing Cell
 +
[WARNING] Georeferencing failed. Make sure your photos have geotags in the EXIF or you have provided a GCP file.
 +
[INFO]    Running ODM Georeferencing Cell - Finished
 +
[INFO]    Running ODM DEM Cell
 +
[INFO]    Classify: True
 +
[INFO]    Create DSM: True
 +
[INFO]    Create DTM: True
 +
[INFO]    DEM input file /code/odm_georeferencing/odm_georeferenced_model.las found: False
 +
[WARNING] DEM will not be generated
 +
[INFO]    Running ODM DEM Cell - Finished
 +
[INFO]    Running ODM Orthophoto Cell
 +
[DEBUG]  running /code/build/bin/odm_orthophoto -inputFile /code/odm_texturing/odm_textured_model.obj -logFile /code/odm_orthophoto/odm_orthophoto_log.txt -outputFile /code/odm_orthophoto/odm_orthophoto.png -resolution 10.0  -outputCornerFile /code/odm_orthophoto/odm_orthophoto_corners.txt
 +
[WARNING] No geo-referenced orthophoto created due to missing geo-referencing or corner coordinates.
 +
[INFO]    Running ODM OrthoPhoto Cell - Finished
 +
[INFO]    OpenDroneMap app finished - Sat Dec 29 22:12:22  2018
 +
</syntaxhighlight>
 +
 
=== Running docker OpenDroneMap ===
 
=== Running docker OpenDroneMap ===
 +
 +
==== Update to last OpenDroneMap docker image ====
 +
 +
<syntaxhighlight lang="bash">
 +
docker pull opendronemap/opendronemap
 +
</syntaxhighlight>
 +
 +
==== OpenDroneMap docker image ====
  
 
# Install docker
 
# Install docker
Line 21: Line 243:
 
-v $odmi/odm_meshing:/code/odm_meshing \
 
-v $odmi/odm_meshing:/code/odm_meshing \
 
-v $odmi/opensfm:/code/opensfm \
 
-v $odmi/opensfm:/code/opensfm \
 +
-v $odmi/odm_dem:/code/odm_dem \
 
opendronemap/opendronemap --dtm --dsm  
 
opendronemap/opendronemap --dtm --dsm  
 
</syntaxhighlight>
 
</syntaxhighlight>
Line 52: Line 275:
 
-v $odmi/odm_meshing:/code/odm_meshing \
 
-v $odmi/odm_meshing:/code/odm_meshing \
 
-v $odmi/opensfm:/code/opensfm \
 
-v $odmi/opensfm:/code/opensfm \
opendronemap/opendronemap --dtm --dsm
+
-v $odmi/odm_dem:/code/odm_dem \
 +
opendronemap/opendronemap --dtm --dsm --orthophoto-resolution 10.0
 +
</syntaxhighlight>
 +
 
 +
Nota: os ortos estão a ficar com muitas interferências do modelo 3D, nas áreas urbanas.
 +
 
 +
Related problem: http://community.opendronemap.org/t/buildings/929
 +
 
 +
Será que voar com a câmara a 75 graus ajuda? Fiz um voo com Double Grid, com a camara a 70 graus (default do Pix4d capture).
 +
 
 +
==== Mac ====
 +
 
 +
1. Install Docker
 +
 
 +
2. <syntaxhighlight lang="bash">
 +
docker run -it --rm -v $(pwd)/images:/code/images -v $(pwd)/odm_orthophoto:/code/odm_orthophoto -v $(pwd)/odm_texturing:/code/odm_texturing -v $(pwd)/odm_georeferencing:/code/odm_georeferencing -v $(pwd)/odm_meshing:/code/odm_meshing -v $(pwd)/opensfm:/code/opensfm -v $(pwd)/odm_dem:/code/odm_dem opendronemap/opendronemap --dtm --dsm
 +
</syntaxhighlight>
 +
 
 +
With GCP (calculating 3000-y coordinate)
 +
 
 +
<syntaxhighlight lang="bash">
 +
docker run -it --rm -v $(pwd)/images:/code/images -v $(pwd)/odm_orthophoto:/code/odm_orthophoto -v $(pwd)/odm_texturing:/code/odm_texturing -v $(pwd)/odm_georeferencing:/code/odm_georeferencing -v $(pwd)/odm_meshing:/code/odm_meshing -v $(pwd)/opensfm:/code/opensfm -v $(pwd)/odm_dem:/code/odm_dem -v $(pwd)/gcp_list.txt:/code/gcp_list.txt opendronemap/opendronemap --dtm --dsm --gcp gcp_list.txt
 +
</syntaxhighlight>
 +
 
 +
With GCP (ignoring de - in y coordinate)
 +
 
 +
TIP: ignore the - (minus) in y axis.
 +
 
 +
<syntaxhighlight lang="bash">
 +
cd uav_nysted-1
 +
</syntaxhighlight>
 +
 
 +
<syntaxhighlight lang="bash">
 +
docker run -it --rm -v $(pwd)/images:/code/images -v $(pwd)/odm_orthophoto:/code/odm_orthophoto -v $(pwd)/odm_texturing:/code/odm_texturing -v $(pwd)/odm_georeferencing:/code/odm_georeferencing -v $(pwd)/odm_meshing:/code/odm_meshing -v $(pwd)/opensfm:/code/opensfm -v $(pwd)/odm_dem:/code/odm_dem -v $(pwd)/gcp_list.txt:/code/gcp_list.txt opendronemap/opendronemap --dtm --dsm --gcp gcp_list.txt
 +
</syntaxhighlight>
 +
 
 +
==== Windows ====
 +
 
 +
Install Docker
 +
 
 +
Configure docker (more CPU, more memory)
 +
 
 +
CPUs: 6
 +
 
 +
Memory: 12032 Mb
 +
 
 +
Swap: 4096 Mb
 +
 
 +
Create the projet folder structure
 +
 
 +
Project folder:
 +
c:\Users\dlt265\Documents\uav_sckovskolen_feb20018_incl_GCP\
 +
 
 +
Image folder:
 +
c:\Users\dlt265\Documents\uav_sckovskolen_feb20018_incl_GCP\images
 +
 
 +
Create folders for the OpenDroneMap output.
 +
 
 +
<syntaxhighlight lang="bash">
 +
cd Documents\uav_sckovskolen_feb20018_incl_GCP
 +
md odm_orthophoto
 +
md odm_texturing
 +
md odm_georeferencing
 +
md odm_meshing
 +
md opensfm
 +
md odm_dem
 +
</syntaxhighlight>
 +
 
 +
<syntaxhighlight lang="bash">
 +
docker run -it --rm -v $pwd/images:/code/images -v $pwd/odm_orthophoto:/code/odm_orthophoto -v $pwd/odm_texturing:/code/odm_texturing -v $pwd/odm_georeferencing:/code/odm_georeferencing -v $pwd/odm_meshing:/code/odm_meshing -v $pwd/opensfm:/code/opensfm -v $pwd/odm_dem:/code/odm_dem opendronemap/opendronemap --dtm --dsm
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
/home/jgr/OpenDroneMap/odm_data_aukerman/images
+
cd ~/Documentos/costanovadoprado2xgrid
 +
export odmi=`pwd`
  
 
docker run -it --rm \
 
docker run -it --rm \
-v /home/jgr/OpenDroneMap/odm_data_aukerman/images:/code/images \
+
-v $odmi/images:/code/images \
-v /home/jgr/OpenDroneMap/odm_data_aukerman/odm_orthophoto:/code/odm_orthophoto \
+
-v $odmi/odm_orthophoto:/code/odm_orthophoto \
-v /home/jgr/OpenDroneMap/odm_data_aukerman/odm_texturing:/code/odm_texturing \
+
-v $odmi/odm_texturing:/code/odm_texturing \
opendronemap/opendronemap
+
-v $odmi/odm_georeferencing:/code/odm_georeferencing \
 +
-v $odmi/odm_meshing:/code/odm_meshing \
 +
-v $odmi/opensfm:/code/opensfm \
 +
-v $odmi/odm_dem:/code/odm_dem \
 +
opendronemap/opendronemap --dtm --dsm --orthophoto-resolution 10.0 --mesh-octree-depth 10
 +
</syntaxhighlight>
 +
 
 +
=== OpenSFM viewer (update) ===
 +
 
 +
<syntaxhighlight lang="bash">
 +
sudo chown -R jgr:jgr *
 +
git clone https://github.com/mapillary/OpenSfM.git
 +
cd OpenSfM/viewer
 +
ln -s ../../images .
 +
python2 -m SimpleHTTPServer 7777
 +
</syntaxhighlight>
 +
 
 +
=== OpenSFM viewer ===
 +
 
 +
<syntaxhighlight lang="bash">
 +
jgr@zoe:~/Documentos/costanovadoprado$ sudo chown -R jgr:jgr *
 +
jgr@zoe:~/Documentos/costanovadoprado$ cp -r ~/dev/OpenSfM/viewer opensfm
 +
jgr@zoe:~/Documentos/costanovadoprado$ cd opensfm/
 +
jgr@zoe:~/Documentos/costanovadoprado/opensfm$ ln -s ../images .
 +
jgr@zoe:~/Documentos/costanovadoprado/opensfm$ python -m SimpleHTTPServer
 +
Serving HTTP on 0.0.0.0 port 8000 ...
 +
</syntaxhighlight>
 +
 
 +
http://localhost:8000/viewer/reconstruction.html#file=/reconstruction.json
 +
 
 +
==== OpenSFM view images on QGIS ====
 +
 
 +
/home/jgr/Documentos/costanovadoprado/images/DJI_0595.JPG
 +
 
 +
-8.7515052, 40.6114774, 22.4100000, 2018:08:23 10:05:11
 +
 
 +
/home/jgr/Documentos/costanovadoprado/opensfm/reference_lla.json
 +
 
 +
Centro aproximado do ortophoto resultante (adicionado ao projeto QGIS)
 +
 
 +
<syntaxhighlight lang="json">
 +
{
 +
    "latitude": 40.61272372901514,
 +
    "altitude": 0,
 +
    "longitude": -8.752983409509966
 +
}
 +
</syntaxhighlight>
  
 +
<syntaxhighlight lang="json">
 +
            "DJI_0595.JPG": {
 +
                "orientation": 1,
 +
                "camera": "v2 dji fc220 4000 3000 perspective 0.7222",
 +
                "gps_position": [
 +
                    125.10012061257521,
 +
                    -138.4010433354888,
 +
                    22.407269606366754
 +
                ],
 +
                "gps_dop": 15.0,
 +
                "rotation": [
 +
                    2.1445873611073996,
 +
                    -2.2856282209697523,
 +
                    0.20066193557381898
 +
                ],
 +
                "translation": [
 +
                    -132.67853610360638,
 +
                    133.40968771622724,
 +
                    1.9668907291333997
 +
                ],
 +
                "capture_time": 1535018711.0
 +
            },
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
https://github.com/mapillary/OpenSfM/blob/master/opensfm/commands/export_geocoords.py
 +
 +
jgr@zoe:~/Documentos/costanovadoprado/opensfm$ wget https://raw.githubusercontent.com/mapillary/OpenSfM/master/opensfm/commands/export_geocoords.py
 +
 +
NÃO FUNCIONOU...
 +
 +
export_geocoords.py -dataset costanova
 +
 +
Ver: https://github.com/mapillary/OpenSfM/issues/183
  
 
=== webODM ===
 
=== webODM ===
Line 77: Line 448:
  
 
jgrocha/xxbatata
 
jgrocha/xxbatata
 
  
 
=== Tools ===
 
=== Tools ===
Line 115: Line 485:
  
 
=== Build new image ===
 
=== Build new image ===
 +
 +
<syntaxhighlight lang="bash">
 +
jgr@zoe:~/PycharmProjects/OpenDroneMap$ docker build --no-cache -t odm_altitude_0 .
 +
</syntaxhighlight>
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
Line 121: Line 495:
  
 
=== Run new image ===
 
=== Run new image ===
 +
 +
<syntaxhighlight lang="bash">
 +
# cd "/mnt/bonn/nextCloud/Photos/DJI MAVIC PRO 2 Paradela/100MEDIA"
 +
cd /mnt/bonn/nextCloud/Photos
 +
ln -s 'DJI MAVIC PRO 2 Paradela/100MEDIA' images
 +
export odmi=`pwd`
 +
docker run --cpus 8 -it --rm -v $odmi/images:/code/images -v $odmi/odm_orthophoto:/code/odm_orthophoto -v $odmi/odm_texturing:/code/odm_texturing -v $odmi/odm_georeferencing:/code/odm_georeferencing -v $odmi/odm_meshing:/code/odm_meshing -v $odmi/opensfm:/code/opensfm -v $odmi/odm_dem:/code/odm_dem odm_altitude_0 --dtm --dsm --force-ccd 13.2
 +
# --orthophoto-resolution 2.0 --mesh-octree-depth 2 --opensfm-processes 8
 +
</syntaxhighlight>
 +
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">

Latest revision as of 16:49, 6 March 2019

Drone Workshop

Part I

0. The data

EPSG:25832

0.1 The images

0.2 The ground control points

0.2.1 Discuss how to get GCP: survey or from a reference dataset

0.3 The flight path


1. WebODM

1.2 Preparation and Installation

1.3 Run our first task


2. Overview of the products

2.1 Orthophoto

2.2 Point cloud

2.3 DSM

2.4 DTM

Part II

3. Fine tunning the data

3.1 Clip orthophoto

Create a mask layer

Clip

Enable JPG compression

3.2 Point cloud

Clip with pdal

Classify with pdal


4. Taking advantagle of the artifacts




Drone workshop print screens





1. Flight

WebODM

pip install docker-compose

10:54

2. Data products

2.1 Orthophoto

Discussion: GCP, impact on the elevation model

Swipe tool

Point value: check ortho values

2.2 DEM/DSM

Discussion: difference between

Raster value

Profile tool

Visualization: hillshade

http://plas.io/

https://pdal.io/tutorial/pcl_ground/index.html#pcl-ground

-- original
pdal translate -i /code/odm_georeferencing/odm_georeferenced_model.laz -o /code/odm_georeferencing/odm_georeferenced_model.laz smrf --filters.smrf.cell=2 --filters.smrf.slope=10 --filters.smrf.window=10

-- VERY GOOD
pdal translate -i odm_georeferencing/odm_georeferenced_model.ply -o odm_georeferencing/odm_georeferenced_model_2.laz smrf --filters.smrf.cell=2 --filters.smrf.window=10

-- good
pdal ground -i odm_georeferencing/odm_georeferenced_model.ply -o odm_georeferencing/odm_georeferenced_model_3.laz


PotreeConverter odm_georeferenced_model.ply -o ~/dev/potree/examples/odm -p qgis.drone.workshop --overwrite --projection "+proj=utm +zone=32 +ellps=GRS80 +towgs84=0.0.0.0.0.0.0 +units=m"

jgr@zoe:~/dev/potree$ gulp watch
jgr@zoe:~/dev/PotreeConverter/master/build/PotreeConverter$ PotreeConverter ~/Documentos/workshop2/odm_georeferencing/odm_georeferenced_model.ply -o ~/dev/potree/examples/odm -p qgis.drone.workshop --overwrite --projection "+proj=utm +zone=32 +ellps=GRS80 +towgs84=0.0.0.0.0.0.0 +units=m"

2.3 Point cloud

What we get from the software

Visualization tools

https://pdal.io/workshop/exercises/analysis/dtm/dtm.html

3. Processing data products


3.1 Better classification

lasground

3.2 lasheight

3.3 lasclassify

DJI Mavic 2 PRO

Sensor size, Video about sensor size

Erro

Culpado: /home/jgr/PycharmProjects/OpenDroneMap/modules/odm_extract_utm

Todas as imagens estão com Exif.GPSInfo.GPSAltitude = 0.0

      if (lon == 0.0 || lat == 0.0 || alt == 0.0) {
        std::string error("Failed parsing GPS position for " + imageFilename);
        throw UtmExtractorException(error);
      }

Remendo

exiv2 -pa DJI_0210.JPG
Exif.GPSInfo.GPSAltitude                     Rational    1  0.0 m

exiv2 -M"set Exif.GPSInfo.GPSAltitude Rational 1/10" DJI_0210.JPG
exiv2 -pa DJI_0210.JPG
Exif.GPSInfo.GPSAltitude                     Rational    1  0.1 m

Chamada:

[INFO]    Wrote images database: /code/images.json
[INFO]    Found 106 usable images
[DEBUG]   running /code/build/bin/odm_extract_utm -imagesPath /code/images/ -imageListFile /code/img_list.txt -outputCoordFile /code/odm_georeferencing/coords.txt  -logFile /code/odm_georeferencing/odm_georeferencing_utm_log.txt
Error in OdmExtractUtm:
Failed parsing GPS position for DJI_0301.JPG
For more detailed information, see log file.
[INFO]    Found 106 usable images
[WARNING] Could not generate coordinates file. Ignore if there is a GCP file. Error: Error in OdmExtractUtm:
Failed parsing GPS position for DJI_0301.JPG
For more detailed information, see log file.

(...)

Building objmodel:
	Saving model... done.
Whole texturing procedure took: 225.586s
[INFO]    Running ODM Texturing Cell - Finished
[INFO]    Running ODM Georeferencing Cell
[WARNING] Georeferencing failed. Make sure your photos have geotags in the EXIF or you have provided a GCP file. 
[INFO]    Running ODM Georeferencing Cell - Finished
[INFO]    Running ODM DEM Cell
[INFO]    Classify: True
[INFO]    Create DSM: True
[INFO]    Create DTM: True
[INFO]    DEM input file /code/odm_georeferencing/odm_georeferenced_model.las found: False
[WARNING] DEM will not be generated
[INFO]    Running ODM DEM Cell - Finished
[INFO]    Running ODM Orthophoto Cell
[DEBUG]   running /code/build/bin/odm_orthophoto -inputFile /code/odm_texturing/odm_textured_model.obj -logFile /code/odm_orthophoto/odm_orthophoto_log.txt -outputFile /code/odm_orthophoto/odm_orthophoto.png -resolution 10.0  -outputCornerFile /code/odm_orthophoto/odm_orthophoto_corners.txt
[WARNING] No geo-referenced orthophoto created due to missing geo-referencing or corner coordinates.
[INFO]    Running ODM OrthoPhoto Cell - Finished
[INFO]    OpenDroneMap app finished - Sat Dec 29 22:12:22  2018

Running docker OpenDroneMap

Update to last OpenDroneMap docker image

docker pull opendronemap/opendronemap

OpenDroneMap docker image

  1. Install docker
  2. Add you user to docker group
  3. sudo -H pip install requests
mkdir OpenDroneMap
cd OpenDroneMap
git clone git@github.com:OpenDroneMap/odm_data_aukerman.git
cd odm_data_aukerman

export odmi=`pwd`
ls -l $odmi

docker run -it --rm \
-v $odmi/images:/code/images \
-v $odmi/odm_orthophoto:/code/odm_orthophoto \
-v $odmi/odm_texturing:/code/odm_texturing \
-v $odmi/odm_georeferencing:/code/odm_georeferencing \
-v $odmi/odm_meshing:/code/odm_meshing \
-v $odmi/opensfm:/code/opensfm \
-v $odmi/odm_dem:/code/odm_dem \
opendronemap/opendronemap --dtm --dsm
cd /home/jgr/Documentos/sletten16maj2018-gcp
export odmi=`pwd`

docker run -it --rm \
-v $odmi/images:/code/images \
-v $odmi/gcp_list.txt:/code/gcp_list.txt \
-v $odmi/odm_orthophoto:/code/odm_orthophoto \
-v $odmi/odm_texturing:/code/odm_texturing \
-v $odmi/odm_georeferencing:/code/odm_georeferencing \
-v $odmi/odm_meshing:/code/odm_meshing \
-v $odmi/opensfm:/code/opensfm \
opendronemap/opendronemap --gcp gcp_list.txt --dtm --dsm

Sem GCP:

cd ~/Documentos/costanovadoprado/
export odmi=`pwd`

docker run -it --rm \
-v $odmi/images:/code/images \
-v $odmi/odm_orthophoto:/code/odm_orthophoto \
-v $odmi/odm_texturing:/code/odm_texturing \
-v $odmi/odm_georeferencing:/code/odm_georeferencing \
-v $odmi/odm_meshing:/code/odm_meshing \
-v $odmi/opensfm:/code/opensfm \
-v $odmi/odm_dem:/code/odm_dem \
opendronemap/opendronemap --dtm --dsm --orthophoto-resolution 10.0

Nota: os ortos estão a ficar com muitas interferências do modelo 3D, nas áreas urbanas.

Related problem: http://community.opendronemap.org/t/buildings/929

Será que voar com a câmara a 75 graus ajuda? Fiz um voo com Double Grid, com a camara a 70 graus (default do Pix4d capture).

Mac

1. Install Docker

2.

docker run -it --rm -v $(pwd)/images:/code/images -v $(pwd)/odm_orthophoto:/code/odm_orthophoto -v $(pwd)/odm_texturing:/code/odm_texturing -v $(pwd)/odm_georeferencing:/code/odm_georeferencing -v $(pwd)/odm_meshing:/code/odm_meshing -v $(pwd)/opensfm:/code/opensfm -v $(pwd)/odm_dem:/code/odm_dem opendronemap/opendronemap --dtm --dsm

With GCP (calculating 3000-y coordinate)

docker run -it --rm -v $(pwd)/images:/code/images -v $(pwd)/odm_orthophoto:/code/odm_orthophoto -v $(pwd)/odm_texturing:/code/odm_texturing -v $(pwd)/odm_georeferencing:/code/odm_georeferencing -v $(pwd)/odm_meshing:/code/odm_meshing -v $(pwd)/opensfm:/code/opensfm -v $(pwd)/odm_dem:/code/odm_dem -v $(pwd)/gcp_list.txt:/code/gcp_list.txt opendronemap/opendronemap --dtm --dsm --gcp gcp_list.txt

With GCP (ignoring de - in y coordinate)

TIP: ignore the - (minus) in y axis.

cd uav_nysted-1
docker run -it --rm -v $(pwd)/images:/code/images -v $(pwd)/odm_orthophoto:/code/odm_orthophoto -v $(pwd)/odm_texturing:/code/odm_texturing -v $(pwd)/odm_georeferencing:/code/odm_georeferencing -v $(pwd)/odm_meshing:/code/odm_meshing -v $(pwd)/opensfm:/code/opensfm -v $(pwd)/odm_dem:/code/odm_dem -v $(pwd)/gcp_list.txt:/code/gcp_list.txt opendronemap/opendronemap --dtm --dsm --gcp gcp_list.txt

Windows

Install Docker

Configure docker (more CPU, more memory)

CPUs: 6

Memory: 12032 Mb

Swap: 4096 Mb

Create the projet folder structure

Project folder: c:\Users\dlt265\Documents\uav_sckovskolen_feb20018_incl_GCP\

Image folder: c:\Users\dlt265\Documents\uav_sckovskolen_feb20018_incl_GCP\images

Create folders for the OpenDroneMap output.

cd Documents\uav_sckovskolen_feb20018_incl_GCP
md odm_orthophoto
md odm_texturing
md odm_georeferencing
md odm_meshing
md opensfm
md odm_dem
docker run -it --rm -v $pwd/images:/code/images -v $pwd/odm_orthophoto:/code/odm_orthophoto -v $pwd/odm_texturing:/code/odm_texturing -v $pwd/odm_georeferencing:/code/odm_georeferencing -v $pwd/odm_meshing:/code/odm_meshing -v $pwd/opensfm:/code/opensfm -v $pwd/odm_dem:/code/odm_dem opendronemap/opendronemap --dtm --dsm
cd ~/Documentos/costanovadoprado2xgrid
export odmi=`pwd`

docker run -it --rm \
-v $odmi/images:/code/images \
-v $odmi/odm_orthophoto:/code/odm_orthophoto \
-v $odmi/odm_texturing:/code/odm_texturing \
-v $odmi/odm_georeferencing:/code/odm_georeferencing \
-v $odmi/odm_meshing:/code/odm_meshing \
-v $odmi/opensfm:/code/opensfm \
-v $odmi/odm_dem:/code/odm_dem \
opendronemap/opendronemap --dtm --dsm --orthophoto-resolution 10.0 --mesh-octree-depth 10

OpenSFM viewer (update)

sudo chown -R jgr:jgr *
git clone https://github.com/mapillary/OpenSfM.git
cd OpenSfM/viewer
ln -s ../../images .
python2 -m SimpleHTTPServer 7777

OpenSFM viewer

jgr@zoe:~/Documentos/costanovadoprado$ sudo chown -R jgr:jgr *
jgr@zoe:~/Documentos/costanovadoprado$ cp -r ~/dev/OpenSfM/viewer opensfm
jgr@zoe:~/Documentos/costanovadoprado$ cd opensfm/
jgr@zoe:~/Documentos/costanovadoprado/opensfm$ ln -s ../images .
jgr@zoe:~/Documentos/costanovadoprado/opensfm$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...

http://localhost:8000/viewer/reconstruction.html#file=/reconstruction.json

OpenSFM view images on QGIS

/home/jgr/Documentos/costanovadoprado/images/DJI_0595.JPG

-8.7515052, 40.6114774, 22.4100000, 2018:08:23 10:05:11

/home/jgr/Documentos/costanovadoprado/opensfm/reference_lla.json

Centro aproximado do ortophoto resultante (adicionado ao projeto QGIS)

{
    "latitude": 40.61272372901514, 
    "altitude": 0, 
    "longitude": -8.752983409509966
}
            "DJI_0595.JPG": {
                "orientation": 1, 
                "camera": "v2 dji fc220 4000 3000 perspective 0.7222", 
                "gps_position": [
                    125.10012061257521, 
                    -138.4010433354888, 
                    22.407269606366754
                ], 
                "gps_dop": 15.0, 
                "rotation": [
                    2.1445873611073996, 
                    -2.2856282209697523, 
                    0.20066193557381898
                ], 
                "translation": [
                    -132.67853610360638, 
                    133.40968771622724, 
                    1.9668907291333997
                ], 
                "capture_time": 1535018711.0
            },

https://github.com/mapillary/OpenSfM/blob/master/opensfm/commands/export_geocoords.py

jgr@zoe:~/Documentos/costanovadoprado/opensfm$ wget https://raw.githubusercontent.com/mapillary/OpenSfM/master/opensfm/commands/export_geocoords.py

NÃO FUNCIONOU...

export_geocoords.py -dataset costanova

Ver: https://github.com/mapillary/OpenSfM/issues/183

webODM

https://github.com/OpenDroneMap/WebODM

git clone https://github.com/OpenDroneMap/WebODM --config core.autocrlf=input
cd WebODM
./webodm.sh start

jgrocha/xxbatata

Tools

CloudCompare

QGIS Plugin Photo2Shape

Criar uma shapefile photos

Nas propriedades, no campo filepath mudar para o tipo Fotografia.

Ground Control File

echo -7.778152 41.833203 957.575989  | cs2cs +init=epsg:4326 +to +init=epsg:3763
echo 708610.702 6209972.025 26.085 | cs2cs +init=epsg:25832 +to +init=epsg:32633

jgr@zoe:~/Documentos/sletten16maj2018-exif$ gdalsrsinfo epsg:32633 -o proj4
'+proj=utm +zone=33 +datum=WGS84 +units=m +no_defs '
jgr@zoe:~/Documentos/sletten16maj2018-exif$ gdalsrsinfo epsg:25832 -o proj4
'+proj=utm +zone=32 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '

Make my own OpenDroneMap image

Fork and clone ODM repository

git clone git@github.com:jgrocha/OpenDroneMap.git
cd OpenDroneMap
git checkout -b generate-laz-output

Change source

Build new image

jgr@zoe:~/PycharmProjects/OpenDroneMap$ docker build --no-cache -t odm_altitude_0 .
docker build -t odm_laz_image .

Run new image

# cd "/mnt/bonn/nextCloud/Photos/DJI MAVIC PRO 2 Paradela/100MEDIA"
cd /mnt/bonn/nextCloud/Photos
ln -s 'DJI MAVIC PRO 2 Paradela/100MEDIA' images
export odmi=`pwd`
docker run --cpus 8 -it --rm -v $odmi/images:/code/images -v $odmi/odm_orthophoto:/code/odm_orthophoto -v $odmi/odm_texturing:/code/odm_texturing -v $odmi/odm_georeferencing:/code/odm_georeferencing -v $odmi/odm_meshing:/code/odm_meshing -v $odmi/opensfm:/code/opensfm -v $odmi/odm_dem:/code/odm_dem odm_altitude_0 --dtm --dsm --force-ccd 13.2
# --orthophoto-resolution 2.0 --mesh-octree-depth 2 --opensfm-processes 8


cd /home/jgr/Documentos/sletten16maj2018-gcp
export odmi=`pwd`
sudo rm -rf odm_georeferencing odm_meshing odm_orthophoto odm_texturing opensfm
docker run -it --rm \
-v $odmi/images:/code/images \
-v $odmi/gcp_list.txt:/code/gcp_list.txt \
-v $odmi/odm_orthophoto:/code/odm_orthophoto \
-v $odmi/odm_texturing:/code/odm_texturing \
-v $odmi/odm_georeferencing:/code/odm_georeferencing \
-v $odmi/odm_meshing:/code/odm_meshing \
-v $odmi/opensfm:/code/opensfm \
odm_laz_image --gcp gcp_list.txt --dtm --dsm

The options for rerunning are: 'resize', 'opensfm', 'slam', 'cmvs', 'pmvs', 'odm_meshing', 'mvs_texturing', 'odm_georeferencing', 'odm_orthophoto'

docker run -it --rm \
-v $odmi/images:/code/images \
-v $odmi/gcp_list.txt:/code/gcp_list.txt \
-v $odmi/odm_orthophoto:/code/odm_orthophoto \
-v $odmi/odm_texturing:/code/odm_texturing \
-v $odmi/odm_georeferencing:/code/odm_georeferencing \
-v $odmi/odm_meshing:/code/odm_meshing \
-v $odmi/opensfm:/code/opensfm \
odm_laz_image --gcp gcp_list.txt --dtm --dsm --rerun-from odm_georeferencing

Check the output

running /code/build/bin/odm_georef -bundleFile /code/opensfm/bundle_r000.out -imagesPath /code/images -imagesListPath /code/opensfm/list_r000.out -inputFile /code/odm_texturing/odm_textured_model.obj -outputFile /code/odm_texturing/odm_textured_model_geo.obj -inputPointCloudFile /code/opensfm/depthmaps/merged.ply -outputPointCloudFile /code/odm_georeferencing/odm_georeferenced_model.ply  -logFile /code/odm_georeferencing/odm_georeferencing_log.txt -outputTransformFile /code/odm_georeferencing/odm_georeferencing_transform.txt -georefFileOutputPath /code/odm_georeferencing/odm_georeferencing_model_geo.txt -gcpFile gcp_list.txt -outputCoordFile /code/odm_georeferencing/coords.txt
[DEBUG]   running /code/SuperBuild/build/pdal/bin/pdal pipeline -i /code/odm_georeferencing/las.json --readers.ply.filename=/code/odm_georeferencing/odm_georeferenced_model.ply
PDAL: writers.las: Can't write LAZ output.  PDAL not built with LASzip or LAZperf.
{
  "pipeline": [
    "untransformed.ply",
    {
      "type": "writers.las",
      "a_srs": "+proj=utm +zone=33 +datum=WGS84 +units=m +no_defs ",
      "offset_x": "334230.28164",
      "offset_y": "6208095.41529",
      "offset_z": "0",
      "compression": "laszip",
      "filename": "/code/odm_georeferencing/odm_georeferenced_model.laz"
    }
  ]
}

Captura de ecrã de 2018-06-17 14-34-10.png

Local pdal+LASzip

Build from source!

/usr/local/bin/pdal pipeline -i las.json --readers.ply.filename=odm_georeferenced_model.ply
-rw-r--r-- 1 jgr jgr  22661583 jun 17 11:47 odm_georeferenced_model.laz
-rw-r--r-- 1 jgr jgr 121586206 jun 17 11:42 odm_georeferenced_model.ply

Previous result

Captura de ecrã de 2018-06-16 12-26-36.png

New result

Create Pull Request

close #845

Other fixes

epsg versus EPSG

Point cloud classification

[DEBUG] running pdal info --boundary --filters.hexbin.edge_length=1 --filters.hexbin.threshold=0 /code/odm_georeferencing/odm_georeferenced_model.filtered.las > /code/odm_georeferencing/odm_georeferenced_model.boundary.json PDAL: Argument references invalid/unused stage: 'filters.hexbin'.