imread在Opencv中不起作用

时间:2011-09-14 14:03:32

标签: c++ opencv

我正在尝试使用OpenCV2.2中的imread函数。

我的代码很简单。

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

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

如果我使用cvLoadImage,那么一切正常。

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

16 个答案:

答案 0 :(得分:21)

使用opencv 2.4.8转载。

如果您在Debug中运行,请检查您是否也在使用调试库,这解决了我们的问题。 :OpenCV imread(filename) fails in debug mode when using release libraries

答案 1 :(得分: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

答案 2 :(得分:8)

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

答案 3 :(得分: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它无法加载图像,并在加载图像后暂停;

答案 4 :(得分:1)

如果您认为这是OpenCV错误,请将您的图片和说明发布到OpenCV bugtracker

答案 5 :(得分:1)

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

答案 6 :(得分:1)

我在Linux上遇到类似的问题,只读取32位tiff图像。

Mat mat= imread(filename, CV_LOAD_IMAGE_ANYDEPTH);

问题是因为OpenCV由于某种原因没有使用Tiff支持构建。

答案 7 :(得分:1)

Opencv4.3 Windows10 x64 Visual Studio 2019我终于解决了该死的问题!

在总结所有可能的解决方案之前,我只想说一句,他妈的Windows!好的,现在,当您遇到问题时,可以尝试:

  1. 检查您的设置,确保在发行版/调试的“项目->属性->链接器->输入”中不要混用.lib文件,其中opencv_xxx430d.lib(请注意d )用于Debug,opencv_xxx430.lib(无d)用于Release,平台为x64
  2. C/C++->General中,您需要分别设置Additional include directoryX:/(opencv_build/install)/include的{​​{1}}进行发布/调试。
  3. 也许您应该X:/(opencv_build/install)/include/opencv2
  4. 最后是Unicode问题,这也是我的问题,图像文件路径中的unicode符号,该死!我不知道为什么,因为我的代码非常普通#include <opencv2/imgcodecs.hpp>请注意,它是string path = "D:/kk.jpg而不是/,但是您可以尝试调试代码,也许您会发现类似\的东西,该死!因此,即使您已经使用了绝对路径,也不要直接复制/粘贴图像路径,仍然可以解决unicode问题,因此,您需要做的是删除代码行(path = "?D:/kk.jpg") ,然后重新输入每个字符!如果幸运的话,您将看到带有imshow的图像。祝你好运。

答案 8 :(得分:0)

  1. 查看相关问题here

  2. 请确保您的路径正确无误

  3. 根据Opencv的API,我试试这个电话:

  4. 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  ). 
    
    祝你好运 S

答案 9 :(得分:0)

我有同样的问题。我解决了关键是文件名是否有jpg。 如果文件名为p1,则应使用此类imread("p1.jpg")。但我们经常将文件名设置为p1.jpg,在这里我们应该使用类似imread("p1.jpg.jpg")的内容。

答案 10 :(得分:0)

这也发生在我身上,我的简单解决方案是使用C API然后转换为Mat

IplImage* img = cvLoadImage("c://frame_201.bmp");
Mat mat = Mat(img);

答案 11 :(得分:0)

反过来也是如此:如果你正在构建Release并且你有Debug库,那么imread()会安静地失败(在imread()之后errno为0,但是没有填充图像对象。)

答案 12 :(得分:0)

另一种可能性:

如果您使用OS X并静态链接OpenCV,请务必使用与OpenCV捆绑在一起的libjpeg,而不是系统的。

我遇到与OpenCV 3.0类似的问题,但cvLoadImage不能正常工作。所以,这可能不会真正回答你的问题,但也许它会帮助其他人。

答案 13 :(得分:-1)

我也有同样的问题,即imread不起作用,cvLoadImage确实有效。

我决定从头开始创建一个新的Visual Studio,现在它可以工作。

在win32下,OpenCV 2.4.3中的imread没有普遍问题。

答案 14 :(得分:-1)

我遇到了同样的问题

cvLoadImage

是较旧的c风格

imread

是c ++风格但是当你使用调试库时工作正常。但是很慢,当使用发布库时它不会起作用,因为opencv c ++接口有很多bug。所以你必须使用调试库然后imread工作正常

答案 15 :(得分:-2)

我知道你想用“imread”&amp; “CV_LOAD_IMAGE_GRAYSCALE”并自动转换。 但另一种方法是加载一张图片并转换为灰度:

define CV_NO_BACKWARD_COMPATIBILITY

#include <cv.h>
#include <highgui.h>
#include <math.h>

int main(){

/* load the image */
IplImage* img  = cvLoadImage("yourPicture.bmp");  //jpg - bmp

/* retrieve properties */
int width     = img->width;
int height    = img->height;
int nchannels = img->nChannels;
int step      = img->widthStep;

IplImage* img2 = cvCreateImage(cvSize(img->height, img->width),IPL_DEPTH_8U,1);

/* setup the pointer to access image data */
uchar *data = ( uchar* )img->imageData;    
uchar *data2= ( uchar* )img2->imageData;

/* convert to grayscale manually */
int i, j, r, g, b, byte;
for( i = 0 ; i < height ; i++ ) {
    for( j = 0 ; j < width ; j++ ) {
        r = data[i*step + j*nchannels + 0];
        g = data[i*step + j*nchannels + 1];
        b = data[i*step + j*nchannels + 2];

        byte = ( r + g + b ) / 3;

    int v0=0, v1=0, v2=0;

    data2[i*(img2->widthStep)+j*(img2->nChannels)+0] = byte;
data2[i*(img2->widthStep)+j*(img2->nChannels)+1] = byte;
data2[i*(img2->widthStep)+j*(img2->nChannels)+2] = byte;
}
}

cvNamedWindow("ImagenColor", 1);
cvShowImage("ImagenColor", img);

cvNamedWindow("Gray", 1);
cvShowImage("Gray", img2);
}