<h1 style="font-size:27px" align="center">
  <a href="https://github.com/Tang1705/Reconstruction" title="3D Reconstruction of high-speed rail-wheel based on coded structured light">
    <img alt="Reconstruction" src="http://static.zybuluo.com/TangWill/jhiwlfucn275608lfkr5yw86/icon.png" width="200px" height="200px" />
  </a>
  <br />
  基于编码结构光的高铁轮轨姿态三维重建
</h1>
<p align="center">
  3D Reconstruction of high-speed rail-wheel based on coded structured light
</p>
<div align="center">
  <a href="http://gjcxcy.bjtu.edu.cn/NewLXItemListForStudentDetail.aspx?ItemNo=594113&year=2020&type=student&IsLXItem=1">
    <img alt="Organization" src="https://img.shields.io/badge/Organization-BJTU-072063.svg?style=shield&logo=data:image/png;base64, " />
  </a>
  <a href="https://tang5618.com/wordpress/?p=598">
    <img alt="Webpage" src="https://img.shields.io/badge/Link-Webpage-c00000.svg?style=shield&logo=wordpress" />
  </a>
 <!--<a href="https://github.com/Tang1705/Reconstruction">
    <img alt="Github" src="https://img.shields.io/badge/Github-%20%20%20%20%20%20Repository-%2324292e.svg?style=shield&logo=Github" />
  </a>-->
  <a href="./poster.pdf">
    <img alt="Poster" src="https://img.shields.io/badge/Poster-PDF-B50052.svg?style=shield&logo=adobe-indesign&logoColor=ffffff" />
  </a>
    <a href="https://github.com/Tang1705/Reconstruction/raw/master/Exe/Reconstructionn.exe">
    <img alt="Software" src="https://img.shields.io/badge/Release-EXE-2f528f.svg?style=shield&logo=windows" />
  </a>
  <a href="https://github.com/Tang1705/Reconstruction/raw/master/Doc/%E7%BB%93%E6%9E%84%E5%85%89%E4%B8%89%E7%BB%B4%E9%87%8D%E5%BB%BA%E8%BD%AF%E4%BB%B6%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C.pdf">
    <img alt="User-Guide" src="https://img.shields.io/badge/User%20Manual-PDF-548235.svg?style=shield&logo=adobe-acrobat-reader" />
  </a>
  <a href="https://github.com/Tang1705/Reconstruction/raw/master/Doc/%E7%BB%93%E6%9E%84%E5%85%89%E4%B8%89%E7%BB%B4%E9%87%8D%E5%BB%BA%E8%BD%AF%E4%BB%B6%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E5%88%86%E6%9E%90.pdf">
    <img alt="Software-Design-Patter" src="https://img.shields.io/badge/Design%20Pattern-PDF-548235.svg?style=shield&logo=latex" />
  </a>
  <br/>
  <br />
    <a href="./Readme.md">
      <img src="https://img.shields.io/badge/Readme-%E4%B8%AD%E6%96%87%E7%89%88%E6%9C%AC-red?style=for-the-badge&logo=data:image/png;base64, "/>
    </a>
    <a href="./Readme-en.md">
      <img src="https://img.shields.io/badge/Readme-English%20Version-blue?style=for-the-badge&logo=data:image/png;base64, "/>
    </a>
    <br/>
    <br/>
 <!-- <p align="center">
    <a href="./Readme.md">中文版本</a>
    ·
    <a href="./Readme-en.md">English Version</a>
  </p>-->
</div>

 <br/>
 
## [👁️‍🗨️](https://emojipedia.org/eye-in-speech-bubble/) 基本概述

高铁轮轨姿态反映了车轮与钢轨之间复杂的动态相互作用和约束关系，掌握他们之间真实接触姿态是保障高速铁路安全运营的重要基础。如何能够精确获得高铁轮轨姿态一直是国内铁路科研的热门研究领域。但单单从二维图像上获取轮轨接触姿态是不精确、不可靠的，而将轮轨表面的特征点提取出来，重建出一个三维模型能更加真实、准确地获得轮轨接触姿态。

由于高铁列车运行速度快，轮轨表面相对光滑且无明显特征点，给基于特征点提取的三维重建带来了极大挑战。

<p align="center">
    <img src="./01.gif" alt="01" width="45%" height="45%"   hspace="10" /> <img src="./02.gif" alt="02" width="45%" height="45%"  />
    <br>
</p>


三维重建技术是计算机视觉技术的一个重要分支，是计算机视觉和计算机图像图形学相结合的一个热门研究方向。根据测量时是否与被测物体接触，可分为接触式测量和非接触式测量。

<div class="imgs" align="center"><img src="./03.png" alt="17" width="50%" height="50%"/></div>

