in lib/mesh_util.py [0:0]
def reconstruction(net, cuda, calib_tensor,
resolution, b_min, b_max, thresh=0.5,
use_octree=False, num_samples=10000, transform=None):
'''
Reconstruct meshes from sdf predicted by the network.
:param net: a BasePixImpNet object. call image filter beforehead.
:param cuda: cuda device
:param calib_tensor: calibration tensor
:param resolution: resolution of the grid cell
:param b_min: bounding box corner [x_min, y_min, z_min]
:param b_max: bounding box corner [x_max, y_max, z_max]
:param use_octree: whether to use octree acceleration
:param num_samples: how many points to query each gpu iteration
:return: marching cubes results.
'''
# First we create a grid by resolution
# and transforming matrix for grid coordinates to real world xyz
coords, mat = create_grid(resolution, resolution, resolution)
#b_min, b_max, transform=transform)
calib = calib_tensor[0].cpu().numpy()
calib_inv = inv(calib)
coords = coords.reshape(3,-1).T
coords = np.matmul(np.concatenate([coords, np.ones((coords.shape[0],1))], 1), calib_inv.T)[:, :3]
coords = coords.T.reshape(3,resolution,resolution,resolution)
# Then we define the lambda function for cell evaluation
def eval_func(points):
points = np.expand_dims(points, axis=0)
points = np.repeat(points, 1, axis=0)
samples = torch.from_numpy(points).to(device=cuda).float()
net.query(samples, calib_tensor)
pred = net.get_preds()[0][0]
return pred.detach().cpu().numpy()
# Then we evaluate the grid
if use_octree:
sdf = eval_grid_octree(coords, eval_func, num_samples=num_samples)
else:
sdf = eval_grid(coords, eval_func, num_samples=num_samples)
# Finally we do marching cubes
try:
verts, faces, normals, values = measure.marching_cubes_lewiner(sdf, thresh)
# transform verts into world coordinate system
trans_mat = np.matmul(calib_inv, mat)
verts = np.matmul(trans_mat[:3, :3], verts.T) + trans_mat[:3, 3:4]
verts = verts.T
# in case mesh has flip transformation
if np.linalg.det(trans_mat[:3, :3]) < 0.0:
faces = faces[:,::-1]
return verts, faces, normals, values
except:
print('error cannot marching cubes')
return -1