目录

非ROS版本

配置

使用

注意:

ROS版本


非ROS版本

配置

要在linux下使用realsense相机,需要首先配置librealsense。我的环境是Ubuntu18.04,相机是D435i相机。

librealsense的地址在点击这里。

但是自己编译的时候发现太慢了,根本不知道是卡住了,还是正常进行但是时间比较漫长。很麻烦,建议不要自己编译,而是直接用apt install 的方式来装,这样装又快又省事,官方也给了相关的说明,点击这里。

首先,加载key:

sudo apt-key adv --keyserver keys.gnupg.net --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE || sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE

对于16.04系统,

sudo add-apt-repository "deb http://realsense-hw-public.s3.amazonaws.com/Debian/apt-repo xenial main" -u

对于18.04系统:

sudo add-apt-repository "deb http://realsense-hw-public.s3.amazonaws.com/Debian/apt-repo bionic main" -u

然后只要安装下面两个就可以了:

sudo apt-get install librealsense2-dkms
sudo apt-get install librealsense2-utils

上面这两个正常的网速来说,每个顶多半个小时。如果卡着很慢,最好是Ctrl+C掉重新来,不要一直等。

在装完之后,插上相机,输入这个指令就可以打开官方提供的GUI面板了:

realsense-viewer

不过,相机需要连接到USB3.0接口而不是2.0接口,否则打开后会报错。


使用

在GUI面板中可以以bag的形式保存拍摄的内容,相信很多人最关心的就是对这个bag的读取,或者说干脆自己通过代码操控相机,更重要的是把RGB图像和depth图像对齐起来,好从某个像素的位置处读取其对应的深度。

我写了一段Python代码,可以读取播放之前通过GUI面板保存的bag,或者实时通过相机拍摄记录视频(这种方式还可以指定图像的拍摄大小,以及拍摄的帧率)

另外还提供了两种功能:把深度图对齐到彩色图像,或者把彩色图像对齐到深度图像。

首先需要装一个包:

pip install pyrealsense2

然后具体代码如下:

#coding=utf-8
import pyrealsense2 as rs
import numpy as np
import cv2#0:使用相机
# 1:使用API录制好的bag
USE_ROS_BAG=1
#0:彩色图像对齐到深度图;
# 1:深度图对齐到彩色图像
ALIGN_WAY=1def Align_version(frames,align,show_pic=0):# 对齐版本aligned_frames = align.process(frames)depth_frame_aligned = aligned_frames .get_depth_frame()color_frame_aligned = aligned_frames .get_color_frame()# if not depth_frame_aligned or not color_frame_aligned:#     continuecolor_image_aligned = np.asanyarray(color_frame_aligned.get_data())if USE_ROS_BAG:color_image_aligned=cv2.cvtColor(color_image_aligned,cv2.COLOR_BGR2RGB)depth_image_aligned = np.asanyarray(depth_frame_aligned.get_data())depth_colormap_aligned = cv2.applyColorMap(cv2.convertScaleAbs(depth_image_aligned, alpha=0.05), cv2.COLORMAP_JET)images_aligned = np.hstack((color_image_aligned, depth_colormap_aligned))if show_pic:cv2.imshow('aligned_images', images_aligned)return color_image_aligned,depth_image_aligned,depth_colormap_aligneddef Unalign_version(frames,show_pic=0):# 未对齐版本# Wait for a coherent pair of frames: depth and colorframes = pipeline.wait_for_frames()depth_frame = frames .get_depth_frame()color_frame = frames .get_color_frame()if not USE_ROS_BAG:left_frame = frames.get_infrared_frame(1)right_frame = frames.get_infrared_frame(2)left_image = np.asanyarray(left_frame.get_data())right_image = np.asanyarray(right_frame.get_data())if show_pic:cv2.imshow('left_images', left_image)cv2.imshow('right_images', right_image)# if not depth_frame or not color_frame:#     continuecolor_image = np.asanyarray(color_frame.get_data())print("color:",color_image.shape)depth_image= np.asanyarray(depth_frame.get_data())print("depth:",depth_image.shape)#相机API录制的大小rosbag的rgb图像与depth图像不一致,用resize调整到一样大if USE_ROS_BAG:color_image=cv2.cvtColor(color_image,cv2.COLOR_BGR2RGB)if ALIGN_WAY:  #深度图对齐到彩色图像depth_image=cv2.resize(depth_image,(color_image.shape[1],color_image.shape[0]))else:   #彩色图像对齐到深度图color_image=cv2.resize(color_image,(depth_image.shape[1],depth_image.shape[0]))# 上色depth_colormap = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.05), cv2.COLORMAP_JET)# Stack both images horizontallyimages = np.hstack((color_image, depth_colormap))if show_pic:cv2.imshow('images', images)return color_image,depth_image,depth_colormapif __name__ == "__main__":# Configure depth and color streamspipeline = rs.pipeline()config = rs.config()if USE_ROS_BAG:config.enable_device_from_file("666.bag")#这是打开相机API录制的视频else:config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)  #10、15或者30可选,20或者25会报错,其他帧率未尝试config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)#左右双目config.enable_stream(rs.stream.infrared, 1, 640, 480, rs.format.y8, 30)  config.enable_stream(rs.stream.infrared, 2, 640, 480, rs.format.y8, 30)if ALIGN_WAY:way=rs.stream.colorelse:way=rs.stream.depthalign = rs.align(way)profile =pipeline.start(config)depth_sensor = profile.get_device().first_depth_sensor()depth_scale = depth_sensor.get_depth_scale()print("scale:", depth_scale)# 深度比例系数为: 0.0010000000474974513try:while True:frames = pipeline.wait_for_frames()color_image_aligned,depth_image_aligned,depth_colormap_aligned=Align_version(frames,align,show_pic=1)color_image,depth_image,depth_colormap=Unalign_version(frames,show_pic=1)     #print(depth_image_aligned*depth_scale)key = cv2.waitKey(1)# Press esc or 'q' to close the image windowif key & 0xFF == ord('q') or key == 27:cv2.destroyAllWindows()breakfinally:# Stop streamingpipeline.stop()

