Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何导航文件夹以读取图像?_C++_Opencv - Fatal编程技术网

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

C++ 如何导航文件夹以读取图像?,c++,opencv,C++,Opencv,我试图在我的图片中取样一些感兴趣的区域。因此,基本上每30个像素我将采取一个30×30的投资回报率,然后尝试获得大量的样本图片。我试着搜索同一个问题,但我用视频捕捉得到了答案,但没有成功。我只想知道如何导航一个目录并选择每个图像,然后应用我的方法对图像进行采样。然而,我的新手C++技能已经达到了极限。我的代码如下: 这是我希望应用于位于C:\Projects\DataSet目录中的每个图像的方法 ********fileName definition (part of ROI class)*

我试图在我的图片中取样一些感兴趣的区域。因此,基本上每30个像素我将采取一个30×30的投资回报率,然后尝试获得大量的样本图片。我试着搜索同一个问题,但我用视频捕捉得到了答案,但没有成功。我只想知道如何导航一个目录并选择每个图像,然后应用我的方法对图像进行采样。然而,我的新手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。使用视频捕获不起作用

编辑:主方法中的for循环似乎不会重复自身


谢谢

所以我不完全理解这个问题,但这里是我的破解方法。 基本的想法就是循环浏览所有的图片,然后用它们做你想做的事情

#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();
}

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

#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;
}

如果您喜欢答案,请不要忘记单击上下箭头下方的复选标记。您可以发布完整的代码吗?main.cpp中的采样是什么?哦,它只是类ROI的构造函数。我刚刚解决了这个问题,我写的程序只是采集了第一张图像的样本。然后转到第二个图像并重写第一个文件中的所有样本。我在“sampleROI”“sampleROIMat img,int width,int lengh,int I”中添加了另一个参数,并让它与for循环一起迭代。工作很有魅力,但是@a.E.Drew你帮我做到了这一点。我还将迭代添加到文件名中,因此它不再一次又一次地覆盖同一个文件。我会发布更新后的代码谢谢你的回复,我试图实现你的代码,但程序退出时0。所以基本上它跳过了for循环。我猜它不认识那里的文件名。像我的第一张带有0000000004.png的图像一样,我将i设置为4。但是它仍然存在:/n只需要编辑fileNumDigits,使其适合我的图像名称。工作得很有魅力!正在等待我的500000个图像样本在我们讲话时被写入。谢谢事实上我发现它不起作用了。它只对一个图像有效,然后停止。我担心的是它会覆盖我的图像或其他东西。请参阅上面的代码,您可以为每个迭代打印文件名,以验证您是否得到了所需的内容。您还可以在imread之后检查Mat.data是否为非null,以确保您正在获取数据。如果这两件事表明您正在查找和打开正确的文件,那么问题就出在其他地方。