如何导航文件夹以读取图像

How to navigate a folder to read images?

本文关键字:文件夹 读取 图像 导航 何导航      更新时间:2023-10-16

我正在尝试在我的图片中采样一些感兴趣的区域。所以基本上每 30 像素的 ill 都会获得 30x30 的投资回报率,然后尝试获得大量样本图片。我试图搜索相同的问题,但我使用视频捕获得到了答案,但它们不起作用。我只想知道如何导航目录并选择那里的每个图像,应用我的方法对图像进行采样。然而,我的新手C++技能已经达到了极限。我的代码如下:

这是我想应用于我位于本身"C:\Projects\DataSet"的目录中的每个图像的方法

  ********fileName definition (part of ROI class)***********************

  string ROI::fileName(size_t frameNumber)
   {
   const string filePrefix("C:\Projects\dataset-checkerboard\Checkerboard\");
   const string fileSuffix(".png");
   const size_t fileNumDigits(10);
   stringstream ss;
   ss << filePrefix;
   ss << setw(fileNumDigits) << setfill('0') << frameNumber;
   ss << fileSuffix;
   return ss.str();
   ************sampleROI definition***************
Mat ROI::sampleROI(cv::Mat img,  int width, int length){
cv::Mat sampled;
int limitx = img.cols - length;
int limity = img.rows - width;

for(int x = 0; x < limitx ; x += length){
    for(int y = 0; y < limity  ; y += width){

    sampled = img(Rect(cv::Point(x,y),cv::Size(width,length)));
         stringstream file;
         file << "C:\Projects\dataset-checkerboard\Samples\img" << i << " atPixel " << Point(x,y) << ".png";
         cv::imwrite(file.str(), sampled);
    }

    }

    return sampled;
   }

   *****************************Main*******************************
   ROI sampling ;
         int main( int argc, char** argv )
            {
                int m = 0;
                size_t t = 166;
                for(size_t i = 4; i < t; ++i) { //0000000004.png is my first image
                Mat i_t = imread(sampling.fileName(i), CV_LOAD_IMAGE_GRAYSCALE);
                sampling.sampleROI(i_t,30,30, i); //samples 30x30 image
                cout << "finished processing image: " << sampling.fileName(i) << endl;
       }
    return 0;
    }

对于单张图片,它工作得很好,上面的代码只是为了让您了解我想对图像中的图片做什么。

想要一种方法来帮助我在那里导航每个图像,它们都按 0000000###.png 的顺序命名,图像计数为 166。使用视频捕获不起作用。

编辑:main方法中的for循环似乎没有重复。

谢谢

我刚刚为这样的项目解决了类似的问题:

#include <sstream>
#include <string>
#include <iomanip>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using std::string;
using std::stringstream;
using std::setfill;
using std::setw;
using cv::imread;
using cv::Mat;
string fileName(size_t frameNumber)
{
  const string filePrefix("office/input/in");
  const string fileSuffix(".jpg");
  const size_t fileNumDigits(6);
  stringstream ss;
  ss << filePrefix;
  ss << setw(fileNumDigits) << setfill('0') << frameNumber;
  ss << fileSuffix;
  return ss.str();
}
...
int main(int argc, const char* argv[])
{
  // initial work, set t to last image number + 1
  // i could start at 0 if your first image is 0
  for(size_t i = 1; i < t; ++i) {
    Mat i_t = imread(fileName(i), CV_LOAD_IMAGE_GRAYSCALE);
    // Do work
  }
  return 0;
}

所以我不完全理解这个问题,但这是我的破解。基本思想只是forlooping遍历所有图像并用它们做你想做的事。

#include <iostream>
#include <sstream>

std::string path = "path/to/image/folder/";
std::stringstream ss;
std::string num = "";
for(int i = 0; i < 166; i++){
    ss << i;
    num = ss.str();
    if(num.length() == 1) num = "00" + num;
    if(num.length() == 2) num = '0' + num;
    cv::Mat img = cv::imread((path+num+".png").c_str(), 1);
    cv::Mat result = sampleROI(img,  1024, 1024);
    // do something
    ss.str("");
    ss.clear();
}