利用Realsense-ros订阅topic获取D435i深度值

利用Realsense-ros订阅topic获取D435i深度值

利用Realsense-ros订阅相关话题获取与RGB图对齐的深度图及任意指定一点的深度值的代码请移步:
链接: https://blog.csdn.net/weixin_44350238/article/details/103565100.

本文针对上述链接中的代码的一些问题作补充。

需要包含的头文件

原作者老哥没有给出需要包含的头文件 。#include 是用于Ros图像与Opencv图像的相互转换的,有兴趣的可以参考文章: https://blog.csdn.net/qq_27050183/article/details/51141998;#include OpenCV可视化,链接文章中的代码不需要,因为我想要写出深度图像,所以需要包含这个头文件;#include ROS订阅发布必备,不用多说。

#include <cv_bridge/cv_bridge.h>
#include <opencv2/highgui.hpp>
#include <ros/ros.h>

深度值异常

我在使用链接中代码获取一点深度值的时候需要一个问题:深度值要么特别大,要么就是0,如图所示
利用Realsense-ros订阅topic获取D435i深度值_第1张图片
写出的图像酱婶儿的:
利用Realsense-ros订阅topic获取D435i深度值_第2张图片
像素值基本上就是0255(超过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_32FC132位浮点型,下面在打印深度值时用的uint16_t16位整型,所以直接将转换图像的数据类型改为对应的TYPE_16UC116位整型就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。最后结果如图:
利用Realsense-ros订阅topic获取D435i深度值_第3张图片
这里的0是错误测量值。
利用Realsense-ros订阅topic获取D435i深度值_第4张图片

大家有什么问题请在评论区留言交流,文章中有不正确的地方望大佬们斧正。

你可能感兴趣的:(计算机视觉,opencv,可视化)