Lidar data visualization: Difference between revisions

From wikiluntti
Line 71: Line 71:
cloud.points = o3d.utility.Vector3dVector(X)
cloud.points = o3d.utility.Vector3dVector(X)


o3d.visualization.draw_geometries([cloud])
cloud.estimate_normals()
 
#Poisson Reconstruction
mesh_poisson = o3d.geometry.TriangleMesh.create_from_point_cloud_poisson(
        cloud, depth=10, width=0, scale=1.1, linear_fit=False)[0]
 
o3d.io.write_triangle_mesh("mesh_poisson_10.ply", mesh_poisson )
</syntaxhighlight>
</syntaxhighlight>



Revision as of 18:31, 31 January 2021

Introduction

Use Lidar data, post analyze it with Python/ Pandas? and use Blender to visualize it.

Theory

The free Lidar data set are available e.g. at Opentopography.org. We use both, the Tif data and LAS data of IT-Ren, Fluxnet site

LAS File Format

LAS@Wikipedia how to print lidar file format las

a) Headers.

b) VLR: Variable Length Record. Include 1) header and 2) payload.

c) Point records. Different point formats 0-10.

LAS in Python

To check if the data points are there

[PyLAS Github]

[Laspy Github] [LasPy]


import numpy as np
import pylas

las = pylas.read( fname )
#np.all(las.user_data == las['user_data'])

point_format = las.point_format
print( point_format )
print( point_format.id )
print( list(point_format.dimension_names) )

from mpl_toolkits import mplot3d
import matplotlib.pyplot as plt
fig = plt.figure()
ax = plt.axes(projection='3d')

N=5000
ax.scatter3D(las.X[:N], las.Y[:N], las.Z[:N], c=las.Z[:N], cmap='Greens');

Lidar Cloud Data to Blender Mesh using Opend3D

The full dataset rendered in OpenGL.

Blender needs mesh, also nodes, faces and vertices. Thus, the data cloud need to be converted to mesh data. We use the Rolling Ball algorithm of Open3d package.

Read the data and convert it to a suitable format for Open3D. Also visualize it:

fname =  '20150608_it-ren_nadir_densified_point_cloud_merged.las'

import open3d as o3d
import pylas
las = pylas.read( fname )
print('Points from data:', len(las.points))

N=100000
N=25797964
X = np.transpose( [las.X[:N], las.Y[:N], las.Z[:N]] )
cloud = o3d.geometry.PointCloud()
cloud.points = o3d.utility.Vector3dVector(X)

cloud.estimate_normals()

#Poisson Reconstruction
mesh_poisson = o3d.geometry.TriangleMesh.create_from_point_cloud_poisson(
        cloud, depth=10, width=0, scale=1.1, linear_fit=False)[0]

o3d.io.write_triangle_mesh("mesh_poisson_10.ply", mesh_poisson )

Visualize the ply mesh.

port numpy as np
import pylas

import open3d as o3d

#Poisson Reconstruction
mesh = o3d.io.read_triangle_mesh("mesh_poisson_10.ply" )
mesh.compute_vertex_normals()
mesh.paint_uniform_color([1, 0.706, 0])

o3d.visualization.draw_geometries([mesh])

print( mesh )
print(np.asarray(mesh.vertices))
<syntaxhighlight>



<syntaxhighlight lang="python">
cloud.estimate_normals()

# estimate radius for rolling ball
distances = cloud.compute_nearest_neighbor_distance()
avg_dist = np.mean(distances)
radius = 1.5 * avg_dist  
radius = 5*avg_dist

mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_ball_pivoting(
           cloud,
           o3d.utility.DoubleVector([radius, radius * 2]))


o3d.visualization.draw_geometries([mesh])


how do i convert a 3d point cloud ply into a mesh with faces and vertices

Cloud to Mesh Tutorial

Interpolate lidar

Convert lsa to ply

Render data in Blender

Rendering cloud data in Blender