Coder Social home page Coder Social logo

3d-reconstruction's Introduction

[TOC]

基于深度学习方法的单目多视图三维重建

Part I 三维重建

1 稀疏重建 - Colmap

1.打开根目录下COLMAP.bat

2.在GUI中点击上方菜单的Reconstruction,下拉菜单中点击Automatic reconstruction

col1

3.选择Workplace folder作为工作目录。之后的生成结果将保存在这个目录下

4.选择Image folder作为图片目录。该目录存放用于生成点云的图片

5.(可选)如果需要生成稠密重建结果,勾选下方的dense model。这会耗费较多的时间。

6.点击Run。在一段时间后便可得到生成结果,结果存储在Workplace folder下

col2

2 格式转换

python ./AA-RMVSNet/colmap_input.py

3 微调

使用BlendedMVS数据集进行微调

./AA-RMVSNet/scripts/train_blend.sh

4 深度图推理

./AA-RMVSNet/scripts/eval_gym.sh
./AA-RMVSNet/scripts/eval_dongbeiya.sh

5 点云生成

原始点云

./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

6 表面重建

6.1 计算法向量

使用python中的Open3d包。对pointcloud类调用方法

self.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.01, max_nn=100))

其中的参数可以不用调整,也可根据实际情况适当改动。计算完成后保存当前点云。

6.2 法向量调整

在CloudCompare中导入经计算的点云。为了保证准确性,建议将点云分小块调整法向量。点击菜单栏Edit-Normals-Orient normals-With minimum spanning tree,按照默认参数(也可以调高)运行。得到结果后保存。

6.3 表面重建

使用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参数按需求调整,值取越高越精细。得到表面重建结果后保存。

7 点云切割

1.打开CloudCompare

2.左上角点击Open图标,导入点云。

slice1

3.选取合适的角度作为切割平面,在左侧的DB Tree选中点云,点击上方切割图标

slice2

4.鼠标左键绘制多边形,右键退出绘制。上方窗口菜单点击多边形重新绘制;点击Segment In选取内部;点击Segment Out选取外部;点击确定按钮完成切割。

slice3

5.切割之后会在左侧的DB Tree生成两份点云,可以删除其中的一份

slice5

slice4

6.在左侧的DB Tree选中点云,左上角点击Save图标,保存在某一路径。

Part II 基于计算机视觉方法的点云到点云窗户识别

1 窗户识别

1.1 投影

1.1.1 计算法向量
python getNorms.py

输入:重建好的点云,六列(X,Y,Z,R,G,B)

输出:计算法向量后的点云,九列(X,Y,Z,R,G,B,Nx,Ny,Nz)

原理:使用open3d内置函数计算法向量。

1.1.2 投影
python 3dTo2dTransform.py

输入:计算法向量后的点云,九列(X,Y,Z,R,G,B,Nx,Ny,Nz)

输出:4张投影图

原理:以xoy平面为例,根据平面法向量调整z轴与之平行,之后将所有点投射至xoy平面,即暂时丢弃z坐标数据,然后在xoy平面上以固定步长(我们设置为0.005)划分网格,每个格子作为生成图像的一个像素点。每个格子取内部点的RGB均值作为像素点的RGB值。其他平面类似,得到投影图。

1.2 图像处理和边缘检测

1.2.1 中值滤波
python Completion.py

输入:投影图

输出:补全后投影图

原理:中位数滤波,其是一种非线性平滑技术,它将每一像素点的像素值设置为该点某邻域窗口内的所有像素点像素的中值。

1.2.2 窗户识别
python identify windows.py

输入:补全后投影图

输出:识别窗户后窗户图

原理:首先二值化处理,通过阈值设置,将大于某值的点置为黑色,否则为白色,二值化之后仍存在较多杂点。下一步进行除杂,除杂思路如下:根据一个点A的RGB值,与周围的8个点的RBG值比较,设定一个值N(0 <N <8),当A的RGB值与周围8个点的RGB相等数小于N时,此点为噪点。将噪点置为黑色,这样会得到一张相对清晰的二值化图片。但为了达到更清晰的效果,我们中间叠加了一层中位数滤波器和高斯滤波器。通过Canny算子,我们可以得到相对较完整的边缘图像,得到框架之后我们利用OpenCV内置函数进行多边形拟合,通过三个条件对拟合的多边形进行筛选:①边数大于等于4 ②图形为凸多边形 ③矩形面积不过大过小。至此,我们得到了满足条件的矩形,几乎可以完美识别点云中的所有窗户。

1.3 逆投影

python drawWindows.py

输入:二值化窗户图像

输出:识别的窗户为红色的点云

原理:将识别出的窗户二值化图像保留,其他部分置空。可以将像素逆映射到点云中以步长的平方倍的点团中,将这部分点团修改成我们想要的颜色。

2 体积、长度计算

2.1 体积计算

python getVolume.py

输入:要计算体积的点云和地面点云

输出:要计算部分的体积

原理:受到数学中积分方法的启发,我们基于积分的思维进行近似的计算。首先,基于地面方向调整点云图,使地面垂直于某一坐标轴以方便计算。然后在水平面方向上对点云沿某一水平坐标轴切片,确保步长足够小。之后对每一个切片,将最低点设为建筑地面基准(因为即便外部存在坡度,建筑内部仍然是水平的),沿另一水平坐标轴方向按步长计算“矩形”面积,“矩形”的高为矩形区域点的垂直坐标和地面基准垂直坐标之差,宽为步长。这样一来,计算切片面积后便可以类似地求出建筑物体积。

2.2 长度计算

python lengths.py

输入:要计算长度的点云

输出:要计算部分的长宽高

原理:根据法向量找到同一平面,计算极值的差值。

3 结果

3.1 数值

南馆 北馆 体育馆总 东北亚学院
长(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

3.2 识别窗户后的点云效果

gym2

gym1

dby1

dby2

Part III 基于ResNest的图像到点云的语义分割

1 东北亚学院

二维语义分割结果(切块并拼接)

dby2

筛选label后的结果

dby2

点云语义分割结果

dby2

2 体育馆

二维语义分割结果

dby2

筛选label后的结果

dby2

点云语义分割结果

dby2

dby2

3d-reconstruction's People

Contributors

hmtcuro avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.