C++ 使用imread读取目录中的所有图像文件
我编写了以下代码,使用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
#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;
}
}