我编写了以下代码,使用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;在以前的代码中。对不起。我已经更新了代码
答案 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还是其他什么?
有关详细信息,请参阅以下链接:
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>