I have a process which attempts to register two forested point clouds using CloudCompare's Iterative Closest Point (ICP) algorithm. Often times, warping (especially in the vertical direction) occurs in the generation of UAV derived photogrammetric clouds.
Using a moving window, my process attempts to match the sample clouds found in each moving window (top of figure). ICP returns a matrix of transformation values, of which the estimated X,Y and Z transformation values are then stored and associated with the center coords of each window (bottom of figure - the coloured points).
With the resulting point dataset from the moving window ICP process, we can fit models to predict the X, Y and Z shift values as a function of 2D space. I have experimented with low order polynomial functions for example:
Z shift = b0(UTMx) + b1(UTMx)^2 + b2(UTMx)^3 + b3(UTMy) + b4(UTMy)^2 + intercept
b0-b4 are model coefficients and
UTMx/y refers to the 2D coordinates. 2 other models are fit for X and Y shift. So far the models prove to be accurate (rsquared ~0.9) and applying the shifts to the sample subsections of the original cloud show very close alignment visually.
With these models we can go back to the original Photogrammetric Cloud and apply X,Y and Z shifts to correct for warping (at least so it matches the LiDAR cloud which we know has better georeferencing procedure than UAV). These corrections ideally would be applied to each point of the original Photogrammetric Cloud... I am looking for an efficient way to apply the shifts (which vary according to the models) in a computationally efficient way because in some cases we deal with up to a billion points. My first instinct is to using some sort of tiling procedure, running these in parallel... I prefer using R and the lidR package however I'm open to other suggestions/comments/questions regarding any part of this process!