使用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
大功告成!