Intel realsense SR300深度图获取点云和点云投影至图像全流程
从深度图获取点云
之前用的方法一直都是利用深度图的像素坐标(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深度图获取点云和点云投影至图像全流程相关推荐
- python opencv cv.applyColorMap()函数(颜色映射)ColormapTypes【将Intel Realsense D435深度图的黑白图映射为彩色图】
文章目录 API ColormapTypes 完整应用代码[将深度图的黑白图映射为彩色图] map原理 能否map CV_24UC3的? API def applyColorMap(src, colo ...
- Intel Realsense D435 如何获取摄像头的内参?get_profile() video_stream_profile() get_intrinsics()
# 获取摄像头的内参是为了将像素坐标转化成实际坐标 import pyrealsense2 as rspipeline = rs.pipeline() config = rs.config() con ...
- Intel Realsense D435 深度图为什么会出现残影?(Invalid Depth Band 无效深度带)(黑洞)
现象描述 官方回复1 图像最左侧的噪声通常与称为"无效深度带"的现象有关,该现象会在相机靠近物体时扩大. 在当前版本的400系列摄像机的数据表文档的第59-60页中对此进行了描述. ...
- Intel Realsense D435 通过识别目标的像素坐标和深度值(使用内参intrinsics)获取目标点的真实坐标
Intel Realsense D435 通过识别目标的像素坐标和深度值(使用内参intrinsics)获取目标点的真实坐标 图原理 基本获取内参`intrinsics`代码 实操代码1(在`tens ...
- Intel Realsense API 汇总-----Python
API使用目录 官方API文档 获得相机不同传感器之间的外参转换矩阵以及内参矩阵 python代码 python代码 外参转换矩阵的含义 获取设备的传感器信息 python代码 获得深度图单位和米之间 ...
- Intel Realsense 深度流向彩色流对齐 color_aligned_to_depth和depth_aligned_to_color
为啥要对齐 由于RGB图像数据与深度图像数据的空间坐标系是不同的,前者的原点是RGB摄像头,后者的原点是红外摄像头,因此两者会有相应的误差. 对齐原理 深度图上的2D点转换到世界坐标的3D点,世界坐标 ...
- intel realsense
参考 intel realsense SR300 深度图像和彩色图像对齐_jay463261929的博客-CSDN博客_sr300深度相机 Realsense2深度相机的基本操作命令_每天进步一点点! ...
- 20200301 Intel Realsense D435摄像头掉线问题测试数据记录
计算机号 测试摄像头数量 序列号(无序) USB线长(米) 插入口 测试开始时间 测试结束时间 测试时长 是否硬掉线 软掉线次数 备注 DESKTOP-FPE66EJ 2 '838212073249' ...
- intel realsense获取8位深度图
intel realsense获取8位对齐深度图 实例代码 Mac环境配置看这里 实例代码 import png import pyrealsense2 as rs import logging lo ...
最新文章
- Scrapy框架中管道的使用
- 2019年山西计算机二级报名入口,2019年下半年山西省计算机二级考试教程:Web程序设计...
- oracle-sql汇总
- testNG的DataProvider返回IteratorObject[]的妙用
- 适合python爬虫使用的浏览器_python爬虫:使用Selenium模拟浏览器
- Qt-QMessageBox用法详解
- matlab中计算不等式的解,大神们,求个解多元一次不等式的代码,要所有整数解...
- [转]RegOpenKeyEx函数失败的问题
- 转转Q1手机行情:iPhone13开始“飘香” 二手5G手机市场苹果占一半
- Java面向对象----抽象类
- C++:向函数传递对象(对象、对象指针、对象引用)
- 设备维保管理系统对于设备正常运行的重要性!
- Accessing Data with MongoDB
- C# %253A%252F%252F 咋编码
- Redis 配置开机自动启动
- 递归查询,父类获取对应子类集合
- 关于成本核算方法、步骤、成本分析
- python自动化第三天-python3
- 【美团点评2020校招测试方向笔试题】算法题部分1.删除字符 2.队列组合排序 3.寻找最小子字符串 4.最大矩形 5.最短送餐路程计算
- 垃圾分类查询+小程序源码