SLAM數據集序列圖片如何批量處理

  • 2020 年 6 月 19 日
  • 筆記

SLAM數據集序列圖片如何批量處理

原創:SLAM爬坑之行

引言:在SLAM學習過程中,有時候需要對大量的數據集比如TUM/KITTI等圖片序列進行批量處理,這個時候需要用到opencv中的函數對影像進行批量處理的話,會大大減少我們的時間,提高工作效率。

詳細流程:

1、數據集下對大批量圖片文件名的導出

我們採用的是TUM實驗室中的rgbddatasetfreiburg2pioneerslam的RGB影像序列,每當看見這些密密麻麻的數據影像的時候,就會有一種無力感,所以需要批量處理。[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-W9k03k7b-1592542839980)(D:\SLAM\SLAM基礎\文章\rgbseires.png)]

  • 1、使用ls >命令將目錄RGB(根據實際情況進行更改)中的圖片名列舉出來,然後利用>將文 件名重定向到test.txt中(.txt的名字可根據需要自定義),效果入下圖,可以看見rgb中的影像序列已經被保存,終端輸入下列指令後結果如下圖所示

    ls rgb >text.txt

在這裡插入圖片描述

  • 2、利用opencv實現批量影像的處理工作

  #include <iostream>  
 #include<opencv2/opencv.hpp>
 #include<iostream>
 #include<time.h>
 #include<fstream>
 #include<string>
 int main(){    
     //! 指定文件夾路徑
     std::string path = "C:\\Users\\12692\\Source\\Repos\\picture_process\\seires.txt";
     std::ifstream file(path);
     int img_index = 0;
     char img_infile[100], img_savefile[100];
     //!函數file.eof(),如果沒到文件末尾,返回值為0;當讀取兩百個影像時,停止讀取
     while (!file.eof() && img_index < 200) {
         //影像名稱
         char img_name[500];
         //getline()讀取一行,內容存放在img_name[0],讀取的最大位元組數為500
         file.getline(img_name, 500);
         //將字元串img_name標準化列印到img_infile中
         sprintf_s(img_infile, "../rgb/%s", img_name);
         sprintf_s(img_savefile, "../save/tum%03d.png", img_index);
         cv::Mat src = cv::imread(img_infile);
         cv::Mat imgGray;
         //將彩色影像處理成灰度圖
         cvtColor(src, imgGray, CV_BGR2GRAY);
         img_index++;
         //寫入序列圖片
         cv::imwrite(img_savefile, imgGray);
    }
}

下圖是處理後的影像,這樣就可以我們就可以看見原文件rgb中的200張彩色影像被批量處理成灰度圖並且重命名

在這裡插入圖片描述

3、常用舉例按規律讀取並顯示

數據集命名規則如下所示,下列程式將按照序列號名稱順序讀取 在這裡插入圖片描述

#include<opencv2/core/core.hpp>
#include<stdio.h>
#include<stdlib.h>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
#include <fstream>
using namespace std;
using namespace cv;
int main() {
   //先讀取100張圖試試看
   for(int i = 1 ; i < 100; i++) {
       //使用SetFileNames()方法讀取序列影像。
       Mat srcGray;
       char img_name[200];
       sprintf(img_name, "../PATH/TUM%03d.jpg", i);//%05d代表文件名的寬度
       srcGray = imread(imgname, 0);
       cout << i << endl;
       imshow("讀取", srcGray);
       waitKey(122);
  }
   return 0;
}

4、寫入序列圖片

        char path[200];
       sprintf(path, "../save/%d.jpg", i);
       Mat edgeMat;
       imwrite(path, edgeMat);

[參考]://blog.csdn.net/weixin_44723106/article/details/103034846?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.nonecase