插上相机(或者把录好的bag放到同一目录下),修改USE_ROS_BAG和ALIGN_WAY,然后运行这个代码,就可以看到相机拍摄的图像啦。


注意:

1.函数Align_version和Unalign_version分别读取相机或bag的图像,前者还进行深度图与RGB图像的对齐。具体是谁对齐到谁,由变量ALIGN_WAY控制。

2.depth_scale是比例系数,用于在深度图像中直接取值以后,乘以这个系数,得到现实里实际的深度值。(即相机坐标系下的z值。)

这点很多用过深度相机的人也答不上来。即:深度相机采集到的深度,是场景点距离相机坐标系平面的深度,还是距离相机光心的距离?

换句话说,拿深度相机对准一面墙拍摄,现实里这面墙上的每个点距离相机的距离并不同(最近的是相机正前方,最远的是四个墙角)。而根据拍摄得到的深度图,这面墙上各个点进行深度取值,值是否相同?

这里揭晓答案:实验过的人才知道是相同的,相机内部已经进行过换算了。也就是说深度图中记录的深度并不是距离相机的直线距离,而是距离相机平面的垂直深度。

3.直接用相机拍,可以看到左右双目拍摄的结构光点的图像,用bag录好的是不行的。

4.show_pic是用于是否显示图片的变量,两个函数返回的三个变量,分别是彩色图像,深度图像,以及上色以后的深度图像(近处偏冷,远处偏暖)

5.样例图如下:

将深度图对齐到RGB:

上面是没有对齐的版本,可以看出RGB和depth中的手不在同一位置,大小也不同;

下面是对齐后的版本,可以看出RGB和depth中的手的位置已经对齐。

将RGB对齐到深度图:

上面是没有对齐的版本,可以看出RGB和depth中手不在同一位置,大小也不同;

