我编写了以下代码,以使用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)

我实际上忘记了在前面的代码中添加“imgName = ent-> d_name”行。抱歉我已经更新了代码

最佳答案

这是失败的,因为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接口(interface),尤其是cvLoadImage

关于c++ - 使用imread读取目录中的所有图像文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24588358/

10-13 05:41