Oneline reconstruction

Oneline reconstructcion requires incremental fusion of many overlapping depth maps into a single 3D representation that is continuously refined.

This is challenging particularly when real-time performance is required without trading fine-quality reconstructions and spatial scale.

Voxel Hashing

Given Curless and Levoy truncate SDFs around the surface, the majority of data stored in the regular voxel grid is marked either as free space or as unobserved space rather than surface data. The key challenge becomes how to design a data structure that exploits this underlying sparsity in the TSDF representation.

hashmap avoids the use of a dense or hierarchical data structure, removing the need for a memory intensive regular grid or computationally complex hierarchy for volumetric fusion. Instead simply hashing scheme to compactly store, access and update an implicit surface representation.

The hash table sparsely and efficiently stores and updates TSDFs

Data structure

Conceptually, an infinite uniform grid subdivides the world into voxel blocks. Each block is a small regular voxel grid. Each voxel stores a TSDF, color, and weight and requires 8 bytes of memory:

struct Voxel {
float sdf;
uchar colorRGB[3];
uchar weight;
};

To exploit sparsity, voxel blocks are only allocated around reconstructed surface geometry. An efficient GPU accelerated hash table is used to manage allocation and retrieval of voxel blocks.

mapping from a world coordinate (x,y,z) to hash value H(x,y,z) using the following hashing function:

H(x, y, z) = (x · p1 ⊕ y · p2 ⊕ z · p3) mod n

where p1, p2, and p3 are large prime numbers (i.e. 73856093, 19349669, 83492791 respectively), and n is the hash table size.

struct HashEntry {
short position[3];
short offset;
int pointer;
};

Voxel hashing data structure. Using hash function, mapping from integer world coordinates to hash buckets, which store a small array of pointers to regular grid voxel blocks. Each voxel block contains an 8**3 grid of SDF values.

Voxel hashing data structure. Using hash function, mapping from integer world coordinates to hash buckets, which store a small array of pointers to regular grid voxel blocks. Each voxel block contains an 8**3 grid of SDF values.

Local hash map activates voxel blocks enclosing points observed in the viewing frustum. Global hashmap accumulates such activated blocks and maintains all the blocks around the isosurface.

Local hash map activates voxel blocks enclosing points observed in the viewing frustum. Global hashmap accumulates such activated blocks and maintains all the blocks around the isosurface.

reference

https://niessnerlab.org/papers/2013/4hashing/niessner2013hashing.pdf