而下面是对齐后的版本,可以看出RGB已经被对齐到了深度图,其中没有深度值的地方也就不再显示RGB值。(从这个里我们可以看出RGB相机和Depth相机的感受视野是不一样的。

5.我们以上图的手的图像为例,发现深度图的手部存在重影。

(其实不是重影,从下面RGB对齐到的地方可以看出,这个地方没有采集到深度。)

为什么会这样?这不是相机坏了或者是代码有问题。这个叫“残影”。

官方的解答是:用立体视觉生成的深度数据将左成像器用作立体匹配的参考,从而在左成像器和右成像器的视场中形成一个非重叠区域,在该区域中,帧的左边缘将没有深度数据。与距离较远的场景相比,较近的场景会导致更宽的无效深度范围。

这点可以参考博客:

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

ROS版本

如果你准备用在机器人上,可以使用ros驱动。

以下内容默认你掌握ros的基本使用,否则通过上面的方法尝试去解决。

ros的安装我这里不介绍,自行搜索ros安装教程,以20.04ubuntu系统的noetic为例。

装好ros以后,安装realsense的ros驱动:

sudo apt-get install ros-noetic-realsense2-camera
sudo apt-get install ros-noetic-realsense2-description

装好以后,到/opt/ros/noetic/share/realsense2_camera/launch 这个路径下,可以看看这个相机驱动自带哪些launch文件。

我这里提供一个luanch文件供启动:

<launch><arg name="serial_no"           default=""/><arg name="json_file_path"      default=""/><arg name="camera"              default="camera"/><arg name="tf_prefix"           default="$(arg camera)"/><arg name="fisheye_width"       default="640"/><arg name="fisheye_height"      default="480"/><arg name="enable_fisheye"      default="true"/><arg name="depth_width"         default="640"/><arg name="depth_height"        default="480"/><arg name="enable_depth"        default="true"/><arg name="infra_width"         default="640"/><arg name="infra_height"        default="480"/><arg name="enable_infra1"       default="true"/><arg name="enable_infra2"       default="true"/><arg name="color_width"         default="640"/><arg name="color_height"        default="480"/><arg name="enable_color"        default="true"/><arg name="fisheye_fps"         default="30"/><arg name="depth_fps"           default="30"/><arg name="infra_fps"           default="30"/><arg name="color_fps"           default="30"/><arg name="gyro_fps"            default="400"/><arg name="accel_fps"           default="250"/><arg name="enable_gyro"         default="true"/><arg name="enable_accel"        default="true"/><arg name="enable_pointcloud"   default="true"/><arg name="enable_sync"         default="true"/><arg name="align_depth"         default="true"/><arg name="filters"             default=""/><group ns="$(arg camera)"><include file="$(find realsense2_camera)/launch/includes/nodelet.launch.xml"><arg name="tf_prefix"                value="$(arg tf_prefix)"/><arg name="serial_no"                value="$(arg serial_no)"/><arg name="json_file_path"           value="$(arg json_file_path)"/><arg name="enable_pointcloud"        value="$(arg enable_pointcloud)"/><arg name="enable_sync"              value="$(arg enable_sync)"/><arg name="align_depth"              value="$(arg align_depth)"/><arg name="fisheye_width"            value="$(arg fisheye_width)"/><arg name="fisheye_height"           value="$(arg fisheye_height)"/><arg name="enable_fisheye"           value="$(arg enable_fisheye)"/><arg name="depth_width"              value="$(arg depth_width)"/><arg name="depth_height"             value="$(arg depth_height)"/><arg name="enable_depth"             value="$(arg enable_depth)"/><arg name="color_width"              value="$(arg color_width)"/><arg name="color_height"             value="$(arg color_height)"/><arg name="enable_color"             value="$(arg enable_color)"/><arg name="infra_width"              value="$(arg infra_width)"/><arg name="infra_height"             value="$(arg infra_height)"/><arg name="enable_infra1"            value="$(arg enable_infra1)"/><arg name="enable_infra2"            value="$(arg enable_infra2)"/><arg name="fisheye_fps"              value="$(arg fisheye_fps)"/><arg name="depth_fps"                value="$(arg depth_fps)"/><arg name="infra_fps"                value="$(arg infra_fps)"/><arg name="color_fps"                value="$(arg color_fps)"/><arg name="gyro_fps"                 value="$(arg gyro_fps)"/><arg name="accel_fps"                value="$(arg accel_fps)"/><arg name="enable_gyro"              value="$(arg enable_gyro)"/><arg name="enable_accel"             value="$(arg enable_accel)"/><arg name="filters"                  value="$(arg filters)"/></include></group>
</launch>

可以看到其中

  <arg name="enable_pointcloud"   default="true"/><arg name="enable_sync"         default="true"/><arg name="align_depth"         default="true"/>

这三句比较重要,enable_pointcloud 表示 会发布一个"camera_color_optical_frame"坐标系下的点云, align_depth 会对齐深度图和rgb图像。

其中,/camera/color/image_raw 话题是 RGB图像,/camera/aligned_depth_to_color/image_raw是对齐到RGB图像的depth图像。使用时只要监听这两个图像的话题即可,并且深度部分的单位是毫米。

Realsense相机在linux下的配置使用,RGB与depth图像对齐相关推荐

  1. linux下mysql的配置,Linux下Mysql配置()

    摘要 腾兴网为您分享:Linux下Mysql配置(),智慧医疗,小太阳,享家,相机美颜等软件知识,以及重庆地税12366,正常的小学上课时间表,移动云信,dnf幸运冒险家,八爪龙演播大师,几米入早教, ...

  2. linux下SVN配置笔记(转)

    linux下SVN配置笔记  李群林 转载了 皋军 的博文  [查看原文][转载时间:2012-09-20 10:40] 关键字: linux下svn配置笔记  一.安装SVN默认安装到/usr/lo ...

  3. Linux下VNC配置多个桌面和修改密码 不会当系统重启vnc失效

    1:vncserver 2:iptables -I INPUT -p tcp --dport 5901 -j ACCEPT   客户端方式 3:iptables -I INPUT -p tcp --d ...

  4. linux下dhcp配置(一)

    LINUX下DHCP配置(一) 挂载 mkdir –p /mnt/cdrom mount /dev/cdrom /mnt/cdrom cd /mnt/cdrom/Server ll dhcp* 安装 ...

  5. Linux 下安装配置C/C++开发环境 Code::Blocks

    Linux 下安装配置C开发环境Code::Blocks 一.提前的话 要说C语言和Linux的关系大家应该都不会陌生,Linux系统内核就是用C语言开发的,所以所有的Linux系统下面 都会有C的编 ...

  6. linux下安装配置redis服务

    2019独角兽企业重金招聘Python工程师标准>>> linux下安装配置redis服务 2016年03月25日 15:39:31 coding_everyday 阅读数:3530 ...

  7. (转)yi_meng linux 下 ifcfg-eth0 配置 以及ifconfig、ifup、ifdown区别

    linux 下 ifcfg-eth0 配置 以及ifconfig.ifup.ifdown区别 原文:https://www.cnblogs.com/yi-meng/p/3214471.html 这3个 ...

  8. linux服务配置大全 fedora 8 ftp 百度文库,Linux下VSFTP配置全攻略

    Linux下VSFTP配置全攻略 [日期:2007-10-05] 来源:Linux公社 作者:Linuxidc [字体:大 中 小] 4]如果要以系统中存在的普通用户登入FTP,也没有什么可以设置的, ...

  9. Linux下安装配置vsftpd

    Linux下安装配置vsftpd 安装vsftpd服务器 yum -y install vsftpd 可以使用rpm -qa vsftpd命令确认是否安装好vsftpd服务器. vsftpd.conf ...