接触式测量方法虽然测量精度高，但测量效率低，速度慢，操作不当很容易损坏被测物体表面，而且由于探头有一定表面积，对表面复杂的物体难以测量，不具备普遍性和通用性。非接触式三维测量方式又可以分为两大类：主动式测量和被动式测量。前者是向目标物体表面投射设计好的图案，该图案由于物体的高度起伏引起一定的畸变，通过匹配畸变的图案获得目标物体的。后者是通过周围环境光对目标物体进行照射，然后检测目标物体的特征点以得到其数据。非接触式测量方式以其无损坏、测量速度高、简单等优点已成为三维轮廓测量的研究趋势。

项目采用的编码结构光法利用投影仪投射出的一定模式的编码结构光图案对目标物体进行编码，利用摄像机获取物体图像，通过计算机对所得图像进行解码处理，利用摄像机中的图像点和投影仪中的点对应关系计算物体表面点的空间坐标，获得物体的三维信息，从而还原物体三维形状，结构光系统如下图所示。

<div class="imgs" align="center" ><img src="./04.png" alt="17" width="80%" height="80%"/></div>

编码结构光法三维重建技术主要由系统标定、结构光编码、图像获取、结构光解码和三维坐标计算等5个关键技术组成。

<div class="imgs" align="center" ><img src="./05.png" alt="19" width="80%" height="80%"/></div>

- 系统标定：系统由摄像机、投影仪和计算机组成，标定的目标是计算摄像机和投影仪内参矩阵、镜头畸变系数和两者之间相对位置的外参矩阵；
- 结构光编码：通过编码的方式使图像每一点的“身份”可以被识别；
- 图像获取：投影仪向物体投射编码结构光图案，图案会随物体表面形状的调制而发生畸变，摄像机拍摄被物体调制过的结构光图像，变形的图像反映了物体表面形状的三维信息；
- 结构光解码：对捕获的结构光图像进行解码，解码的方法取决于编码的方法，目的是建立相机平面和投影平面特征点之间的对应关系；
- 三维坐标计算：利用解码算法得出的特征点对应关系和系统标定结果，基于三角测量原理求出特征点的三维信息。

结构光的编码方式主要有时间编码和空间编码两种。时间编码虽具有较好的重建精度，但由于需要向物体表面投射多张图片，所以对于运动物体来说时间编码的结构光重建不是一个好的选择。空间编码相较于时间编码重建精度较低，但由于只需投射一张图片，所以常常用于动态物体的物体重建。

综上所述，针对项目中轮轨表面光滑，特征点不易提取的难点，可以通过向物体表面投射编码图案，人为地增加物体表面的特征点。由于空间编码只需单次投影，适合对高速运动的高铁轮轨进行重建。因此，本项目主要研究通过空间编码结构光方法获得相对更高精度和高密度的三维点云（点云，即物体表面特征点的集合，这些点包含了物体表面的三维坐标及颜色等信息）。
<br/>

## [📷](https://emojipedia.org/camera/) 技术路线

<table><tr><td width=250px><div class="img" align="center"><img src="./06.png" alt="12" height="100%" width="100%"></div></td><td>项目主要创新点如下：
    <ul><li><b>亚像素级条纹中心的提取</b>：设计实现了编码结构光图案以及适用于该图案的条纹中心点提取算法，将条纹中心点精确到亚像素级别</li>
        <li><b>通过小波变换增加点云稠密度</b>：提出了加窗傅里叶变化对条纹相位分析的改进方法，采用用基于广义 Morse 小波的小波变换进行分析，获得非中心点的相位信息，增加点云稠密度</li>
        <li><b>构建三维重建全流程平台</b>：将上述算法与点云可视化封装成结构光三维重建软件，完成了铁轨及多个几何体的三维重建，预期可用于轮轨姿态重建和可视化</li></ul></td></tr></table>

<table> <tr> <td>编码图案</td><td width=250px>在 HSV 颜色空间下对编码图案进行设计，图案由彩色正弦条纹图案组成
<ul>
<li> H 通道以 𝐵(3,4) 序列进行编码，条纹作为编码图案的基本元素，不同的数值分别对应红、蓝、绿三种颜色</li>
<li> S 通道设定为1</li>
<li>V 通道按照给定的余弦函数计算每一个像素点的值</li>
</ul>
    <p>编码图案共64条条纹，条纹宽度14 𝑝𝑖𝑥𝑒𝑙，以条纹中心点作为投影图案的特征点</p>
