利用Realsense-ros订阅topic获取D435i深度值
利用Realsense-ros订阅相关话题获取与RGB图对齐的深度图及任意指定一点的深度值的代码请移步:
链接: https://blog.csdn.net/weixin_44350238/article/details/103565100.
本文针对上述链接中的代码的一些问题作补充。
需要包含的头文件
原作者老哥没有给出需要包含的头文件 。#include <cv_bridge/cv_bridge.h>
是用于Ros图像与Opencv图像的相互转换的,有兴趣的可以参考文章: https://blog.csdn.net/qq_27050183/article/details/51141998;#include <opencv2/highgui.hpp>
OpenCV可视化,链接文章中的代码不需要,因为我想要写出深度图像,所以需要包含这个头文件;#include <ros/ros.h>
ROS订阅发布必备,不用多说。
#include <cv_bridge/cv_bridge.h>
#include <opencv2/highgui.hpp>
#include <ros/ros.h>
深度值异常
我在使用链接中代码获取一点深度值的时候需要一个问题:深度值要么特别大,要么就是0
,如图所示
写出的图像酱婶儿的:
像素值基本上就是0
和255
(超过255的都是255)。什么原因呢?找了半天发现是回调函数void DepthCallback
中ros_Img转cv_img出现了问题:
data =
// cv_bridge::toCvCopy(depth_img, sensor_msgs::image_encodings::TYPE_32FC1)
cv_bridge::toCvCopy(depth_img, sensor_msgs::image_encodings::TYPE_16UC1)
->image;
std::cout << "image data: " << data.at<uint16_t>(240, 320) << std::endl;//表示获取图像坐标为240,320的深度值,单位是毫米
cv::imwrite("testdepth.jpg", data);
注释部分是原作者老哥的代码,下面是我的代码。很明显,是图像数据结构的问题。上面转换用的是TYPE_32FC1
32位浮点型,下面在打印深度值时用的uint16_t
16位整型,所以直接将转换图像的数据类型改为对应的TYPE_16UC1
16位整型就OK了。另外…D435i相机输出深度图好像没有浮点型吧?(我也不太清楚,望指正)
图像像素“归255化”处理
D435i相机的有效深度量测范围是0.1m~10m
,直接获取的深度值单位是mm
,很明显,当深度值超过0.255m
时,输出的深度图非常具有f国特色(今日不辱f!)一片白。所以需要把这些深度值都约束到0~255
这个范围内,代码很简单:
cv::imwrite("/home/ggh/1_ggh_workdir/gazebo_offb/catkin_drone/data/depth.jpg", (depth/32767)*255);
std::cout << "image data: " << depth.at<uint16_t>(360, 640) * 0.001 << std::endl;
TYPE_16UC1
的数值范围是-32768~32767
,深度值不会为负值,所以除以32767再乘以255就OK了。下面我想打以米为单位的深度,就乘以0.001。最后结果如图:
这里的0
是错误测量值。
大家有什么问题请在评论区留言交流,文章中有不正确的地方望大佬们斧正。