上一次得到的点云图在累加多张后配准会出现少量离群的点云,效果很差,于是考虑从 ICL-NUIM dataset这个数据集获得官方的室内图进行三维重建,数据集网址如下:

ICL-NUIM RGB-D Benchmark Dataset

一. 数据筛选

首先第一步,从九百多张彩色图和深度图中挑选部分图片进行点云生成,因为九百多张图太多了,重复的内容太多用来重建计算量太大(其实就是电脑配置不行)。

我选的是Living Room 'lr kt1'这个数据集,965张图,选36张,所以大概间隔27张选一张吧。注意,open3d生成rgbd图需要彩色图的深度是8位三通道或者是8位灰度图,所以在筛选时就要改成位深度,不然后面会报错说格式不符合要求: [CreateFromColorAndDepth] Unsupported image format

代码如下:

from PIL import Image
import osdef load(from_path, out_path):dirs = os.listdir(from_path)os.chdir(from_path)for file in dirs:        # 把文件类型后缀去掉后就只剩数字,所以转换成数字然后每27张选一张出来if(int(file.strip('.png')) % 27 == 0):image = Image.open(file) # 这一步将彩色图转化为8位灰度图,会使后续点云没有颜色,建议保存成彩色8位# image = image.convert('L')image.save(os.path.join(out_path, file))  # 这是rgb图的路径,转换深度图就把路径改成depth的
load('.\pcldata\living_room_traj1_frei_png/rgb', '.\pcldata\living_room/rgb')

二.数据转换

然后使用open3d的create_from_color_and_depth函数将彩色图和深度图转换成RGBD图,注意,这里对格式的要求是,彩色图是8位深度三通道,深度图是16位深度,右键图片看看自己图片符不符合标准。还要注意的一点就是彩色图和深度图的size要一样大,我这里下载的数据集就都是640x480的。

然后,用以下的代码生成RGBD图并利用RGBD图生成点云。

import open3d as o3d
import matplotlib.pyplot as plt # plt 用于显示图片
import numpy as np
import osrgb_path = '.\pcldata\living_room/rgb/'
depth_path = '.\pcldata\living_room\depth/'
rgb_dirs = os.listdir(rgb_path)
depth_dirs = os.listdir(depth_path)
print("读取RGB图片:", len(rgb_dirs), "张")
print("读取Depth图片:", len(depth_dirs), "张")#一共转换36张图
for i in range(36):color_raw = o3d.io.read_image(rgb_path + rgb_dirs[i])depth_raw = o3d.io.read_image(depth_path + depth_dirs[i])# 这一步因为我的深度图的值都在10000左右,但depth_scale默认值是1000,我就把depth_trunc从默认的3改成30,深度就显示出来,原理不是很懂rgbd_image = o3d.geometry.RGBDImage.create_from_color_and_depth(color_raw, depth_raw, depth_scale=1000.0, depth_trunc=30, convert_rgb_to_intensity=False)plt.subplot(1, 2, 1)plt.title('read_depth')plt.imshow(rgbd_image.color)plt.subplot(1, 2, 2)plt.title('depth image')plt.imshow(rgbd_image.depth)plt.show()# 若要查看自己的深度图值是多少,使用下面的np函数显示# print(np.asarray(rgbd_image.depth))pcd = o3d.geometry.PointCloud.create_from_rgbd_image(rgbd_image,o3d.camera.PinholeCameraIntrinsic(o3d.camera.PinholeCameraIntrinsicParameters.PrimeSenseDefault))print("第%d张点云数据:"%i, pcd)pcd.transform([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]])# o3d.visualization.draw_geometries([pcd])o3d.io.write_point_cloud("./pcldata/living_room/pcd/%d.pcd" %i, pcd)

我遇到的一个问题是生成的RGBD图中的深度图是纯黑的,如下图

然后我用 print(np.asarray(rgbd_image.depth)) 看了下图片的深度值,基本在10000左右,但我看官方文档实例的图片深度在两三千浮动,怀疑自己的深度值太大导致的,然后看了下 PointCloud.create_from_rgbd_image 这个函数的文档,有个默认值depth_scale 的值是1000,我的深度范围10000明显超过了它的范围,我试了两种方法,一个是把depth_scale改成10000,深度图正常显示了,另一个方法是depth_scale还是保持1000不变,depth_trunc从默认值3改到30,也能正常显示,效果基本一样,我就用了第二种方法。显示效果如下:

至此,RGBD图的生成就结束了,接下来只需调用自带的点云生成函数PointCloud.create_from_rgbd_image 就好了,注意,如果要生成彩色点云,convert_rgb_to_intensity参数需要设为False。在可视化点云的时候官方文档加了个参数

zoom = 0.5,我加了这个参数后可视化就报错,把它删了就正常了。

保存下来,下一步准备进行点云配准和室内三维重建的工作。

Open3d利用彩色图和深度图生成点云进行室内三维重建相关推荐

  1. PCL——从点云到网格(一)利用OpenNI2和深度相机生成点云

    最近做毕设,学习了一下PCL的使用(C++).这几篇博客就记录一下自己做毕设的时候利用深度相机得到点云,最后生成Mesh的过程.效果应该不是最好的,但是先把流程记录下来,自己下次看的时候就知道大体流程 ...

  2. ROS下获取kinectv2相机的仿照TUM数据集格式的彩色图和深度图

    准备工作: 1. ubuntu16.04上安装iai-kinect2, 2. 运行roslaunch kinect2_bridge kinect2_bridge.launch, 3. 运行 rosru ...

  3. ROS获取KinectV2相机的彩色图和深度图并制作bundlefusion需要的数据集

    背景: 最近在研究BundleFusion,跑通官方数据集后,就想着制作自己的数据集来运行bundlefusion.KinectV2相机可直接获取的图像的分辨率分为三个HD 1920x1080, QH ...

  4. 图像处理中涉及的灰度图、彩色图以及深度图概念

    图像处理中涉及最多的概念就是图像的类型,为了很好的理解图像的概念以及处理图片,我们就需要对常见的图像具有一定的概念. 我们首先介绍一下生活中常见的图像格式: 1.bmp格式:这是一种不常见的图像格式, ...

  5. kinect linux 深度处理,kinect彩色图和深度图对齐(一)

    本文主要记录kinect相关的知识和对齐方法,这是第一部分,此记. 深度相机成像方法简介 深度相机就是可以获取场景中物体距离摄像头物理距离的相机.深度相机通常由多种镜头和光学传感器组成,根据测量原理不 ...

  6. (19)深度点云学习--利用RGBD图三维重建room

    1.主要参考 (1)最主要参考,官方的blog Make fragments - Open3D 0.16.0 documentation (2)操作流程参考 Python从RGBD数据进行3D场景重建 ...

  7. 彩色图片和深度图片生成点云文件

    输入:深度相机的内参,彩色图和深度图 输出:点云数据 代码:http://download.csdn.net/detail/qq_22904277/9907969

  8. ROS下利用realsense采集RGBD图像合成点云

    摘要:在ROS kinetic下,利用realsense D435深度相机采集校准的RGBD图片,合成点云,在rviz中查看点云,最后保存成pcd文件. 一. 各种bug 代码编译成功后,打开rviz ...

  9. CV第四次上机 利用双目图像计算深度图

    一.实验目的: 利用双目图像计算深度 二.实验环境: Win 10 + Matlab R2018a 三.实验理论--双目立体匹配获取深度图   双目立体匹配一直是双目视觉的研究热点,双目相机拍摄同一场 ...

最新文章

  1. 生产型机器学习已经没那么困难了?
  2. vrrp的组播地址是多少
  3. jdk安装好后没有jre,手动生成jre
  4. webpack和vue的按需加载组件、console、抓包
  5. 【直观理解】一文搞懂RNN(循环神经网络)基础篇
  6. div+css使多行文字垂直居中?
  7. Google 已经实现即点即玩,国内 Android 何时跟上?
  8. 深入研究:HTTP2的真正性能到底如何
  9. 全源最短路 Johnson算法
  10. pycharm下载安装opencv
  11. android硬件加速默认,Android的硬件加速
  12. 使命召唤手游显示服务器停服,使命召唤手游停服了吗 是手游还是端游
  13. windows10插入耳机没有反应的问题
  14. 文件删除终结者 v1.2 免费
  15. 【CodeForces】896 B. Ithea Plays With Chtholly
  16. 必应搜索器主页图片网址
  17. 知云文献翻译打不开_还在为论文翻译烦恼吗?点进来帮您解决
  18. 【flutter布局】如何在动态宽高的容器下,使子组件自动占满宽高
  19. css 的 filter:grayscale 哀悼模式
  20. html调用大华摄像头demo

热门文章

  1. matlab函数im2bw_matlab函数大全
  2. LIO-PPF:通过增量平面预拟合和跟踪的快速激光雷达惯导里程计
  3. Windows server 2003 QQ宠物猪伴侣出错解决办法
  4. 企业内部即时通信软件都有哪些?
  5. php随机整数函数,PHP随机数函数rand()与mt_rand()
  6. java下载word,解决文件名中文乱码的问题(包括edge跟ie11)
  7. Java学习第八天之super关键字的概念
  8. windows十种注入方式
  9. 下拉框、下拉控件之Select2(含多选)
  10. linux查看当前目录下的所有目录