[TOC]
1.打开根目录下COLMAP.bat
2.在GUI中点击上方菜单的Reconstruction,下拉菜单中点击Automatic reconstruction
3.选择Workplace folder作为工作目录。之后的生成结果将保存在这个目录下
4.选择Image folder作为图片目录。该目录存放用于生成点云的图片
5.(可选)如果需要生成稠密重建结果,勾选下方的dense model。这会耗费较多的时间。
6.点击Run。在一段时间后便可得到生成结果,结果存储在Workplace folder下
python ./AA-RMVSNet/colmap_input.py
使用BlendedMVS数据集进行微调
./AA-RMVSNet/scripts/train_blend.sh
./AA-RMVSNet/scripts/eval_gym.sh
./AA-RMVSNet/scripts/eval_dongbeiya.sh
原始点云
./AA-RMVSNet/scripts/fusion_gym.sh
./AA-RMVSNet/scripts/fusion_dongbeiya.sh
包含语义分割结果的点云
./AA-RMVSNet/scripts/fusion_gym_color.sh
./AA-RMVSNet/scripts/fusion_dongbeiya_color.sh
使用python中的Open3d包。对pointcloud类调用方法
self.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.01, max_nn=100))
其中的参数可以不用调整,也可根据实际情况适当改动。计算完成后保存当前点云。
在CloudCompare中导入经计算的点云。为了保证准确性,建议将点云分小块调整法向量。点击菜单栏Edit-Normals-Orient normals-With minimum spanning tree,按照默认参数(也可以调高)运行。得到结果后保存。
使用python中的Open3d包。
o3d.geometry.TriangleMesh.create_from_point_cloud_poisson(filename, depth=11, width=0, scale=1.1, linear_fit=False)[0]
其中width、scale、linear_fit参数可以不用调整。depth参数按需求调整,值取越高越精细。得到表面重建结果后保存。
1.打开CloudCompare
2.左上角点击Open图标,导入点云。
3.选取合适的角度作为切割平面,在左侧的DB Tree选中点云,点击上方切割图标
4.鼠标左键绘制多边形,右键退出绘制。上方窗口菜单点击多边形重新绘制;点击Segment In选取内部;点击Segment Out选取外部;点击确定按钮完成切割。
5.切割之后会在左侧的DB Tree生成两份点云,可以删除其中的一份
6.在左侧的DB Tree选中点云,左上角点击Save图标,保存在某一路径。
python getNorms.py
输入:重建好的点云,六列(X,Y,Z,R,G,B)
输出:计算法向量后的点云,九列(X,Y,Z,R,G,B,Nx,Ny,Nz)
原理:使用open3d内置函数计算法向量。
python 3dTo2dTransform.py
输入:计算法向量后的点云,九列(X,Y,Z,R,G,B,Nx,Ny,Nz)
输出:4张投影图
原理:以xoy平面为例,根据平面法向量调整z轴与之平行,之后将所有点投射至xoy平面,即暂时丢弃z坐标数据,然后在xoy平面上以固定步长(我们设置为0.005)划分网格,每个格子作为生成图像的一个像素点。每个格子取内部点的RGB均值作为像素点的RGB值。其他平面类似,得到投影图。
python Completion.py
输入:投影图
输出:补全后投影图
原理:中位数滤波,其是一种非线性平滑技术,它将每一像素点的像素值设置为该点某邻域窗口内的所有像素点像素的中值。
python identify windows.py
输入:补全后投影图
输出:识别窗户后窗户图
原理:首先二值化处理,通过阈值设置,将大于某值的点置为黑色,否则为白色,二值化之后仍存在较多杂点。下一步进行除杂,除杂思路如下:根据一个点A的RGB值,与周围的8个点的RBG值比较,设定一个值N(0 <N <8),当A的RGB值与周围8个点的RGB相等数小于N时,此点为噪点。将噪点置为黑色,这样会得到一张相对清晰的二值化图片。但为了达到更清晰的效果,我们中间叠加了一层中位数滤波器和高斯滤波器。通过Canny算子,我们可以得到相对较完整的边缘图像,得到框架之后我们利用OpenCV内置函数进行多边形拟合,通过三个条件对拟合的多边形进行筛选:①边数大于等于4 ②图形为凸多边形 ③矩形面积不过大过小。至此,我们得到了满足条件的矩形,几乎可以完美识别点云中的所有窗户。
python drawWindows.py
输入:二值化窗户图像
输出:识别的窗户为红色的点云
原理:将识别出的窗户二值化图像保留,其他部分置空。可以将像素逆映射到点云中以步长的平方倍的点团中,将这部分点团修改成我们想要的颜色。
python getVolume.py
输入:要计算体积的点云和地面点云
输出:要计算部分的体积
原理:受到数学中积分方法的启发,我们基于积分的思维进行近似的计算。首先,基于地面方向调整点云图,使地面垂直于某一坐标轴以方便计算。然后在水平面方向上对点云沿某一水平坐标轴切片,确保步长足够小。之后对每一个切片,将最低点设为建筑地面基准(因为即便外部存在坡度,建筑内部仍然是水平的),沿另一水平坐标轴方向按步长计算“矩形”面积,“矩形”的高为矩形区域点的垂直坐标和地面基准垂直坐标之差,宽为步长。这样一来,计算切片面积后便可以类似地求出建筑物体积。
python lengths.py
输入:要计算长度的点云
输出:要计算部分的长宽高
原理:根据法向量找到同一平面,计算极值的差值。
南馆 | 北馆 | 体育馆总 | 东北亚学院 | |
---|---|---|---|---|
长(m) | 68.94 | 83.88 | 68.94+83.88 | 90.21 |
宽(m) | 55.45 | 50.39 | 55.45+59.39 | 24.10 |
高(m) | 24.66 | 28.28 | 29.34+28.28 | 28.10 |
体积(m3) | 59844.31 | 77142.45 | 136986.76 (59844.31+77142.45) |
24958.36 |
窗户面积(m2) | 1016.8 (163.9+191.7+186.0+475.2) |
1402.5 (147.2+364.9+559.6+330.8) |
2419.3 (1016.8+1402.5) |
548.4 (34.6+280.6+233.2) |
窗户数量 | 95 (40+11+28+16) |
113 (20+34+49+10) |
208 (95+113) |
204 (6+76+122) |
楼层数目 | 3 | 5 | 3+5 | 3+5+6 |