C++ imread在Opencv中不工作

C++ imread在Opencv中不工作,c++,opencv,C++,Opencv,我正在尝试使用OpenCV2.2中的imread函数 我的代码非常简单 cv::Mat host= imread("1.bmp", CV_LOAD_IMAGE_GRAYSCALE); 之后,主机矩阵由零指针填充,即未加载图像 如果我使用cvLoadImage,那么一切都正常工作 该文件存在,我不会混合使用发行版库和调试库。为什么imread不起作用?如果您认为这是一个OpenCV错误,请将您的图像和复制说明发布到。我可以确认,OpenCV 2.2中的imread存在一些问题。但是,这些问题只发

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

我的代码非常简单

cv::Mat host= imread("1.bmp", CV_LOAD_IMAGE_GRAYSCALE);
之后,主机矩阵由零指针填充,即未加载图像

如果我使用
cvLoadImage
,那么一切都正常工作


该文件存在,我不会混合使用发行版库和调试库。为什么
imread
不起作用?

如果您认为这是一个OpenCV错误,请将您的图像和复制说明发布到。我可以确认,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
  • 见相关问题

  • 请确保您的路径正确

  • 根据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  ). 
    
    Mat imread(常量字符串和文件名,int标志=1)
    从文件加载图像。
    参数:
    filename–要加载的文件的名称。
    flags–指定加载图像的颜色类型:
    >0加载的图像强制为3通道彩色图像
    =0加载的图像强制为灰度
    我知道你想使用“imread”和“CV\u LOAD\u IMAGE\u 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);
    }
    
    定义CV\u无向后\u兼容性
    #包括
    #包括
    #包括
    int main(){
    /*加载图像*/
    IplImage*img=cvLoadImage(“yourPicture.bmp”);//jpg-bmp
    /*检索属性*/
    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);
    /*设置指针以访问图像数据*/
    uchar*数据=(uchar*)img->imageData;
    uchar*data2=(uchar*)img2->imageData;
    /*手动转换为灰度*/
    int i,j,r,g,b,字节;
    对于(i=0;iwidthStep)+j*(img2->nChannels)+0]=字节;
    数据2[i*(img2->widthStep)+j*(img2->nChannels)+1]=字节;
    数据2[i*(img2->widthStep)+j*(img2->nChannels)+2]=字节;
    }
    }
    cvNamedWindow(“ImagenColor”,1);
    cvShowImage(“ImagenColor”,img);
    cvNamedWindow(“灰色”,1);
    cvShowImage(“灰色”,img2);
    }
    
    我也有同样的问题。我解决了。关键是文件名是否有jpg。
    如果文件名是
    p1
    ,则应该使用类似于
    imread(“p1.jpg”)
    的内容。但是我们经常将文件名设置为
    p1.jpg
    ,这里我们应该使用类似这样的
    imread(“p1.jpg.jpg”)
    ,我也遇到了同样的问题

    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::Mat image=cv::imread(“immagine12.jpg”);//读文件
    if(!image.data)//检查输入是否无效
    {
    
    cout我也有同样的问题,imread不能工作,cvLoadImage也能工作

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


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

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

    使用OpenCV 2.4.8复制


    如果您正在调试中运行,请检查您是否也在使用调试库,它修复了我们的问题。

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

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

    反之亦然:如果您正在构建发行版,并且有调试库,则imread()会悄然失败(imread()之后的errno为0,但图像对象未填充)。

    另一种可能性:

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


    我对OpenCV 3.0也有类似的问题,只是
    cvLoadImage
    不起作用。因此,这可能不能真正回答您的问题,但可能会帮助其他人。

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

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

    Mat mat= imread(filename, CV_LOAD_IMAGE_ANYDEPTH);
    

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

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

    在我总结所有可能的解决方案之前,我只想说,操Windows!好吧,现在,当你遇到问题时,你可以试试:

  • 检查您的设置,确保不要在“项目->属性->链接器->输入”中混合include.lib文件进行发布/调试,
    opencv_xxx430d.lib
    (注意
    d
    )用于调试,
    opencv_xxx430.lib
    (no
    d
    )用于发布,平台是
    x64
  • C/C++->General
    中,您需要为发布/调试分别设置
    X:/(opencv\u build/install)/include
    X:/(opencv\u build/install)/include/opencv2
    附加include目录
  • 也许你应该把
  • 包括在内
  • 最后是Unicode问题,也是我的问题,图像文件中的Unicode符号