kopia lustrzana https://github.com/OpenDroneMap/ODM
Merge pull request #260 from smathermather/pdal-adds
Add PDAL to ODM for point cloud stuff
Former-commit-id: 6c485b915b
pull/1161/head
commit
aef0cf6e5d
|
@ -102,7 +102,8 @@ set(custom_libs OpenGV
|
||||||
CMVS
|
CMVS
|
||||||
Catkin
|
Catkin
|
||||||
Ecto
|
Ecto
|
||||||
LAStools)
|
LAStools
|
||||||
|
PDAL)
|
||||||
|
|
||||||
foreach(lib ${custom_libs})
|
foreach(lib ${custom_libs})
|
||||||
SETUP_EXTERNAL_PROJECT_CUSTOM(${lib})
|
SETUP_EXTERNAL_PROJECT_CUSTOM(${lib})
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
set(_proj_name pdal)
|
||||||
|
set(_SB_BINARY_DIR "${SB_BINARY_DIR}/${_proj_name}")
|
||||||
|
|
||||||
|
ExternalProject_Add(${_proj_name}
|
||||||
|
PREFIX ${_SB_BINARY_DIR}
|
||||||
|
TMP_DIR ${_SB_BINARY_DIR}/tmp
|
||||||
|
STAMP_DIR ${_SB_BINARY_DIR}/stamp
|
||||||
|
#--Download step--------------
|
||||||
|
DOWNLOAD_DIR ${SB_DOWNLOAD_DIR}
|
||||||
|
URL https://github.com/PDAL/PDAL/archive/d242c6704aafe85fd49fda11adae63d07ce11b76.zip
|
||||||
|
URL_MD5 14a7319e1f8483808eb93732cfa6511a
|
||||||
|
#--Update/Patch step----------
|
||||||
|
UPDATE_COMMAND ""
|
||||||
|
#--Configure step-------------
|
||||||
|
SOURCE_DIR ${SB_SOURCE_DIR}/${_proj_name}
|
||||||
|
CMAKE_ARGS
|
||||||
|
-BUILD_PGPOINTCLOUD_TESTS=ON
|
||||||
|
-BUILD_PLUGIN_PCL=ON
|
||||||
|
-BUILD_PLUGIN_PGPOINTCLOUD=ON
|
||||||
|
-DCMAKE_INSTALL_PREFIX:PATH=${SB_INSTALL_DIR}
|
||||||
|
#--Build step-----------------
|
||||||
|
BINARY_DIR ${_SB_BINARY_DIR}
|
||||||
|
#--Install step---------------
|
||||||
|
INSTALL_DIR ${SB_INSTALL_DIR}
|
||||||
|
#--Output logging-------------
|
||||||
|
LOG_DOWNLOAD OFF
|
||||||
|
LOG_CONFIGURE OFF
|
||||||
|
LOG_BUILD OFF
|
||||||
|
)
|
|
@ -25,6 +25,7 @@ pmvs2_path = os.path.join(superbuild_path, "install/bin/pmvs2")
|
||||||
|
|
||||||
# define txt2las path
|
# define txt2las path
|
||||||
txt2las_path = os.path.join(superbuild_path, 'src/las-tools/bin')
|
txt2las_path = os.path.join(superbuild_path, 'src/las-tools/bin')
|
||||||
|
pdal_path = os.path.join(superbuild_path, 'build/pdal/bin')
|
||||||
|
|
||||||
# define odm modules path
|
# define odm modules path
|
||||||
odm_modules_path = os.path.join(root_path, "build/bin")
|
odm_modules_path = os.path.join(root_path, "build/bin")
|
||||||
|
|
|
@ -124,24 +124,55 @@ class ODM_GeoRef(object):
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
def convert_to_las(self, _file):
|
def convert_to_las(self, _file, pdalXML):
|
||||||
|
|
||||||
if not self.epsg:
|
if not self.epsg:
|
||||||
log.ODM_ERROR('Empty EPSG: Could not convert to LAS')
|
log.ODM_ERROR('Empty EPSG: Could not convert to LAS')
|
||||||
return
|
return
|
||||||
|
|
||||||
kwargs = { 'bin': context.txt2las_path,
|
kwargs = { 'bin': context.pdal_path,
|
||||||
'f_in': _file,
|
'f_in': _file,
|
||||||
'f_out': _file + '.laz',
|
'f_out': _file + '.las',
|
||||||
'east': self.utm_east_offset,
|
'east': self.utm_east_offset,
|
||||||
'north': self.utm_north_offset,
|
'north': self.utm_north_offset,
|
||||||
'epsg': self.epsg }
|
'epsg': self.epsg,
|
||||||
|
'xml': pdalXML}
|
||||||
|
|
||||||
# call txt2las
|
# call txt2las
|
||||||
system.run('{bin}/txt2las -i {f_in} -o {f_out} -skip 30 -parse xyzRGBssss ' \
|
#system.run('{bin}/txt2las -i {f_in} -o {f_out} -skip 30 -parse xyzRGBssss ' \
|
||||||
'-set_scale 0.01 0.01 0.01 -set_offset {east} {north} 0 ' \
|
# '-set_scale 0.01 0.01 0.01 -set_offset {east} {north} 0 ' \
|
||||||
'-translate_xyz 0 -epsg {epsg}'.format(**kwargs))
|
# '-translate_xyz 0 -epsg {epsg}'.format(**kwargs))
|
||||||
|
#
|
||||||
|
# create pipeline file transform.xml to enable transformation
|
||||||
|
pipelineXml = '<?xml version=\"1.0\" encoding=\"utf-8\"?>'
|
||||||
|
pipelineXml += '<Pipeline version=\"1.0\">'
|
||||||
|
pipelineXml += ' <Writer type=\"writers.las\">'
|
||||||
|
pipelineXml += ' <Option name=\"filename\">'
|
||||||
|
pipelineXml += ' transformed.las'
|
||||||
|
pipelineXml += ' </Option>'
|
||||||
|
pipelineXml += ' <Filter type=\"filters.transformation\">'
|
||||||
|
pipelineXml += ' <Option name=\"matrix\">'
|
||||||
|
pipelineXml += ' 1 0 0 {east}'.format(**kwargs)
|
||||||
|
pipelineXml += ' 0 1 0 {north}'.format(**kwargs)
|
||||||
|
pipelineXml += ' 0 0 1 0'
|
||||||
|
pipelineXml += ' 0 0 0 1'
|
||||||
|
pipelineXml += ' </Option>'
|
||||||
|
pipelineXml += ' <Reader type=\"readers.ply\">'
|
||||||
|
pipelineXml += ' <Option name=\"filename\">'
|
||||||
|
pipelineXml += ' untransformed.ply'
|
||||||
|
pipelineXml += ' </Option>'
|
||||||
|
pipelineXml += ' </Reader>'
|
||||||
|
pipelineXml += ' </Filter>'
|
||||||
|
pipelineXml += ' </Writer>'
|
||||||
|
pipelineXml += '</Pipeline>'
|
||||||
|
|
||||||
|
|
||||||
|
with open(pdalXML, 'w') as f:
|
||||||
|
f.write(pipelineXml)
|
||||||
|
|
||||||
|
# call pdal
|
||||||
|
system.run('{bin}/pdal pipeline -i {xml} --readers.ply.filename={f_in} ' \
|
||||||
|
'--writers.las.filename={f_out}'.format(**kwargs))
|
||||||
|
|
||||||
def utm_to_latlon(self, _file, _photo, idx):
|
def utm_to_latlon(self, _file, _photo, idx):
|
||||||
|
|
||||||
|
@ -279,6 +310,7 @@ class ODM_Tree(object):
|
||||||
self.odm_texturing = io.join_paths(self.root_path, 'odm_texturing')
|
self.odm_texturing = io.join_paths(self.root_path, 'odm_texturing')
|
||||||
self.odm_georeferencing = io.join_paths(self.root_path, 'odm_georeferencing')
|
self.odm_georeferencing = io.join_paths(self.root_path, 'odm_georeferencing')
|
||||||
self.odm_orthophoto = io.join_paths(self.root_path, 'odm_orthophoto')
|
self.odm_orthophoto = io.join_paths(self.root_path, 'odm_orthophoto')
|
||||||
|
self.odm_pdal = io.join_paths(self.root_path, 'pdal')
|
||||||
|
|
||||||
### important files paths
|
### important files paths
|
||||||
|
|
||||||
|
@ -326,6 +358,8 @@ class ODM_Tree(object):
|
||||||
self.odm_georeferencing, 'odm_georeferencing_utm_log.txt')
|
self.odm_georeferencing, 'odm_georeferencing_utm_log.txt')
|
||||||
self.odm_georeferencing_log = io.join_paths(
|
self.odm_georeferencing_log = io.join_paths(
|
||||||
self.odm_georeferencing, 'odm_georeferencing_log.txt')
|
self.odm_georeferencing, 'odm_georeferencing_log.txt')
|
||||||
|
self.odm_georeferencing_pdal = io.join_paths(
|
||||||
|
self.odm_georeferencing, 'pipeline.xml')
|
||||||
|
|
||||||
# odm_orthophoto
|
# odm_orthophoto
|
||||||
self.odm_orthophoto_file = io.join_paths(self.odm_orthophoto, 'odm_orthophoto.png')
|
self.odm_orthophoto_file = io.join_paths(self.odm_orthophoto, 'odm_orthophoto.png')
|
||||||
|
@ -338,5 +372,4 @@ class ODM_Tree(object):
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -117,7 +117,7 @@ class ODMGeoreferencingCell(ecto.Cell):
|
||||||
geo_ref.utm_to_latlon(tree.odm_georeferencing_latlon, photo, idx)
|
geo_ref.utm_to_latlon(tree.odm_georeferencing_latlon, photo, idx)
|
||||||
|
|
||||||
# convert ply model to LAS reference system
|
# convert ply model to LAS reference system
|
||||||
geo_ref.convert_to_las(tree.odm_textured_model_ply_geo)
|
geo_ref.convert_to_las(tree.odm_textured_model_ply_geo, tree.odm_georeferencing_pdal)
|
||||||
|
|
||||||
|
|
||||||
log.ODM_INFO('Running OMD Georeferencing Cell - Finished')
|
log.ODM_INFO('Running OMD Georeferencing Cell - Finished')
|
||||||
|
@ -266,4 +266,4 @@ def odm_georeferencing():
|
||||||
|
|
||||||
|
|
||||||
if args['--end-with'] != "odm_georeferencing":
|
if args['--end-with'] != "odm_georeferencing":
|
||||||
odm_orthophoto()
|
odm_orthophoto()
|
||||||
|
|
Ładowanie…
Reference in New Issue