2013-03-20 14 views
11

questo messaggio appare erorr a correre fotocamera cattura semplici su Ubuntu con Logitech C270 (OpenCV 2.4.2/C++):Errore Opencv su Ubuntu webcam (Logitech C270) Capture -> HIGHGUI ERRORE: V4L/V4L2: VIDIOC_S_CROP

HIGHGUI ERROR: V4L/V4L2: VIDIOC_S_CROP

e in seguito:

Corrupt JPEG data: 2 extraneous bytes before marker 0xd1 Corrupt JPEG data: 1 extraneous bytes before marker 0xd6 Corrupt JPEG data: 1 extraneous bytes before marker 0xd0 Corrupt JPEG data: 1 extraneous bytes before marker 0xd0

ottengo fotogrammi ma i valori di larghezza ed altezza telaio scambiati durante la scrittura di un oggetto Mat vedere qui:

Mat frame; 
videoCapture = new VideoCapture(camId); 
if(!videoCapture->isOpened()) throw Exception(); 

cout << "Frame width: " << videoCapture->get(CV_CAP_PROP_FRAME_WIDTH) << endl; 
cout << "Frame height: " << videoCapture->get(CV_CAP_PROP_FRAME_HEIGHT) << endl; 

(*videoCapture) >> frame; 

cout << "Mat width: " << frame.rows << endl; 
cout << "Mat height: " << frame.cols << endl; 

uscita:

Frame width: 640 
Frame height: 480 
Mat width: 480 
Mat height: 640 

risposta

2

La larghezza di un'immagine è data dal suo numero di colonne. Il tuo codice dovrebbe essere

cout << "Mat width: " << frame.cols << endl; 
cout << "Mat height: " << frame.rows << endl; 

Quindi non c'è scambio tra larghezza e altezza.

+0

Mi dispiace, colpa mia -.- – user2192424

+3

Ma non so come sbarazzarmi dei messaggi di errore che ottieni. Li ho anche sulla mia macchina. – carlito

7

Se non si desidera eseguire il debug del problema e i frame della webcam vengono visualizzati senza problemi, l'opzione è solo quella di sparare al messaggio. Le seguenti istruzioni funzionano se è stato creato OpenCV dal sorgente, invece di installare i binari predefiniti.

Inizia con grep -R "Corrupt JPEG data" ~/src/opencv-2.4.4/ e vai più a fondo nella tana del coniglio finché non trovi ciò che desideri. Nel mio caso il colpevole è a opencv-2.4.4/thirdparty/libjpeg/jdmarker.c:908:

if (cinfo->marker->discarded_bytes != 0) { 
    WARNMS2(cinfo, JWRN_EXTRANEOUS_DATA, cinfo->marker->discarded_bytes, c); 
    cinfo->marker->discarded_bytes = 0; 
    } 

Il WARNMS2 macro è ciò che sta causando i messaggi di errore relativi dati estranei da stampare. Basta commentare, ricostruire OpenCV e portare avanti il ​​tuo lavoro. Ho anche un C270, eseguo Ubuntu 12.04 e ho riscontrato lo stesso messaggio di errore fastidioso finché non ho fatto quello che ho descritto sopra.

5

Circa problema:

Corrupt JPEG data: 2 extraneous bytes before marker 0xd1 Corrupt JPEG data: 1 extraneous bytes before marker 0xd6 Corrupt JPEG data: 1 extraneous bytes before marker 0xd0 Corrupt JPEG data: 1 extraneous bytes before marker 0xd0

sembra, il problema è in libreria libjpeg. Per qualche motivo sconosciuto funziona in modo errato nella libreria OpenCV. Ho provato a compilare senza supporto di JPEG e ha risolto questo problema.

cmake -D CMAKE_BUILD_TYPE = uscita -D CMAKE_INSTALL_PREFIX =/usr/local -D BUILD_SHARED_LIBS = OFF -D BUILD_EXAMPLES = OFF -D BUILD_TESTS = OFF -D BUILD_PERF_TESTS = OFF -D WITH_JPEG = OFF -D WITH_IPP = OFF ..

potete trovare tutti i dettagli nel mio blog:

http://privateblog.info/linux/opencv-i-corrupt-jpeg-data-na-linux/

+2

JDK su linux contiene il proprio libjpeg. Ora penso che durante la compilazione questa libreria sia usata al posto di quella corretta da Linux. E causa il problema. – Kanaris007

0

Se si vuole solo sbarazzarsi di uscita in modo rapido ed grep -v Corrupt non funziona per qualche modo - come per me - si potrebbe anche reindirizzare stderr a nulla, ad es

./my_app 2> /dev/null 

python my_app.py 2> /dev/null 

Questo ovviamente nasconderà anche altri messaggi di errore.

Problemi correlati