Не работает в Opencv

Я пытаюсь использовать функцию imread из OpenCV2.2.

Мой код очень прост.

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

После этого матрица хоста заполнилась указателями нулей, то есть изображение не загрузилось.

Если я использую cvLoadImage, тогда все работает правильно.

Файл существует, и я не смешиваю библиотеки выпуска и отладки. Почему imread не работает?

Ответ 2

Я могу подтвердить, что есть некоторые проблемы с imread в OpenCV 2.2. Однако проблемы возникли только в 32-битной системе Windows. На linux и на mac он работал. Я не могу сказать, почему это не сработало, но у нас было небольшое обходное решение для этого.

Мы исправили эту проблему со следующими макросами: возможно, вы можете попробовать это и использовать "ourImread" с этого момента.

#ifdef WIN32
#define ourImread(filename, isColor) cvLoadImage(filename.c_str(), isColor)
#else
#define ourImread(filename, isColor) imread(filename, isColor)
#endif

Ответ 3

i столкнулась с той же проблемой с 2.4.6. Причина в том, что при выборе библиотеки я выбрал как версию отладки, так и версию выпуска. Когда я выбрал только отладочную версию для библиотеки, все работало нормально

Ответ 4

У меня была та же проблема

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 он не может загрузить изображение, и он продолжает паузу после загрузки изображения!

Ответ 5

Если вы считаете, что это ошибка OpenCV, пожалуйста, разместите свое изображение и инструкции для воспроизведения OpenCV bugtracker.

Ответ 6

У меня та же проблема. Я решил это. Ключ состоит в том, имеет ли имя файла jpg. Если имя файла p1, вы должны использовать что-то вроде этого imread("p1.jpg"). Но мы часто устанавливаем имя файла как p1.jpg, здесь мы должны использовать что-то вроде этого imread("p1.jpg.jpg").

Ответ 7

Я знаю, что поздно, но кто-то может найти это полезным. Я столкнулся с той же проблемой при использовании imread с использованием OpenCV-3.0. Я пробовал все решения, но на самом деле я не добавлял библиотеку opencv2/imgcodecs.hpp. Хотя imshow работал без него, но после этого я смог прочитать изображение.

Ответ 8

У меня есть аналогичная проблема для Linux при чтении только 32-битных tiff-изображений.

Mat mat= imread(filename, CV_LOAD_IMAGE_ANYDEPTH);

Проблема заключалась в том, что по какой-то причине OpenCV не строился с поддержкой Tiff.

Ответ 9

  • см. соответствующий вопрос здесь

  • Убедитесь, что ваш путь верен,

  • В соответствии с API Opencv я бы попробовал этот вызов:

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

Ответ 10

Это также случилось со мной, моим простым решением было использование C API, а затем преобразование в Mat:

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

Ответ 11

Обратное также верно: если вы создаете Release и у вас есть библиотеки отладки, тогда imread() спокойно терпит неудачу (errno равно 0 после imread(), но объект изображения не заполняется).

Ответ 12

Другая возможность:

Если вы находитесь на OS X и статически связываете OpenCV, обязательно используйте libjpeg, который связан с OpenCV, а не с системным.

У меня была аналогичная проблема с OpenCV 3.0, за исключением того, что cvLoadImage тоже не работал. Таким образом, это может не отвечать на ваш вопрос, но, возможно, это поможет кому-то другому.

Ответ 13

У меня также была та же самая проблема, что imread не работал, и cvLoadImage действительно работал.

Я решил создать новую Visual Studio с нуля, и теперь она работает.

Нет общей проблемы с imread в OpenCV 2.4.3 под win32.

Ответ 14

У меня была та же проблема

cvLoadImage

старше c style

imread

- стиль С++, но при использовании библиотек отладки работает нормально. но медленный, при использовании библиотек выпуска он не будет работать, потому что opencv С++-интерфейс имеет много ошибок. Так что вам нужно использовать библиотеки отладки, а затем imread works fine

Ответ 15

Я знаю, что вы хотите использовать "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);
}