2013-04-18 11 views
19

Ich versuche, den Video-Stream von meinem Logitech C920 in OpenCV zu erfassen. Mit Labview kann ich auf einen MJPG-Stream mit 30fps 1080p zugreifen. In opencv bin ich auf 5fps oder 640x480 beschränkt. HierCapturing 1080p bei 30fps von Logitech c920 mit OpenCV 2.4.3

ist der Code relevant für die Kameraeinstellungen:

this->camRef.set(CV_CAP_PROP_FRAME_WIDTH, 1920); 
this->camRef.set(CV_CAP_PROP_FRAME_HEIGHT, 1080); 
this->camRef.set(CV_CAP_PROP_FOURCC,CV_FOURCC('M','J','P','G')); 

Diese alle Rückkehr 1, doch ich bekomme einen 5fps Strom von 1080p, die dem YUY2 Strom entspricht.
Wenn ich die folgende Zeile:

this->camRef.set(CV_CAP_PROP_FPS, 30); 

Dieser Wert 0 zurück ich einen 30 fps Strom bei 640x480 bekommen. Für mich sieht es so aus, als ob die MJPG-Einstellung nicht akzeptiert wird, aber ich weiß nicht, was ich tun soll oder wie ich das beheben kann.

EDIT: Folgendes stürzt das Programm ab.

this->camRef.read(this->image); 
std::cout<< this->camRef.get(CV_CAP_PROP_FOURCC)       << std::endl; 
std::cout<< this->camRef.set(CV_CAP_PROP_FRAME_WIDTH, config.width)   << std::endl; 
std::cout<< this->camRef.set(CV_CAP_PROP_FRAME_HEIGHT, config.height)  << std::endl; 
std::cout<< this->camRef.set(CV_CAP_PROP_FOURCC,CV_FOURCC('M','J','P','G')) << std::endl; 
std::cout<< this->camRef.get(CV_CAP_PROP_FOURCC)       << std::endl; 

Dann in meinem Lauf Code habe ich folgendes:

void camera::run() 
{ 
    while(true) 
    { 
     if(this->camRef.read(this->image) == 0) 
     { 
      if(this->capture) 
      { 
       cv::imwrite(fileName,this->image); 
       this->count++; 
      } 
     } 
     msleep(15); 
    } 
} 

EDIT2: Lösung ist es, die fourcc Codec einstellen, bevor die Kamerahöhe und Breite einstellen.

+0

wenn Sie fps einstellen möchten (muss von der Kamera unterstützt werden), haben Sie es nach Codec Einstellung zu tun, aber vor Breite/Höheneinstellungen – MartinM

+1

Klingt wie Ihre EDIT2 gab Ihnen 1080p bei 30fps. Sollte in eine Antwort verwandelt werden und dann akzeptiert werden, um das Problem gelöst erscheinen zu lassen. –

Antwort

1

Versuchen erstes Bild von der Aufnahme zu erhalten, bevor irgendetwas einstellen:

VideoCapture cap(0); 
if(!cap.isOpened()) 
return -1; 

Mat frame; 
cap >> frame; 
double fps; 
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 1080.0); 
cap.set(CV_CAP_PROP_FRAME_WIDTH, 1920.0); 
//add the loop here 

und prüfen, ob es ohne Einstellung MJPG funktionieren wird. Wenn es funktioniert, versuchen Sie es mit MJPG.

Für mich ist es ein bisschen komisch, dass man erst den ersten Frame holen muss, bevor man etwas setzt, aber es funktioniert nur so (Windows 7 32bit).



// edit:
Yo versuchen kann verschiedene API verwenden - zweiten Teil meiner Antwort hier sehen: https://stackoverflow.com/a/14188280/1598485 OpenCV versucht, die beste API standardmäßig zu verwenden, aber vielleicht in Ihrem Falls eine andere API besser funktioniert.

+0

Vielen Dank für die Antwort. Ich habe versucht, was Sie sagten, und jetzt stürzt mein Code ab, bevor ein Bild angezeigt wird. cap.read gibt 1 zurück und stürzt dann ab, wenn es versucht, erneut von der Kamera zu lesen. –

+0

In welcher Zeile? Bitte zeigen Sie Ihren Code mit dieser markierten Zeile an. – cyriel

+0

Ich habe die ursprüngliche Frage aktualisiert, um den von Ihnen angeforderten Code anzuzeigen. –

6

Da der Autor des Beitrags bereits die Lösung gefunden hat, aber nicht als Antwort hinzugefügt habe, werde ich die Lösung hier setzen.

Sie haben den Codec setzen, bevor Sie die gewünschte Auflösung eingestellt:

this->camRef.set(CV_CAP_PROP_FOURCC,CV_FOURCC('M','J','P','G')); 
this->camRef.set(CV_CAP_PROP_FRAME_WIDTH, 1920); 
this->camRef.set(CV_CAP_PROP_FRAME_HEIGHT, 1080); 
+0

Danke! Es funktionierte wie gesagt!Auf der anderen Seite möchte ich erwähnen, dass, obwohl dies die FullHD @ 30-Auflösung zulässt, die Bildqualität sehr schlecht sein kann (die Kompressionsrate muss hoch sein, um die Bandbreitenbeschränkung von USB 2.0 zu erfüllen). – cbuchart