imread不能在Opencv中工作

imread not working in Opencv

本文关键字:工作 Opencv 不能 imread      更新时间:2023-10-16

我试图使用OpenCV2.2的imread函数。

我的代码很简单。

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

之后,主机矩阵被0指针填充,即图像没有加载。

如果我使用cvLoadImage,那么它都可以正常工作。

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

使用opencv 2.4.8复制。

如果你在调试中运行,检查你是否也在使用调试库,它解决了我们的问题。: OpenCV imread(filename)在使用发布库时在调试模式下失败。

我在2.4.6中遇到了同样的问题。原因是在选择库时,我同时选择了调试版本和发布版本。当我只选择库的调试版本时,一切都很好

我可以确认,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

我也遇到过同样的问题

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它不能加载图像,它在加载图像后暂停!

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

Mat mat= imread(filename, CV_LOAD_IMAGE_ANYDEPTH);

问题是由于某些原因,OpenCV没有构建Tiff支持。

Opencv4.3 Windows10 x64 Visual Studio 2019我终于解决了这个问题!!

好了,现在,当你遇到这个问题时,你可以试试:

  1. 检查你的设置,确保你没有在"Project->Properties-> link ->Input"对于发布/调试,opencv_xxx430d.lib(注意d)用于调试,opencv_xxx430.lib(没有d)用于发布,平台为x64
  2. C/C++->General中,您需要设置Additional include directory, 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的图像。好运。

如果您认为这是一个OpenCV错误,那么请将您的图像和说明发布到OpenCV错误跟踪器。

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

  1. 参见此处的相关问题

  2. Please make sure your path is correct

  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  ). 

好运S

我有同样的问题。我解出来了。关键是文件名是否为jpg。如果文件名是p1,您应该使用imread("p1.jpg")。但是我们经常将文件名设置为p1.jpg,这里我们应该使用imread("p1.jpg.jpg") .

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

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

反过来也是正确的:如果您正在构建发布并且您有调试库,那么imread()悄悄地失败(在imread()之后errno为0,但映像对象未填充)。

另一种可能性:

如果你在OS X上静态链接OpenCV,一定要使用libjpeg,它是与OpenCV捆绑在一起的,而不是系统自带的。

我有类似的问题与OpenCV 3.0,除了cvLoadImage不能很好地工作。所以,这可能不能真正回答你的问题,但也许它会帮助别人。

我也有同样的问题,imread不工作,cvLoadImage工作。

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

win32下OpenCV 2.4.3中imread没有一般性问题

我知道你想用"imread" &"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);
}