本文介绍了使用PCL实现从二维图像转换成三维点云的过程
Python环境下的编程参考这篇博文~
一、基本配置
我的配置是Win10+OpenCV3.4.1+Python3.6.1+PCL1.8.1,注意PCL1.8.0以上的版本只支持Python3.5以上的版本。
1. OpenCV安装
参考我的上一篇博文Win10+vs2015+opencv3.4.1+附加模块opencv_contrib+cmake3.11.0编译和配置~ 在此就不赘述了。
2. PCL安装
PCL的安装和环境配置可参考这篇博文中”工程配置”之前的部分。
3. Python-PCL的配置
(1)将这个github中的仓库以ZIP形式下载到本地并解压。
(2)下载Windows Gtk+并解压,将bin目录下的文件拷贝到上一个步骤解压的python-pcl-master文件夹下的pkg-config文件夹中
更新: Windows Gtk+的链接貌似失效,附上我分享的百度云网盘链接,链接如过期欢迎在下方提问,我会及时更新。
我已分享到百度网盘~链接: https://pan.baidu.com/s/1rxmBHsDy2LabSg-l_rUsNQ 提取码: 9y8t
(3)设置环境变量
- 在系统变量中添加变量PCL_ROOT,变量值是PCL路径。
- 在PATH路径中设置以下三个变量,分别是
<你的PCL路径>\bin
、<你的OPEN_NI的路径>\Tools
、<你的VTK路径>\bin
。
(4)安装必需模块
如果电脑中同时有python2和python3的话,注意电脑中的pip对应哪个版本的python,若pip对应python2,以下命令用pip3
1 | pip install --upgrade pip |
回到python-pcl-master
文件夹,打开cmd输入如下指令配置python-pcl:
1 | python setup.py build_ext -i |
到此整个编程环境就配置好啦!可以开始写代码了~
二、从2D到3D
1. 数学部分
参考高博博文,PS:这是一个很棒的SLAM博客~我简单列举一下写代码时需要用到的公式——从图像坐标到世界坐标的转换(即已知 $[u,v,d]$ 推导出 $[x,y,z]$ )
通常,把 $f_x,f_y,c_x,c_y$ 四个参数定义为相机的内参矩阵 $C$ ,也就是相机做好之后就不会变的参数。
2. 编程部分
先给出全部代码,之后再分开讲解各部分的作用。
1 | import cv2 |
接下来讲解一下各部分代码的作用。
1 | import cv2 |
在python中,cv2.imread()函数会将图片数据存储为一个多维列表(list),第二个参数设置为-1表示以原始图像读取。
1 | for m in range(0, rows): |
接下来我们按照“先列后行”的顺序,遍历整张图。m指图像的行,n指图像的列。它们和空间点的坐标关系是这样的:
1 | for m in range(0, rows): |
在for循环中,先获取图像深度(注意不同来源的图片,其图像深度获取方式不同,有的数据集中给出rgb图像和深度图像,这里的深度图像读取后不作变换就是深度,而我们的项目中深度的计算公式是:$b + g * 256$ ,而python中是以[b, g, r]的格式存储图像的),再进行从图像坐标到世界坐标的转换,将每个点存入一个列表中。
1 | import numpy as np |
由于pcl库不会直接识别列表格式的点云数据,所以我们需要使用numpy库进行数据格式转换,并将点云保存pcd文件中。
最后,在当前目录下打开cmd或者powershell,运行pcl_viewer_release(在<PCL安装路径>\bin目录下,根据个人需要选择release或debug版本),就可以看到我们生成的点云了。
结果如下~:
原始图片:
点云: