Как перемещаться по папке для чтения изображений?

0

Я пытаюсь пробовать некоторый регион интересов в моей картине. Таким образом, каждый 30 пикселей плохо принимают ROI 30x30, а затем пытаются получить много образцов. Я попытался найти тот же вопрос, и я получил ответы с помощью VideoCapture, и они не сработали. Я просто хочу знать, как перемещаться по каталогу и выбирать каждое изображение, применяемое к моему методу, чтобы пробовать изображение. Однако мои новички 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. Использование VideoCapture не работает.

EDIT: цикл for в основном методе не повторяется.

благодаря

  • 0
    Не забудьте нажать на галочку под стрелками вверх, если вам нравится ответ
  • 0
    Можете ли вы опубликовать свой полный код? Что такое выборка в main.cpp?
Показать ещё 1 комментарий
Теги:
opencv

2 ответа

0
Лучший ответ

Я просто решил аналогичную проблему для проекта:

#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;
}
  • 0
    Привет, спасибо за ответ, я пытался реализовать твой код, но программа завершает работу с 0. Поэтому в основном она пропускает цикл for. Я предполагаю, что он не распознает имена файлов там. как мое первое изображение с 0000000004.png, я установил свой i на 4. Однако он все еще выходит: /
  • 0
    Просто нужно отредактировать fileNumDigits, чтобы он соответствовал моим именам изображений. Работал как шарм! жду, когда мои 500 000 образцов изображений будут записаны, пока мы говорим. Спасибо
Показать ещё 2 комментария
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();
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню