使用Kinect V2制作自己的图片数据集并跑通ORB_SLAM2
一、使用Kinect V2采集图片数据集
参考博客:https://blog.csdn.net/sunbibei/article/details/51594824
出发点是使用Kinect V2制作一个自己的图片数据集,以用于后续的算法验证及使用。
转自原博文中,保存图片序列一节。
1、首先, 复制vewer.cpp文件, 命名为save_seq.cpp. 修改save_seq.cpp文件。
我的文件路径为:/home/chen/catkin_ws/src/iai_kinect2/kinect2_viewer/src
这里要注意,我们是要在ROS 的工作空间下进行操作而不是在kinect的空间下进行操作,所以这里的母文件夹为catkin_ws而不是iai_catkin_ws.
2、在Receiver类中bool save变量下面添加一个新的成员变量, bool save_seq.
在类的构造函数的初始化列表中新增该变量的初始化save_seq(false).
3、定位到void imageViewer()函数, 修改对应的switch(key & 0xFF)块如下:
int key = cv::waitKey(1);
switch(key & 0xFF)
{
case 27:
case 'q':
running = false;
break;
case 'b': save_seq = true; save = true;break;
case 'e': save_seq = false; save = false;break;
case ' ':
case 's':
if (save_seq) break;
if(mode == IMAGE)
{
createCloud(depth, color, cloud);
saveCloudAndImages(cloud, color,depth, depthDisp);
}
else
{
save = true;
}
break;
}
if (save_seq) {
createCloud(depth, color, cloud);
saveCloudAndImages(cloud, color,depth, depthDisp);
}
}
4、定位到void cloudViewer()函数, 修改对应的if(save)块如下:
if(save || save_seq)
{
save = false;
cv::Mat depthDisp;
dispDepth(depth, depthDisp, 12000.0f);
saveCloudAndImages(cloud, color, depth, depthDisp);
}
5、定位到void keyboardEvent(const pcl::visualization::KeyboardEvent
&event, void *)函数, 修改源码如下:
if(event.keyUp())
{
switch(event.getKeyCode())
{
case 27:
case 'q':
running = false;
break;
case ' ':
case 's':
save = true;
break;
case 'b':
save_seq = true;
break;
case 'e':
save_seq = false;
break;
}
}
6、关键的一步。在CMakeList.txt的最后, 添加如下指令:
add_executable(save_seq src/save_seq.cpp)
target_link_libraries(save_seq
${catkin_LIBRARIES}
${OpenCV_LIBRARIES}
${PCL_LIBRARIES}
${kinect2_bridge_LIBRARIES}
)
7、因为我是制作类似TUM标准集的数据集,所以我这里只需要采集rgb以及depth图片,于是我将其他两种图片注释掉。
//const std::string cloudName = baseName +".pcd";
//const std::string depthColoredName =baseName + "_depth_colored.png";
//OUT_INFO("saving cloud: "<< cloudName);
//writer.writeBinary(cloudName, *cloud);
//OUT_INFO("saving depth: "<< depthColoredName);
//cv::imwrite(depthColoredName, depthColored, params);
8、我担心数据集的命名规则无法识别,于是我将原有的_color、_depth名称前缀给删掉。
即:
const std::string colorName =baseName + ".jpg";
const std::string depthName = baseName + ".png";
(jpg后缀无所谓,也可更改为png)
9、删掉catkin_ws文件夹下build文件夹。
执行指令:
cd catkin_ws
catkin_make
source devel/setup.bash
10、在catkin_ws文件夹下新建文件夹dataset,用于存放图片,要不然太乱了。
执行指令:
roslaunch kinect2_bridge kinect2_bridge.launch
打开新的终端:
cd catkin_ws/dataset
rosrun kinect2_viewer save_seq hd image
选中弹出的窗口,按键B开始,按键E结束。
到这里,图片便已经采集完成了。
二、使用自己的数据集跑通ORB_SLAM2
参考博客:https://blog.csdn.net/oliongs/article/details/79696341
采集完图片,我们还不能直接用,因为缺少类似标准集中的rgb.txt以及depth.txt索引文件。
1、我们需要新建这两个文件,并根据标准集的格式进行修改,这里可以借助excel以及文本编辑的替换工具进行操作。因为之前我们保存的图片的名称是一个按照0000-xxxx的递增的格式,使用excel拉一下就可以了。
2、将我们的数据集dataset文件夹放置到之前跑标准集的ORB_SLAM2下的data文件夹下面。
3、将之前的associate.py放到Examples/RGB-D/目录下面。
4、打开终端,进入到associate.py所在目录,即/ORB_SLAM2/Examples/RGB-D/,之后运行 python associate.py ../../data/dataset/rgb.txt ../../data/dataset/depth.txt > associations.txt
之后在该目录中将会生成一个associations.txt文件.
5、在ORB_SLAM2 主目录下运行
./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM2.yaml data/dataset Examples/RGB-D/associations.txt
大功告成!