Ответ 1
Воспроизводится с помощью opencv 2.4.8.
Если вы работаете в Debug, убедитесь, что вы также используете библиотеки отладки, это устранило нашу проблему.: Ошибка OpenCV imread (filename) в режиме отладки при использовании библиотек выпусков.
Я пытаюсь использовать функцию imread
из OpenCV2.2.
Мой код очень прост.
cv::Mat host= imread("1.bmp", CV_LOAD_IMAGE_GRAYSCALE);
После этого матрица хоста заполнилась указателями нулей, то есть изображение не загрузилось.
Если я использую cvLoadImage
, тогда все работает правильно.
Файл существует, и я не смешиваю библиотеки выпуска и отладки. Почему imread
не работает?
Воспроизводится с помощью opencv 2.4.8.
Если вы работаете в Debug, убедитесь, что вы также используете библиотеки отладки, это устранило нашу проблему.: Ошибка OpenCV imread (filename) в режиме отладки при использовании библиотек выпусков.
Я могу подтвердить, что есть некоторые проблемы с 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
i столкнулась с той же проблемой с 2.4.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
он не может загрузить изображение, и он продолжает паузу после загрузки изображения!
Если вы считаете, что это ошибка OpenCV, пожалуйста, разместите свое изображение и инструкции для воспроизведения OpenCV bugtracker.
У меня та же проблема. Я решил это. Ключ состоит в том, имеет ли имя файла jpg.
Если имя файла p1
, вы должны использовать что-то вроде этого imread("p1.jpg")
. Но мы часто устанавливаем имя файла как p1.jpg
, здесь мы должны использовать что-то вроде этого imread("p1.jpg.jpg")
.
Я знаю, что поздно, но кто-то может найти это полезным. Я столкнулся с той же проблемой при использовании imread
с использованием OpenCV-3.0. Я пробовал все решения, но на самом деле я не добавлял библиотеку opencv2/imgcodecs.hpp
. Хотя imshow
работал без него, но после этого я смог прочитать изображение.
У меня есть аналогичная проблема для Linux при чтении только 32-битных tiff-изображений.
Mat mat= imread(filename, CV_LOAD_IMAGE_ANYDEPTH);
Проблема заключалась в том, что по какой-то причине OpenCV не строился с поддержкой Tiff.
см. соответствующий вопрос здесь
Убедитесь, что ваш путь верен,
В соответствии с 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
Это также случилось со мной, моим простым решением было использование C API, а затем преобразование в Mat
:
IplImage* img = cvLoadImage("c://frame_201.bmp");
Mat mat = Mat(img);
Обратное также верно: если вы создаете Release и у вас есть библиотеки отладки, тогда imread() спокойно терпит неудачу (errno равно 0 после imread(), но объект изображения не заполняется).
Другая возможность:
Если вы находитесь на OS X и статически связываете OpenCV, обязательно используйте libjpeg, который связан с OpenCV, а не с системным.
У меня была аналогичная проблема с OpenCV 3.0, за исключением того, что cvLoadImage
тоже не работал. Таким образом, это может не отвечать на ваш вопрос, но, возможно, это поможет кому-то другому.
У меня также была та же самая проблема, что imread не работал, и cvLoadImage действительно работал.
Я решил создать новую Visual Studio с нуля, и теперь она работает.
Нет общей проблемы с imread в OpenCV 2.4.3 под win32.
У меня была та же проблема
cvLoadImage
старше c style
imread
- стиль С++, но при использовании библиотек отладки работает нормально. но медленный, при использовании библиотек выпуска он не будет работать, потому что opencv С++-интерфейс имеет много ошибок. Так что вам нужно использовать библиотеки отладки, а затем imread works fine
Я знаю, что вы хотите использовать "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);
}