2011-09-14 19 views
27

Sto provando a utilizzare la funzione imread da OpenCV2.2.imread non funziona in Opencv

Il mio codice è molto semplice.

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

Dopo che la matrice ospite divenne riempito da zeri puntatori, ossia un'immagine non è caricata.

Se utilizzo cvLoadImage, tutto funziona correttamente.

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

+3

@asandwhich sì, c'è "Perché imread non funziona?". Non è una domanda? Probabilmente non è il modo migliore per chiedere aiuto, ma comunque una domanda. Le persone invece di essere semplicemente sarcastici cercano davvero di aiutare le persone !! So che molti di noi non descrivono e chiedono correttamente, ma se non hai intenzione di aiutarti per favore non preoccuparti di essere sarcastico. – BRabbit27

+0

Ci scusiamo per rispondere alla domanda originale. "Perché imread non funziona?"inizialmente non era nella domanda, l'ho fatto notare al richiedente, ma, hey, suppongo di doverlo smettere –

risposta

1

Se si pensa che sia un bug di OpenCV, quindi, si prega di inviare l'immagine e le istruzioni per la riproduzione allo OpenCV bugtracker.

9

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 i seguenti macro, forse è possibile 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 
+1

In realtà questo bug esiste ancora su OpenCV 2.4.2 win32 – vinjn

+0

Ho anche affrontato questo problema con OpenCV 2.4.7, win32 L'esecuzione di Visual Studio 2012 ha provocato l'insorgenza di bug in esecuzione nella modalità di rilascio su console. – franckysnow

+2

Le modalità di rilascio e debug di miscelazione sono la causa del problema. Vedere http://stackoverflow.com/questions/9125817/ opencv-imreadfilename-fail-in-debug-mode-when-using-release-libraries – Aerospace

0
  1. vedere la domanda relativa here

  2. Assicurati che il tuo percorso sia corretto,

  3. Secondo API del Opencv, mi piacerebbe provare 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 S

-2

So che si desidera utilizzare "imread" & "CV_LOAD_IMAGE_GRAYSCALE" e convertire automaticamente. Ma questo altro modo per caricare una foto e la conversione in scala di grigi:

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); 
} 
1

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

6

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 ho riparato quando si inserisce il cv::waitKey(5000);
Non so perché, ma con system pause non si può caricare l'immagine e va in pausa dopo carica l'immagine!

+1

La causa del problema è il mixaggio delle modalità di rilascio e di debug. Vedi http://stackoverflow.com/questions/9125817/opencv-imreadfilename-fails -in-debug-mode-when-using-release-libraries – Aerospace

-1

Ho anche avuto lo stesso problema che imread non ha funzionato e cvLoadImage ha funzionato.

Ho deciso di creare un nuovo Visual Studio da zero e ora funziona.

Non c'è alcun problema generale con imread in OpenCV 2.4.3 sotto win32.

8

mi trovavo ad affrontare 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 correttamente

0

Anche questo è accaduto a me, la mia soluzione semplice era quella di utilizzare l'API C e poi convertire in Mat:

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

Questo ha funzionato per me! –

-1

Ho avuto lo stesso problema

cvLoadImage 

è più vecchio c stile

imread 

è in stile C++ ma quando si utilizzano le librerie di debug funziona correttamente. ma lento, quando si usano librerie di rilasci non funzionerà perché l'interfaccia opencv C++ ha molti bug.so che bisogna usare le librerie di debug quindi imread funziona bene

+0

non è una risposta – Lrrr

0

Il contrario è anche vero: se si sta creando Release e si ha Debug le librerie, quindi imread() fallisce tranquillamente (errno è 0 dopo imread(), ma l'oggetto immagine non è popolato).

0

Altra possibilità:

Se siete su OS X e staticamente collegare OpenCV assicurarsi di utilizzare libjpeg che viene fornito in bundle con OpenCV, non uno del sistema.

Ho avuto un problema simile con OpenCV 3.0, tranne che cvLoadImage non funzionava bene. Quindi, questo potrebbe non rispondere alla tua domanda, ma forse aiuterà qualcun altro.

1

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

1

Ho un problema simile su Linux, quando si leggono solo immagini TIF a 32 bit.

Mat mat= imread(filename, CV_LOAD_IMAGE_ANYDEPTH); 

problema era perché OpenCV non è stato compilato con il supporto Tiff per qualche motivo.

Problemi correlati