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++ 使用imread读取目录中的所有图像文件_C++_Opencv - Fatal编程技术网

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

C++ 使用imread读取目录中的所有图像文件,c++,opencv,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 names

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

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

只需添加这一行,并确保您的
imread
成功

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

std::cout只需添加这一行,并确保您的
imread
成功

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

std::cout这是失败的,因为imread只获取文件名,而不是完整路径。请参见此

应该是

    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还是其他什么

有关更多信息,请参见以下链接:


要解决此问题,可能您可以尝试使用C接口,尤其是
cvLoadImage

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

应该是

    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还是其他什么

有关更多信息,请参见以下链接:


要解决这个问题,也许您可以尝试使用C接口,尤其是
cvLoadImage

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

#包括
#包括“opencv2/imgproc/imgproc.hpp”
#包括“opencv2/highgui/highgui.hpp”
#包括
#包括
#包括
使用名称空间std;
使用名称空间cv;
int main()
{
字符串dirName=“/home/diego/Pictures/”;
DIR*DIR;
dir=opendir(dirName.c_str());
字符串imgName;
结构导向;
if(dir!=NULL){
while((ent=readdir(dir))!=NULL){
imgName=ent->d_名称;
//我在这里找到了一些.和..文件,所以我拒绝了它们。
if(imgName.compare(“.”)=0和&imgName.compare(“…”)!=0)
{
字符串辅助;
辅助附加(目录名);
辅助附加(imgName);

cout我用你的代码做了这件事……也许它可以帮助你(对不起,这是我的第一个答案,我不知道如何让代码看起来很好)

#包括
#包括“opencv2/imgproc/imgproc.hpp”
#包括“opencv2/highgui/highgui.hpp”
#包括
#包括
#包括
使用名称空间std;
使用名称空间cv;
int main()
{
字符串dirName=“/home/diego/Pictures/”;
DIR*DIR;
dir=opendir(dirName.c_str());
字符串imgName;
结构导向;
if(dir!=NULL){
while((ent=readdir(dir))!=NULL){
imgName=ent->d_名称;
//我在这里找到了一些.和..文件,所以我拒绝了它们。
if(imgName.compare(“.”)=0和&imgName.compare(“…”)!=0)
{
字符串辅助;
辅助附加(目录名);
辅助附加(imgName);

您是否从未将
imgName
设置为此代码中的任何内容。结果是一个无效的文件名(无),这将导致抛出一个
cv::Exception
,而不是由您的代码处理,因此进程终止。您从未将
imgName
设置为此代码中的任何内容。结果是一个无效的文件名(无),这将导致抛出一个
cv::Exception
,而不是由您的代码处理,因此进程终止。我添加了代码,但得到了“无法加载”,即使我在其中添加了imgName。我添加了代码,但得到了“无法加载”,即使我在其中添加了imgName。仍然无法加载图像。在imgPath上使用printf时,我得到了正确的输出-/home/Dataset/NewImage/17003.jpg。但是img.empty()结果为真。仍然无法加载图像。在imgPath上使用printf时,我得到了正确的输出-/home/Dataset/NewImage/17003.jpg。但是img.empty()事实证明这是真的。
 #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;
     }
 }