How to detect the difference between two 3D point clouds?

algorithm, c++, computer-vision, point-cloud-library

Solution

I'm no expert on these things, so these are mostly ideas, not solutions and I might be wrong.

But my naive approach would be boolean operations / constructive solid geometry based on the two meshes (see also this question at gamedev). If you calculate `A-B`, you get the mesh(es) that contain everything that is in A, but not in B - or in other words: the missing portion of B.

There are two issues with this approach, though:

- Boolean operations are tricky due to floating point inaccuracy and special cases.

- Your meshes are noisy, so their surfaces will mostly not be coincident, even outside of the missing region.

As a result, the difference mesh will contain lots of small "volumes" outside of the actual missing region. You might remedy this by adding some sort of tolerance radius to A during the boolean operation or by applying some smoothing or other post-processing to the result.

Another approach might be to do the boolean operation not on the meshes, but on implicit functions created from the point clounds (e.g. with moving least squares) and then creating a mesh from the resulting implicit function (e.g. with marching cubes). This might be a more robust solution.

To create an image of the mesh, just render it using OpenGL or DirectX.

Problem

I have two 3D point clouds using the Point Cloud Library. One which is the reference point cloud(lets call it A) and the other one with a deformity(lets call it B). Both the point clouds are taken from objects which are somehow with no or very minute features on the surface, except the edges. These point clouds A and B are also aligned. - I want to know if there is any algorithm which can detect the missing cloud from B. - How to construct a high resolution 3D image of the missing portion of B. Helps are appreciated.

Original source

Related problems