看个视频
https://www.youtube.com/watch?v=8M_-lSYqACo
这是mobilefusion的视频,大家先了解一下,看到在三维重建的时候外面有个长方体包围盒了吗?
数据准备:
我们不同角度拍摄的RGB图、深度图和相应的pose.txt。
步骤:
1.建立长方体包围盒
要建立一个长方体包围盒。让所有的三维点都在这个长方体里面。
假设z方向垂直相机。
很明显,x,y方向上的极值就是图像的边界。
图像的边界点是就是四个角。
(0,0),(w,0),(0,h),(w,h)
z方向上深度范围是0~max_depth
组合而成的边界点就是(0,0,0),(0,0,max_depth),(w,0,0)等的2^3=8种情况,然后把这些点用相机的内参和外参换算到世界坐标系中,长方体的极点。
2.划分网格
在长方体内部划分网格
比如说我们现在求得的长方体的极点分别是(-1,-1,-1),(1,1,1)单位是米。
我们要在这个长方体内部划分网格,就是分割出一个个等体积的小的立方体,也就是所谓的体素。我们让体素的边长是0.02,也就是2厘米。
那么从-1到1,我们可以划分出100个体素,也就是说这个长方体上每个小立方体的8个顶点的坐标可以用(x,y,z)来表示,其中x,y,z都是0-100之间的,同时它们的世界坐标也可以通过(-1+0.02x,-1+0.02y,-1+0.02*z)来计算出来。
以下图片来自https://blog.csdn.net/qq_31785865/article/details/78524429
3.迭代更新tsdf网格
遍历每一组数据(RGB图、深度图、pose.txt)
每次把这个长方体内的所有格点的世界坐标通过逆变换到相机坐标,再投影到图片上。
再将图片上对应位置的深度与格点的在相机坐标系下的深度比较。
depth_diff = depth_val-cam_pts[2,:];
如果|depth_diff |<trunc_marin则认为有效。
用dist=depth_diff/trunc_marin去加权更新tsdf网格。
ps:tsdf网格是和2中划分的长方体一样的,每个顶点存放的是dist的加权和。(TSDF主要获得差值+权重)
4.找等值面
用marching cubes算法在tsdf网格中寻找dist加权和为0的等值面。就是物体表面。
更多《计算机视觉与图形学》知识,可关注下方公众号: