从深度图获取点云

之前用的方法一直都是利用深度图的像素坐标(x,y)和像素值z自行计算点云,代码如下

for (int m = 0; m < depth.rows; m++){for (int n = 0; n < depth.cols; n++){// 获取深度图中(m,n)处的值uchar d = depth.ptr<uchar>(m)[n];// d 可能没有值,若如此,跳过此点if (d == 0)continue;// d 存在值,则向点云增加一个点PointT p;// 计算这个点的空间坐标/ camera_factorp.z = (300-double(d))*4;p.x = (m - camera_cx) * p.z / camera_fx;p.y = (n - camera_cy) * p.z / camera_fy;// 从rgb图像中获取它的颜色//彩色图是三通道的BGR格式图,所以按下面的顺序获取颜色// 把p加入到点云中cloud->points.push_back(p);}}

但这样计算出来的点云有一些问题,表现为图片中的直角转成点云后会变成45度的角,原因不明,查阅资料后发现可以使用librealsense自带的API完成深度图到点云的转换

主要参考官方example,利用example里面实现的pcl_ptr points_to_pcl(const rs2::points& points)这个函数就可以完成从realsenseSDK中的点云到PCL点云的转换,几行代码就可以实现,比较简单

// Declare pointcloud object, for calculating pointclouds and texture mappings
rs2::pointcloud pc;
// We want the points object to be persistent so we can display the last cloud when a frame drops
rs2::points points;auto frames = pipe.wait_for_frames();auto depth = frames.get_depth_frame();// Generate the pointcloud and texture mappings
points = pc.calculate(depth);
auto pcl_points = points_to_pcl(points);

如果使用了rs2::align来对齐深度和彩色帧,将对齐后的depth_frame传入calculate函数同样可以使用

将点云中的点投影回深度/彩色图

注意:realsense直接获得的深度图和彩色图是不重合的,需要使用rs2::align后才能对齐
用法如下

 rs2::pipeline pipe;     //Contruct a pipeline which abstracts the devicers2::config cfg;    //Create a configuration for configuring the pipeline with a non default profilecfg.enable_stream(RS2_STREAM_COLOR, 640, 480, RS2_FORMAT_BGR8, 30);cfg.enable_stream(RS2_STREAM_DEPTH, 640, 480, RS2_FORMAT_Z16, 30);rs2_stream align_to = RS2_STREAM_COLOR;rs2::align align(align_to);while(true){rs2::frameset frames;frames = pipe.wait_for_frames();rs2::pointcloud pc;rs2::points points;auto processed = align.process(frames);//Get each frameauto color_frame = processed.get_color_frame();auto depth_frame = processed.get_depth_frame();}

接下来的内容主要参考官方wiki

要将点云中的三维点投影回图像,需要用到void rs2_project_point_to_pixel(float pixel[2], const rs2_intrinsics* intrin, const float point[3])
pixel 是传入的空数组,程序会将计算出的xy坐标放在里面
intrin 是相机内参
point 是点云中的点,顺序是x,y,z
realsense就不能搞个OpenCV一样规整一点的文档吗,真的找啥也难

获取相机内参
rs2_intrinsics是一个结构体,可以通过`get_intrinsics()``函数获取
具体用法如下(接上方align的代码)

     auto color_frame = processed.get_color_frame();auto depth_frame = processed.get_depth_frame();points = pc.calculate(depth_frame);auto prof=depth_frame.get_profile().as<rs2::video_stream_profile>();auto i=prof.get_intrinsics();

如果前面用过align,那么一定要用对齐后的frame来获取内参矩阵
如果没做对齐,这个get_intrinsics()rs2::video_stream_profile类的成员函数,为了获取这个类,首先需要利用rs2::depth_frame类的depth_frame.get_profile()函数获得rs2::stream_profile类的对象,再利用rs2::stream_profile类的成员函数as<rs2::video_stream_profile>()获得rs2::video_stream_profile类,然后就可以用这个函数了
我也不知道librealsense在干什么

rs2_intrinsics的具体定义在这里,考虑到内参矩阵不变,可以获取之后打印出来记下,然后自己构建一个rs2_intrinsics的实例直接拿来用

Intel realsense SR300深度图获取点云和点云投影至图像全流程相关推荐

  1. python opencv cv.applyColorMap()函数(颜色映射)ColormapTypes【将Intel Realsense D435深度图的黑白图映射为彩色图】

    文章目录 API ColormapTypes 完整应用代码[将深度图的黑白图映射为彩色图] map原理 能否map CV_24UC3的? API def applyColorMap(src, colo ...

  2. Intel Realsense D435 如何获取摄像头的内参?get_profile() video_stream_profile() get_intrinsics()

    # 获取摄像头的内参是为了将像素坐标转化成实际坐标 import pyrealsense2 as rspipeline = rs.pipeline() config = rs.config() con ...

  3. Intel Realsense D435 深度图为什么会出现残影?(Invalid Depth Band 无效深度带)(黑洞)

    现象描述 官方回复1 图像最左侧的噪声通常与称为"无效深度带"的现象有关,该现象会在相机靠近物体时扩大. 在当前版本的400系列摄像机的数据表文档的第59-60页中对此进行了描述. ...

  4. Intel Realsense D435 通过识别目标的像素坐标和深度值(使用内参intrinsics)获取目标点的真实坐标

    Intel Realsense D435 通过识别目标的像素坐标和深度值(使用内参intrinsics)获取目标点的真实坐标 图原理 基本获取内参`intrinsics`代码 实操代码1(在`tens ...

  5. Intel Realsense API 汇总-----Python

    API使用目录 官方API文档 获得相机不同传感器之间的外参转换矩阵以及内参矩阵 python代码 python代码 外参转换矩阵的含义 获取设备的传感器信息 python代码 获得深度图单位和米之间 ...

  6. Intel Realsense 深度流向彩色流对齐 color_aligned_to_depth和depth_aligned_to_color

    为啥要对齐 由于RGB图像数据与深度图像数据的空间坐标系是不同的,前者的原点是RGB摄像头,后者的原点是红外摄像头,因此两者会有相应的误差. 对齐原理 深度图上的2D点转换到世界坐标的3D点,世界坐标 ...

  7. intel realsense

    参考 intel realsense SR300 深度图像和彩色图像对齐_jay463261929的博客-CSDN博客_sr300深度相机 Realsense2深度相机的基本操作命令_每天进步一点点! ...

  8. 20200301 Intel Realsense D435摄像头掉线问题测试数据记录

    计算机号 测试摄像头数量 序列号(无序) USB线长(米) 插入口 测试开始时间 测试结束时间 测试时长 是否硬掉线 软掉线次数 备注 DESKTOP-FPE66EJ 2 '838212073249' ...

  9. intel realsense获取8位深度图

    intel realsense获取8位对齐深度图 实例代码 Mac环境配置看这里 实例代码 import png import pyrealsense2 as rs import logging lo ...

最新文章

  1. Scrapy框架中管道的使用
  2. 2019年山西计算机二级报名入口,2019年下半年山西省计算机二级考试教程:Web程序设计...
  3. oracle-sql汇总
  4. testNG的DataProvider返回IteratorObject[]的妙用
  5. 适合python爬虫使用的浏览器_python爬虫:使用Selenium模拟浏览器
  6. Qt-QMessageBox用法详解
  7. matlab中计算不等式的解,大神们,求个解多元一次不等式的代码,要所有整数解...
  8. [转]RegOpenKeyEx函数失败的问题
  9. 转转Q1手机行情:iPhone13开始“飘香” 二手5G手机市场苹果占一半
  10. Java面向对象----抽象类
  11. C++:向函数传递对象(对象、对象指针、对象引用)
  12. 设备维保管理系统对于设备正常运行的重要性!
  13. Accessing Data with MongoDB
  14. C# %253A%252F%252F 咋编码
  15. Redis 配置开机自动启动
  16. 递归查询,父类获取对应子类集合
  17. 关于成本核算方法、步骤、成本分析
  18. python自动化第三天-python3
  19. 【美团点评2020校招测试方向笔试题】算法题部分1.删除字符 2.队列组合排序 3.寻找最小子字符串 4.最大矩形 5.最短送餐路程计算
  20. 垃圾分类查询+小程序源码

热门文章

  1. 【OpenCV图像处理13】图像拼接
  2. 如何关闭android bt配对窗口,Android 连接SSID隐藏网络以及 LEAP 认证的方法
  3. 网络地址转换——NAT、NAPT详解
  4. java运算符(java运算符优先级由高到低)
  5. 二手华为手机价格表最新报价
  6. 内网穿透 ngrok 服务器和客户端配置
  7. armbian取消休眠去屏保并安装中文输入法
  8. 虚拟机设置共享文件夹添加不显示
  9. ImageLoad图片设计框架
  10. Linux AES加密