情景介绍
初学ros和linux,小白之路太艰辛,所以尽量详细记录下一步步的操作,防止自己忘记,也便于查错,大牛看见了也请指点一下。
电脑系统是linux 16.04, 相机是realsense 435i, 用来记录rgbd信息的是ros这个系统
利用ros记录rgbd图像
首先在terminal中输入
roslaunch realsense2_camera rs_camera.launch align_depth:=true
在新的第二个terminal中输入
rosrun rviz rviz
在rviz中设置
fixed frame ->camera_link
add->by topic->sensor_msgs/Image
打开第三个terminal:
rosbag record -O rgb /camera/color/image_raw
视频记录结束后,在terminal1 ,terminal2和terminal3中都输入
Ctrl+c
然后就在项目运行的对应的文件夹中找到了相应的bag文件,在这里命名为‘rgb.bag’
matlab下读取image
文章中的matlab安装在window系统中
用matlab读取bag文件前,调整matlab的目录到bag存在的文件夹,文中rgb.bag存在D:/bagfile中
用matlab读取bag文件
bag = rosbag('rgb.bag');
从bag文件中读取相应的topic,就是在rviz中记录的topic ”sensor_msgs/Image“
rgb_message=select(bag,'MessageType','sensor_msgs/Image');
提取视频
data=readMessages(rgb_message);
从一系列图片中提取单帧图片,这里只取第一幅图
image_n=data{1,1};
如果取第i副图,请用下面的语句
image_n=data{i,1};
image_n并不是图片,而是一个struct,里面报刊了MessageTyoe,Header,Height等等
为了转化为图片 用matlab自带的函数"readImage"
image_chen_show = readImage(image_n);
上图可以看见,用readImage得到的结果是一个480乘以640乘以3的rgb图片
用imshow把图片显示出来
figure;imshow(image_chen_show,[]);
成功提取图片并显示
有不对之处请赐教
附加如何从rosbag文件中提取深度图的matlab代码
要把depth的信息转换成uint16格式的信息
得到的depth图像就是以mm为单位的图片了
可以在真实的世界中做一些事情
close all; clear all; clc
bag_name = 'wood_28.bag';
bag = rosbag(bag_name);
bSel = select(bag, 'Topic', 'camera/aligned_depth_to_color/image_raw');
msgStructs = readMessages(bSel, 'DataFormat', 'struct');
depth_u16 = reshape(typecast(msgStructs{1}.Data, 'uint16'), 640, 480)';
imshow(depth_u16, [])
imwrite(uint16(depth_u16), './example.png')