2010-04-12 9 views
6

sto cercando di utilizzare la nuova API OpenCV 2.0 in MS Visual C++ 2008 e ha scritto questo semplice programma:OpenCV 2.0 C++ API utilizzando imshow: rendimenti eccezione non gestita e "cattivi-flag"

cv::Mat img1 = cv::imread("image.jpg",1); 
cv::namedWindow("My Window", CV_WINDOW_AUTOSIZE); 
cv::imshow("My Window", img1); 

Visual Studio restituisce un'eccezione non gestita e la console restituisce:

OpenCV Error: bad flag (parameter or structure field) 
(Unrecognized or unsupported array type) in unknown function, 
file ..\..\..\..\ocv\opencv\src\cxcore\cxarray.cpp, line 2376 

L'immagine non viene visualizzata. Inoltre la finestra "My Window" ha una strana didascalia: "ÌÌÌÌÌ My Window", che non dipende dal nome.

La "vecchia" API C che utilizza comandi come cvLoadImage, cvNamedWindow o cvShowImage funziona senza problemi per lo stesso file di immagine. Ho provato un sacco di cose diverse senza successo.

Apprezzo qualsiasi aiuto qui.

Konrad

+1

Sembra che la chiamata "imread' stia fallendo; puoi verificarlo testando per 'img1.data == NULL'. Sfortunatamente, l'ho appena provato e ho riscontrato lo stesso problema qui. – tzaman

risposta

6

C'è aiuto per questo problema.

La soluzione è che i normali file di libreria opencv proposti nel linker non funzionano correttamente. Invece tenta di utilizzare i file di libreria di debug da questo:

In Visual C++:

andare a Progetto-> Proprietà (o Alt-F7) configurazione Proprietà-> Linker-> INPUT-> Dipendenze aggiuntive

sostituire il solito "cv210.lib cxcore210.lib highgui210.lib" di "cv210d.lib cxcore210d.lib highgui210d.lib" - che sono le librerie di debug.

I comandi API OpenCv 2.0 dovrebbero funzionare ora.

+0

Oh, certo, questo potrebbe causare problemi. Bella presa! Ricorda però di collegare le versioni non di debug per la build in modalità rilascio. – tzaman

+0

sembra non funzionare con l'ultima versione stabile o dev: 2.3.1 o 2.3.2d – Profane

+0

ho anche affrontato questo problema e sono stato stordito, la ringrazio molto per questo – Kiradev

6

Come ho appena commentato, imread non funziona per me. Un po 'googling mostra ad altre persone che hanno lo stesso problema; Immagino sia un bug nel codice della libreria. Per ora, ecco una soluzione alternativa hacky:

IplImage* img = cvLoadImage("lena.jpg"); 
cv::Mat lena(img); 
cvReleaseImage(&img); 

In questo modo, si può almeno utilizzare l'API C++ per il resto della tua roba.

+0

grazie, questo è un approccio utile - funziona bene e mi aiuta molto. – Konrad

+0

Felice di aiutare. Potrei disturbarti a fare clic sulla freccia su e segno di spunta accanto a questo post? :) – tzaman

+0

nessuna preoccupazione, ci ho provato. Ma non mi è ancora permesso :) – Konrad

0

Credo che questo potrebbe essere correlato a unicode.

provare la macro _TEXT()

Ad esempio:

cv::Mat img1 = cv::imread(_TEXT("image.jpg"),1); 

Unicode in Visual C++ 2

2

In primo luogo, è meglio compilare la propria versione OpenCV.

Ho avuto lo stesso errore con la build (ho ottenuto da Sourceforge) e risolto compilando la mia versione in versioni di debug e release.

E assicurarsi di modificare la variabile di sistema originale PATH nella nuova cartella di build build/bin, quindi è possibile creare ed eseguire imshow() in modalità di debug.

2

Sei sicuro di aver aggiunto il intero percorso a partire da /home/.... Ho avuto lo stesso problema di te, ma quando ho aggiunto l'intero percorso, le cose funzionano abbastanza bene. L'intero percorso doveva essere aggiunto nonostante il percorso esistesse nei file di inclusione.

imread in OpenCV differenza Matlab non restituisce un errore quando file/cartella non viene trovato - ma restituisce una matrice nulla, che a sua volta si riflette come un errore durante imshow. Inoltre, imread non cerca i file di immagine nelle cartelle incluse o nell'area di lavoro. Quindi, specificare l'intero percorso quando possibile.

Si prega di prendere nota di ciò per riferimenti futuri.

3

Ho avuto lo stesso problema sopra descritto che risulta essere causato dalle impostazioni del linker.

Ho trovato la risposta in un'altra discussione, OpenCV 2.3 and Visual Studio 2010.

ripeterlo qui:

Proprietà del progetto (tasto destro del mouse su di esso)

  • C/C++
    • generale
      • includono directory aggiungere il < vostra directory> \ OpenCV2.3 \ include \ opencv2, < vostra directory> \ OpenCV2.3 \ include \ OpenCV e < vostra directory> \ OpenCV2.3 \ include
  • Linker

    • generale
      • voce dell'Elenco
    • ingresso
      • aggiungere tutte le librerie come opencv_highgui230d.lib opencv_core230d.lib e così via ...

Una volta che ho fatto quanto sopra, posso correre imshow e imread + tutte le altre funzioni CPP senza soluzione di continuità! Probabilmente il problema dell'OP è già stato risolto, ma spero che questo sia utile ad altre persone che sono guidate qui cercando la stessa soluzione.