使用imread读取目录中的所有图像文件

时间:2014-07-05 16:24:26

标签: c++ opencv

我编写了以下代码,使用imread读取目录中的所有图像文件。但是代码无效并且出错。

#include<iostream>
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <opencv2/core/core.hpp>
#include<dirent.h>
#include<string.h>
using namespace std;
using namespace cv;
int main(){
    string dirName = "/home/Dataset/newImage";
    DIR *dir;
    dir = opendir(dirName.c_str());
    string imgName;
    struct dirent *ent;
    if (dir != NULL) {
        while ((ent = readdir (dir)) != NULL) {
             imgName= ent->d_name;
            Mat img = imread(imgName);
            cvtColor(img,img,CV_BGR2GRAY);
        }
        closedir (dir);
    } else {
        cout<<"not present"<<endl;
    }
}

错误:

    OOpenCV Error: Assertion failed (scn == 3 || scn == 4) in cvtColor, file /build/buildd/opencv-2.3.1/modules/imgproc/src/color.cpp, line 2834
terminate called after throwing an instance of 'cv::Exception'
  what():  /build/buildd/opencv-2.3.1/modules/imgproc/src/color.cpp:2834: error: (-215) scn == 3 || scn == 4 in function cvtColor

Aborted (core dumped)

我实际上忘了添加行&#34; imgName = ent-&gt; d_name&#34;在以前的代码中。对不起。我已经更新了代码

3 个答案:

答案 0 :(得分:4)

这是失败的,因为imread只获取文件名,而不是完整路径。请参阅此SO question

    while ((ent = readdir (dir)) != NULL) {
         imgName= ent->d_name;
        Mat img = imread(imgName);
        cvtColor(img,img,CV_BGR2GRAY);
    }

应该像

    while ((ent = readdir (dir)) != NULL) {
        string imgPath(dirName + ent->d_name);
        Mat img = imread(imgPath);
        cvtColor(img,img,CV_BGR2GRAY);
    }

我不熟悉dirent,因为我更喜欢boost :: filesystem这种东西。顺便说一下,我打赌一些“printf调试”在这里会有所帮助,看一下导致失败的“imread”参数。

修改

看起来OpenCV的imread有一些已知问题,具体取决于程序的构建方式。您的系统是Windows还是其他什么?

有关详细信息,请参阅以下链接:

imread not working in Opencv

OpenCV imread(filename) fails in debug mode when using release libraries

要解决此问题,您可以尝试使用C界面,特别是cvLoadImage

答案 1 :(得分:3)

我用你的代码做了这个...也许它可以帮助你(对不起,这是我的第一个答案,我不知道如何使代码看起来不错)

 #include<iostream>
 #include "opencv2/imgproc/imgproc.hpp"
 #include "opencv2/highgui/highgui.hpp"
 #include <opencv2/core/core.hpp>
 #include<dirent.h>
 #include<string.h>

 using namespace std;
 using namespace cv;

 int main()
 {
     string dirName = "/home/diego/Pictures/";
     DIR *dir;
     dir = opendir(dirName.c_str());
     string imgName;
     struct dirent *ent;
     if (dir != NULL) {
     while ((ent = readdir (dir)) != NULL) {
           imgName= ent->d_name;
           //I found some . and .. files here so I reject them.
           if(imgName.compare(".")!= 0 && imgName.compare("..")!= 0)
           {
             string aux;
             aux.append(dirName);
             aux.append(imgName);
             cout << aux << endl;
             Mat image= imread(aux);
             imshow(aux,image);
             waitKey(0);
           }
      }
      closedir (dir);
  } else {
      cout<<"not present"<<endl;
     }
 }

答案 2 :(得分:0)

只需添加此行,并确保imread成功。

Mat img = imread(imgName);
if(img.empty()){
std::cout<<"Cannot load "<<imgName<<endl;
return -1;
}

在上面的代码中你得到这样一个错误,因为你试图将空Mat转换为灰度,这将抛出这样的异常,所以总是确保在imread之后Mat不为空。< / p>