it-swarm.it

imread non funziona in Opencv

Sto cercando di utilizzare la funzione imread di OpenCV2.2. 

Il mio codice è molto semplice.

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

Successivamente, la matrice Host è stata riempita da puntatori a zeri, ovvero un'immagine non è stata caricata.

Se uso cvLoadImage allora tutto funziona correttamente.

Il file esiste e non sto mescolando le librerie di rilascio e di debug. Perché imread non funziona?

27
luckydevil

Riprodotto con opencv 2.4.8. 

Se si sta eseguendo in Debug, verificare che si stiano utilizzando anche le librerie di debug, ha risolto il nostro problema. : OpenCV imread (filename) fallisce in modalità debug quando usa librerie di rilascio .

Posso confermare che ci sono alcuni problemi con imread in OpenCV 2.2. Tuttavia, i problemi si sono verificati solo su un sistema Windows a 32 bit. Su un Linux e su un Mac ha funzionato. Non posso dire perché non ha funzionato, ma abbiamo avuto un piccolo workaround per questo.

Abbiamo risolto questo problema con le seguenti macro, forse potresti provarlo e utilizzare "ourImread" da quel momento in poi.

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

stavo affrontando lo stesso problema con 2.4.6. Il motivo era che mentre selezionavo la libreria, avevo selezionato sia la versione di debug che la versione di rilascio. Quando ho selezionato solo la versione di debug per la libreria, tutto ha funzionato bene

8
user2975919

Ho avuto lo stesso problema

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");

ma l'ho riparato quando ho inserito cv::waitKey(5000);
Non so perché ma con system pause non può caricare l'immagine e va in pausa dopo aver caricato l'immagine!

6
Lorenzo

So che è tardi, ma qualcuno potrebbe aver trovato utile questo. Stavo affrontando lo stesso problema durante l'utilizzo di imread usando OpenCV-3.0. Ho provato tutte le soluzioni ma in realtà non stavo aggiungendo la libreria opencv2/imgcodecs.hpp. Anche se imshow funzionava senza di esso, ma dopo averlo aggiunto, sono riuscito a leggere l'immagine.

1
Maham

Se pensi che sia un bug di OpenCV, per favore, pubblica la tua immagine e le istruzioni per la riproduzione nel OpenCV bugtracker .

1
Andrey Kamaev

Ho un problema simile su Linux, quando leggo solo immagini Tiff a 32 bit.

Mat mat= imread(filename, CV_LOAD_IMAGE_ANYDEPTH);

Il problema era che OpenCV non era stato creato con il supporto di Tiff per qualche motivo.

1
mrgloom

Ho lo stesso problema. L'ho risolto. La chiave è se il nome del file ha jpg . Se il nome file è p1, dovresti usare qualcosa come questa imread("p1.jpg"). Ma spesso impostiamo il nome file come p1.jpg, qui dovremmo usare qualcosa come questa imread("p1.jpg.jpg").

0
lifeiteng

È vero anche il contrario: se stai creando Release e hai le librerie Debug, allora imread () fallisce tranquillamente (errno è 0 dopo imread (), ma l'oggetto immagine non è popolato).

Un'altra possibilità:

Se sei su OS X e colleghi staticamente OpenCV assicurati di usare libjpeg che è in bundle con OpenCV, non quello del sistema.

Ho avuto problemi simili con OpenCV 3.0, con la differenza che cvLoadImage non funzionava altrettanto bene. Quindi, questo potrebbe non rispondere alla tua domanda, ma forse aiuterà qualcun altro.

0
Dmitry Zaytsev

Questo è successo anche a me, la mia soluzione semplice era usare l'API C e quindi convertire in Mat:

IplImage* img = cvLoadImage("c://frame_201.bmp");
Mat mat = Mat(img);
0
madhat1
  1. vedi domanda correlata qui

  2. Assicurati che il tuo percorso sia corretto, 

  3. Secondo l'API di Opencv, proverei questa chiamata: 

arrayMat[i]=imread("1.jpg" , 1 );

I parametri per 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  ). 

Buona fortuna 

0
TripleS