如何使用openCV中的循环按顺序访问图像

时间:2014-07-22 09:17:41

标签: c++ visual-studio-2010 opencv

我遇到了有关按顺序访问图像的问题。我的图像的名称随递增的数字而变化,即cube_0.jpg,cube_1.jpg,....等等。现在我想逐个访问每个图像并显示。 以下是我在2天内玩的代码,并且不知道如何处理这种情况或者这个问题出了什么问题。

ostringstream s;

for (int fileNumber = 0; fileNumber<=40; fileNumber++)
        {
            s<<"\"cube_"<<fileNumber<<"\.jpg\""<<endl;  

            string fullfileName(s.str());
            images[i] = fullfileName;

        }


        stringstream ss;
        cout<<"file name"<<images[0]<<endl;

        for (int file = 0; file<41; file++)
        {

            string str = images[file];
            cout<<"str "<<str<<endl;
            img_raw = imread(ss.str(), 1); // load as color image           Error
            cout<<"Done"<<endl<<"size"<<img_raw.size();
            system("pause"); 

        }

此代码运行正常,直到达到&#34; img_raw = imread(ss.str())&#34;,现在这行基本上阻碍了我访问文件。由于imread需要&#34; string&amp;文件名&#34;因此我执行了字符串流操作,但没有任何工作!

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

有一些错误。

您的stringstream ss为空。你宣布它但没有填写任何值。我很确定您的意思是imread(str, 1);而不是imread(ss.str(), 1);

在第一个 for 循环中,你不断地将文件名打印到ostringstream,所以它是这样的:

  

0:“cube_0.jpg \”

     

1:“cube_0.jpg \”“cube_1.jpg \”

     

2:“cube_0.jpg \”“cube_1.jpg \”“cube_2.jpg \”

     

...

所以ostringstream只是增长和增长。需要在循环中声明ostringstream以便在每次迭代时清除它。

已编辑的代码:

string images[41];
Mat img_raw;

for (int fileNumber = 0; fileNumber < 41; fileNumber++)
{
    stringstream ss;
    ss << "\cube_" << fileNumber << "\.jpg" << endl;  

    string fullfileName;
    ss >> fullfileName;
    images[fileNumber] = fullfileName;
}

for (int file = 0; file < 41; file++)
{
    cout << "Loading " << images[file] << endl;
    img_raw = imread(images[file], 1);

    if (!img_raw.empty())
    {
        cout << "Successfully loaded " << images[file] << " with size " << img_raw.size() << endl; 
    } 
    else
    {
        cout << "Error loading file " << images[file] << endl;
    }

    system("pause"); 
}