最新文章

  1. 计算机应用基础形考模版4,计算机应用基础 形考 任务四
  2. AV1挑起的Codec之战
  3. 程序员修神之路--那些分布式事务解决方案
  4. 前端学习(2967):表单验证
  5. c++将文本中的字符串一次读入到内存
  6. 神经网络与深度学习——TensorFlow2.0实战(笔记)(二)(Anaconda软件使用)
  7. 500万用户 表_500万用户的社交电商平台社群分层运营模型「第219期触电夜话」...
  8. VB讲课笔记11:多重窗体与环境应用
  9. android sdk 环境签名,gradle打包APK,并使用jarsigner签名
  10. cognos 10 oracle,Cognos10.2.1安装配置手册.docx
  11. 录屏软件 Apowersoft(傲软录屏)
  12. 保姆级详细介绍Navicat安装会出现的四种问题,详细给出解决办法
  13. Rigify:关于Rigify生成最终绑定时失败的原因及解决办法
  14. 北京h5游戏制作平台有哪些,h5游戏公司实例评测
  15. 服务器临时文件定时清理,定时/开机自动清理Win10临时文件夹的技巧
  16. linux系统设置密钥登录
  17. ubuntu如何用快捷键截图
  18. Spark RDD 极简教程
  19. 做摄像双机位直播(多机位直播)的整个流程的介绍
  20. linux挂载移动硬盘乱码

热门文章

  1. Docker报错:E: Unable to locate package python3
  2. 玩烂vue之vue练手项目
  3. 情人节有哪些礼物可以送给男朋友的,情人节送礼推荐
  4. 山茶油的功效与食用方法
  5. 《惢客创业日记》2020.11.25-27(周三)为什么是我?
  6. 昨天申请了三丰云免费云服务器,体验不错
  7. 【Adobe】将AI内容导出并转化为AE矢量形状
  8. react 命名规范 书写顺序
  9. Java微信公众平台开发_03_消息管理之被动回复消息
  10. BT06串口蓝牙模块的配置以及与电脑的配对