2010-12-13 16 views
9

Ho installato OpenCV 2.2 e ora non riesco a far funzionare la webcam capture. Ha funzionato bene in 2.1. OpenCV rileva una webcam, non segnala errori o avvisi, ma ogni frame è un'immagine grigia. Ho anche provato un esempio di codice da OpenCV wiki:Problema di cattura webcam OpenCV

VideoCapture cap(0); // open the default camera 
if(!cap.isOpened()) // check if we succeeded 
    return -1; 

Mat edges; 
namedWindow("edges",1); 
for(;;) 
{ 
    Mat frame; 
    cap >> frame; // get a new frame from camera 
    cvtColor(frame, edges, CV_BGR2GRAY); 
    //GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5); 
    //Canny(edges, edges, 0, 30, 3); 
    imshow("edges", edges); 
    if(waitKey(30) >= 0) break; 
} 
// the camera will be deinitialized automatically in VideoCapture destructor 
return 0; 

Qualcuno ha incontrato questo problema? Sto usando 64bit Win7 e Visual Studio 2010.

+2

Che cosa si intende per " un'immagine grigia "? Grigio solido, senza struttura? O solo un'immagine in scala di grigi? Stai chiamando cvtColor() per mettere l'immagine in scala di grigi e la chiamata imshow() mostra la versione in scala di grigi ... – jtdubs

+0

Grigio fisso, non in scala di grigi. – Figaro

+0

A volte questo ib è un po 'lento. Aggiungi un 'sleep (1)' o 'cv :: waitKey (100)' prima del bordo Mat e aggiungi lo stesso all'interno del ciclo for. Questo dovrebbe funzionare. E non dimenticare di chekc se 'frame' è un'immagine prper. – nutario

risposta

1

Non so davvero nulla di OpenCV, ma il problema non è nella riga seguente?

cvtColor(frame, edges, CV_BGR2GRAY); 

Sembra che si converta intenzionalmente uno spazio colore B-G-R in uno spazio in scala di grigi.

non dovrebbe essere qualcosa di simile:

cvtColor(frame, edges, CV_BGR2RGB); 
+0

la maggior parte degli algoritmi di rilevamento dei bordi funziona solo su immagini in scala di grigi - l'op sta visualizzando l'immagine in scala di grigi anziché quella originale –

+0

Questo è il problema dando la mia opinione su una questione che non conosco ... :) Ho pensato al problema Era l'immagine in scala di grigi, non un'immagine grigia in sé ... Silly me. :) – Machado

9

ho trovato la soluzione, dopo una lunga ricerca.

Il problema è che se non si dispone di un ritardo tra la visualizzazione dei frame si verifica questo problema.

La soluzione viene inserita in ciclo cvWaitKey(20);.

+1

Volevo semplicemente aggiungere un commento che risolva il problema! Grazie :) – amr

3

Il problema riguardava la fotocamera che ho utilizzato, MSFT LifeCam. Ho provato Logitech C210 e 120 ed entrambi funzionano bene.

0

Puoi anche dare un'occhiata a this post.

Per dirla semplice, cambiando

da

importazione cv

a

importazione cv2.cv come cv

ha funzionato per me. Vedi anche il post here.

3

Ecco la soluzione.

Ogni immagine catturata viene convertita in un'immagine in scala di grigi nella prima riga in basso. Commentando ed eseguendo il codice da solo mostrerà un errore dal momento che non si acquisisce alcuna immagine elaborata nella cornice degli spigoli, che viene visualizzata in imshow.

Quindi commentare la riga cvtColor e modificare il secondo parametro in imshow in frame. Questo ti permetterà di visualizzare il video a colori dalla webcam.

cvtColor(frame, edges, CV_BGR2GRAY); 

imshow("edges", frame); 
0

Ho avuto lo stesso problema. Ho pensato che potrebbero essere le impostazioni sulla mia macchina fotografica, perché dovevo avere un input di 640x480px (che non potevo regolare) e non ho potuto regolare le autorizzazioni per il feed. Così ho installato una webcam virtuale, che ha praticamente risolto entrambi i problemi. Ho avuto un dialogo di input, ho scelto la macchina virtuale e ha funzionato. Sono riuscito a impostarlo su 640x480 anche nell'app.

La mia fotocamera virtuale si chiamava ManyCam, ma sembra fatta per le ragazze adolescenti, voleva che installassi altre 3 app e non sono ancora sicuro che il tempo non arrivi con i trojan "complementari".

Tuttavia, consente di regolare colori, tonalità, contrasto ecc. E altre cose che potrebbero essere necessarie per il test.

+0

Faresti meglio a lasciare un commento prima di chiedere se aggiungere una telecamera virtuale è accetabile. – StarPinkER

0

Sto usando cvtColor e ha scoperto che

cvtColor(image,image,CV_BGR2RGB); non ha funzionato.

Ma la buona notizia è che questo cambiamento funziona !!

cvtColor(image,image,**COLOR_BGR2RGB**); 

includono anche:

include opencv2/imgproc/imgproc.hpp 

e nel file .pro biblioteca:

-lopencv_imgproc 
0

Prova questo:

VideoCapture cap(0); // open the default camera 
if(!cap.isOpened()) // check if we succeeded 
{ 
    cout<<"Cam not captured\n"; 
} 

Mat frame; 
namedWindow("frame"); 
for(;;) 
{ 
    cap >> frame; // get a new frame from camera 
    imshow("frame", frame); 

    if(waitKey(10) >= 0) break; 
} 

return 0; 
Problemi correlati