Opencv中的imread无法工作

35

我想使用OpenCV2.2中的imread函数。

我的代码非常简单。

cv::Mat host= imread("1.bmp", CV_LOAD_IMAGE_GRAYSCALE);

之后,主矩阵被填充了零指针,即图像未加载。

如果我使用cvLoadImage函数,则一切正常。

文件存在,而且我没有混合使用发布和调试库。为什么imread函数不起作用?


7
@asandwhich,是的,“为什么imread无法工作?”这不是一个问题吗?可能不是最好的寻求帮助的方式,但它仍然是一个问题。人们应该尝试真正地去帮助别人,而不只是冷嘲热讽。我知道我们很多人没有正确描述和提问问题,但如果你不打算帮忙,请不要浪费时间进行嘲讽。 - BRabbit27
抱歉回答原问题。 “为什么imread不起作用?”最初并不在问题中。我向提问者指出了这一点。但是,嘿,我想我需要停止这样做。 - a sandwhich
15个回答

26

12

我也遇到了2.4.6版本的相同问题。原因是在选择库时,我选择了调试版本和发布版本。当我只选择了库的调试版本时,一切正常。


9
我可以确认,OpenCV 2.2中的imread存在一些问题。然而,这些问题只发生在Windows 32位系统上。在linux和mac上它是正常工作的。我不知道为什么它不能工作,但我们有一个小的解决方法。
我们使用以下宏来解决这个问题,也许你可以尝试一下,并从此使用"ourImread"。
#ifdef WIN32
#define ourImread(filename, isColor) cvLoadImage(filename.c_str(), isColor)
#else
#define ourImread(filename, isColor) imread(filename, isColor)
#endif

1
实际上,这个错误在OpenCV 2.4.2 win32版本中仍然存在。 - vinjn
我也遇到了OpenCV 2.4.7,win32的这个问题。在Visual Studio 2012中运行会触发该错误。有时在控制台上以发布模式运行可以解决问题。 - franckysnow
2
混合使用发布和调试模式是问题的原因。请参见https://dev59.com/KGox5IYBdhLWcg3wklCE。 - Aerospace

6

我也遇到了同样的问题。

cv::Mat image= cv::imread("immagine12.jpg");   // Read the file

if(! image.data )                              // Check for invalid input
{
    cout <<  "Could not open or find the image" << std::endl ;
    cv::waitKey(5000);
    return -1;
}

cv::namedWindow( "Display window", CV_WINDOW_AUTOSIZE );// Create a window for display.
imshow( "Display window", image );  

//non so perchè ma senza il waitKey e lasciando solo il system pause non carica l'immagine...
cv::waitKey(5000);


system("pause");

但是当我插入cv::waitKey(5000);时,问题得到了解决。
我不知道为什么,在使用system pause时无法加载图像,而且在加载完图像后会暂停!


1
混合使用发布模式和调试模式是问题的原因。请参见https://dev59.com/KGox5IYBdhLWcg3wklCE。 - Aerospace

3

我在Linux上遇到了类似的问题,只有在读取32位tiff图像时才会出现。

Mat mat= imread(filename, CV_LOAD_IMAGE_ANYDEPTH);

问题是因为出于某种原因,OpenCV没有构建Tiff支持。

3

我终于解决了Opencv4.3在Windows10 x64和Visual Studio 2019上的问题!!!

好的,现在当你遇到这个问题时,你可以尝试以下方法:

  1. 检查你的设置,确保在“项目->属性->链接器->输入”中不要混合包含.lib文件的Release/Debug版本,opencv_xxx430d.lib(注意有d)是用于Debug,而opencv_xxx430.lib(没有d)是用于Release,并且平台是x64
  2. C/C++->常规中,你需要设置附加包含目录X:/(opencv_build/install)/includeX:/(opencv_build/install)/include/opencv2,分别用于Release/Debug。
  3. 也许你应该#include <opencv2/imgcodecs.hpp>
  4. 最后,Unicode问题,这也是我的问题,图像文件路径中的Unicode符号,该死!我不知道为什么,因为我的代码很正常:string path = "D:/kk.jpg注意,它是/而不是\,但是你可以尝试调试你的代码,也许你会发现有些像path = "?D:/kk.jpg"的东西,该死!所以不要直接复制/粘贴你的图像路径,即使你已经使用了绝对路径,你仍然可能遇到Unicode问题,所以你需要做的是删除代码行(string path = "D:/kk.jpg),然后逐个重新输入每个字符!如果你幸运的话,你会看到用imshow显示的图像。祝你好运。

1
对我来说起作用了。非常感谢你提供的解决方案和恰当的解释。 - Nikunj Gaur
1
对我来说起作用了。非常感谢你的解决方案和恰当的解释。 - undefined

1
我知道现在有点晚了,但是有人可能会发现这很有帮助。当我使用OpenCV-3.0时,使用imread时遇到了同样的问题。我尝试了所有的解决方案,但实际上我没有添加库opencv2/imgcodecs.hpp。虽然imshow没有问题,但是在添加了这个库之后,我能够成功读取图片。

1

如果您认为这是OpenCV的错误,请将您的图像和重现指令发布到OpenCV bugtracker


0
  1. 请查看相关问题这里

  2. 请确保您的路径正确,

  3. 根据Opencv的API,我会尝试调用以下内容:

arrayMat[i]=imread("1.jpg" , 1 );

imread的参数:

Mat imread(const string& filename, int flags=1)
Loads an image from a file.

Parameters: 
 filename – Name of file to be loaded.
 flags – Specifies color type of the loaded image:
   >0 the loaded image is forced to be a 3-channel color image
   =0 the loaded image is forced to be grayscale
   <0 the loaded image will be loaded as-is (note that in the current implementation the alpha channel, if any, is stripped from the output image, e.g. 4-channel RGBA image will be loaded as RGB if  ). 

祝你好运


0

另一种可能性:

如果您使用的是OS X并且静态链接OpenCV,请确保使用OpenCV捆绑的libjpeg,而不是系统的libjpeg。

我在使用OpenCV 3.0时遇到了类似的问题,除了cvLoadImage也无法正常工作。因此,这可能并没有真正回答您的问题,但或许可以帮助其他人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接