♣ 𝐷𝑒 𝐵𝑟𝑢𝑖𝑗𝑛 序列由 𝑛 种不同元素构成，任意长度为 𝑚 的连续子序列只出现一次
    </td><td><div align="center"><img src="./07.png" alt="21" width="100%" height="100%"/></div></td></tr><tr><td>德布鲁因分析</td><td>在对灰度图像进行预处理后，为获得条纹中心点的位置，采用局部最大值算法从类似“高斯”形状的条纹灰度图像中提取图像每一行的局部最大值（以亚像素精度检测），局部最大值点即为条纹的中心点。在 𝐿𝑎𝑏 颜色空间下，对条纹中心点的颜色进行分类，在 4×1 的窗口中，即可获得条纹中心点在投影图案的对应位置。
</td><td><div align="center"><img src="./08.png" alt="22" width="100%" height="100%"/></div></td></tr><tr><td>小波变换分析</td><td>V 通道的变化满足给定的余弦函数，包含了条纹非中心点的相位信息。但图案经过物体的调制，原本平稳的信号发生了改变。小波变换方法作为一个非平稳信号处理方法，被引入到许多信号处理领域，包括从条纹图中提取相位。综合对比了一维和二维的窗口傅里叶变换、小波变换等方法，出于对重建精度和速度的考虑，选择一维小波变换的方法。广义 Morse  小波具有灵活的时频局部特性及严格解析性，且测量物体 3D 轮廓效果优于目前流行的用复 Morlet 小波作为母小波。</td><td><div align="center"><img src="./09.png" alt="23" width="100%" height="100%"/></div></td></tr></table> 
<br/>

## [📽️](https://emojipedia.org/film-projector/) 评价指标

<table> <tr align="center"> <td><div align="center"><img src="./10.gif" alt="24" width="100%" height="100%"/></div></td><td>
   <div align="center"><img src="./11.gif" alt="25" width="100%" height="100%"/></div> </td><td> <div align="center"><img src="./12.gif" alt="26" width="100%" height="100%"/></div> </td></tr><tr align="center"><td>半径95mm的球体<br>表面点云17W+<br>半径误差0.678mm<br>运算时间10-15s</td><td>多物体三维重建</td><td>铁轨表面三维重建</td></tr></table> 
<br/>

## [💻](https://emojipedia.org/laptop/) 软件展示

<a style="color:blue" href="https://github.com/Tang1705/Reconstruction/raw/master/Exe/Reconstructionn.exe">软件</a>集三维重建整个流程为一体，主要实现系统（相机与投影仪）标定、三维重建和点云渲染三个功能。软件以 C++ 作为开发语言并基于  QT  框架进行界面开发，依赖于 OpenCV 和 PCL (Point Cloud Library) 进行图像和点云数据处理。在开发上采用了单例模式、责任链模式等设计模式。 <a href="https://youtu.be/DM47pxDPks8"><img src="https://img.shields.io/badge/Demo- -%23FF0000?colorA=%23FF0000&colorB=%23FF0000&style=for-the-badge&logo=YouTube"/></a>

- 系统标定界面
<div class="imgs" align="center" ><img src="./13.jpg" alt="16"  width="75%" height="75%" /></div>

- 三维重建界面
<div class="imgs" align="center" ><img src="./14.jpg" alt="17"  width="75%" height="75%" /></div>

- 点云渲染界面
<div class="imgs" align="center" ><img src="./15.jpg" alt="18"  width="75%" height="75%" /></div>
<br/>

## [🔧](https://emojipedia.org/wrench/) 开发配置

<table><tr align="center" style="background-color:#D9E2F3"><td width="500px">硬件环境</td><td  width="500px">版本</td></tr><tr align="center"><td>Point Grey Camera</td><td>——</td></tr><tr align="center"><td>LightCrafter4500</td><td>——</td></tr></table>
<table><tr align="center" style="background-color:#D9E2F3"><td  width="500px">软件环境</td><td  width="500px">版本</td></tr><tr align="center"><td>Windows</td><td>Windows 10</td></tr><tr align="center"><td>Visual Studio</td><td>2017</td></tr><tr align="center"><td>QT</td><td>5.12.3</td></tr><tr align="center"><td>OpenCV</td><td>4.2.03</td></tr><tr align="center"><td>FlyCapture2</td><td>2.12.3.2</td></tr><tr align="center"><td>PCL</td><td>1.8.1</td></tr><tr align="center"><td>VTK</td><td>8.0</td></tr></table>

<div><text style="color:red">说明</text>：需配置电脑的环境变量、Visual Studio 中项目的属性（VC++ 目录-包含目录、VC++ -库目录和链接器-输入-附加依赖性）</div>
<br/>

## 📜 开源许可

代码在 [Apache 2.0 License](https://www.apache.org/licenses/LICENSE-2.0) 下可用
