1. 程式人生 > >使用Kinect V2製作自己的圖片資料集並跑通ORB_SLAM2

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

大功告成!