使用Kinect V2制作自己的图片数据集并跑通ORB_SLAM2

使用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

大功告成!

猜你喜欢

转载自blog.csdn.net/wang_chaochen/article/details/85244748