OpenCV C++ Webcam macht seltsame Sachen



  • Guten Tag Forum,

    ich habe Windows 10 64Bit mit Visual Studio 2015 Prof und OpenCV 2.4.13 installiert. Dazu habe ich eine Webcam von Logitech C525 (720p).

    Jetzt hab ich nach kurzer Recherche die Seite https://thefreecoder.wordpress.com/2012/09/11/opencv-c-video-capture/

    gefunden und Analog meinen Code erstellt:

    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    #include <iostream>
    using namespace cv;
    using namespace std;
    
    int main() {
    VideoCapture stream1(0); 
    
    if (!stream1.isOpened()) {
    cout << "cannot open camera";
    }
    
    while (true) {
    Mat cameraFrame;
    stream1.read(cameraFrame);
    imshow("cam", cameraFrame);
    if (waitKey(30) >= 0)
    break;
    }
    return 0;
    }
    

    Das funktioniert egtl. ganz gut. Mich stört aber doch einiges, vor allem der letzte Punkt

    -dass das Programm nach Start etwa 10-15 Sekunden braucht um Bilder anzuzeigen, bis dahin ist das Fenster "cam" grau.

    -die Kamera wird mit 640x480 gestartet. Ich konnte über dieses setProperty auf 960x720 ändern, jetzt ruckelt es aber ziemlich stark, ist das normal?

    -wenn ich die Zeile mit dem waitKey(30) kommentiere (also "aus" kommentieren). Dann bleibt das Fenster grau? Wie kann das denn sein? Das ist jederzeit reproduzierbar. Auch nach Neustart und Test von OpenCV 3.1 (kein Unterschied)

    Kann mir dabei jemand helfen?
    Vielen Dank



  • Das waitKey brauchst nur für die Gui, die Daten kommen auch so rein. Denke, da wird in die Eventloop zurück-/eingekehrt damit dort dann das Fenster gezeichnet wird.



  • Danke Bambi,

    wie finde ich den besten wert dafür? also statt 30 die 10 oder eben 50 ?



  • 1000/fps - (zeit_letzter_durchlauf - (1000/fps))

    kann das stimmen 😕 😞



  • Nein, so nimmt man den Fehler über die Frames mit, keine Ahnung, wie man das ausrechnet. Wahrscheinlich muss man die Summe nehmen und dann schauen, wie spät man dran ist...

    starttzeit und angezeigte frames, dann schaut man wie lange man warten muss, damit man auf die fps kommt...



  • soll = ((1000/fps)*angezeigte_frames)
    ist = now()-start_time
    
    wartezeit = max((1000/fps) - (soll - ist),0)
    

    So vllt....



  • max((1000/fps) - (soll - ist),1<-- 😃 )



  • max((1000/fps) - (ist-soll),1)
    

    🙄

    Ja, wie auch immer ➡



  • Sehe ich das richtig? Hier wird "gemessen" wie lange für den Frame gebraucht wurde ?

    Ich habe jetzt einen Schieberegler eingebaut mit dem man die FPS einstellen kann. Der Schieberegler geht von 1 - 60;
    Die ms zu warten berechne ich dann einfach mit 1000/FPS.

    Das scheint zu klappen, wenn ich 1 eingebe in den Slider werden 1000ms gewartet usw.

    Mir ist jetzt aufgefallen, wenn ich z.B. hohe Werte einstelle, wird das Bild gefühlt langsamer als mit niedrigeren Werten, woran kann das liegen?

    Im Prinzip wurde meine Frage beantwortet, das hier ist nur noch nice to have. Danke an alle Bambis.


Log in to reply