Webcam ansteuerung zu langsam



  • Hi,

    ich habe es bereits geschafft meine Webcam anzusteuern und auch ein Bild zu erhalten. Nun habe ich das in eine Schleife gepackt und festgesteltt, dass nur etwa jede Sekunde ein neues Bild gemacht wird. Ich möchte aber viel öfter Bilder erhalten. Wie mache ich das?

    Hier ein Auszug meines bisherigen Codes:

    while (true)
    	{
    		HWND hwndcap = capCreateCaptureWindow ("brauche dieses fenster nicht...",WS_CHILD,10,100,260,220,hwnd,1);
    
    		capDriverConnect(hwndcap,0);
    
    		CAPTUREPARMS s;
            capCaptureGetSetup(hwndcap,&s,sizeof(CAPTUREPARMS));
            s.fYield = TRUE;
            s.fCaptureAudio = FALSE;
            s.fAbortLeftMouse = FALSE;
            s.fAbortRightMouse = FALSE;
    
    		capCaptureSetSetup(hwndcap,&s,sizeof(CAPTUREPARMS));
    		capEditCopy(hwndcap);
    
    		OpenClipboard(hwnd);
    
    		capEditCopy(hwndcap);
    
    		HBITMAP handle = (HBITMAP) GetClipboardData(CF_BITMAP);
            HBITMAP hBmp = (HBITMAP) CopyImage(handle, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG);
    
    		HDC hdc = GetDC(NULL);
    
    		HDC sourceHdc = CreateCompatibleDC(hdc);
    		SelectObject(sourceHdc, hBmp);
    
                    // Etwas mit dem Bild machen...
    
    		DeleteDC(sourceHdc);
            DeleteObject(hBmp); 
    		CloseClipboard();
    
    		capDriverDisconnect(hwndcap);
    		DestroyWindow(hwndcap);
    	}
    

    Würde mich sehr über Antworten freuen 🙂 Danke :xmas1:



  • Warum verbindest Du Dich jedesmal wieder neu? Mach das doch nur einmal...



  • Jochen Kalmbach schrieb:

    Warum verbindest Du Dich jedesmal wieder neu? Mach das doch nur einmal...

    Wenn ich mich nur einmal verbinde, dann erhalte ich beim ersten Durchlauf der Schleife das aktuelle Bild und somit das gewünsche Ergebnis. Aber bei jedem weiteren Durchlauf erhalte ich wieder das Bild vom ersten Durchlauf. Es wird also kein aktuelles Bild mehr geliefert. Gelöst hatte ich dieses Problem dadurch das ich mich einfach jedesmal neu verbinde. Allerdings scheint dies auch der Grund zu sein, warum das alle so langsam ist...

    Hier mein Versuch:

    HWND hwndcap = capCreateCaptureWindow ("brauche dieses fenster nicht...",WS_CHILD,10,100,260,220,hwnd,1);
    
    	capDriverConnect(hwndcap,0); 
    
    	CAPTUREPARMS s;
    
    	capCaptureGetSetup(hwndcap,&s,sizeof(CAPTUREPARMS));
    	s.fYield = TRUE;
    	s.fCaptureAudio = FALSE;
    	s.fAbortLeftMouse = FALSE;
    	s.fAbortRightMouse = FALSE;
    
    	capCaptureSetSetup(hwndcap,&s,sizeof(CAPTUREPARMS));
    
    	while (true)
    	{
    		capEditCopy(hwndcap);
    
    		OpenClipboard(NULL); // Ist NULL eigentlich richtig?
    
    		HBITMAP handle = (HBITMAP) GetClipboardData(CF_BITMAP);
            HBITMAP hBmp = (HBITMAP) CopyImage(handle, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG);
    
    		HDC hdc = GetDC(NULL);
    
    		HDC sourceHdc = CreateCompatibleDC(hdc);
    		SelectObject(sourceHdc, hBmp);
    
    // Etwas machen...
    
    		DeleteDC(sourceHdc);
            DeleteObject(hBmp); 
    		CloseClipboard();
    
    		Sleep(1);
    	}
    
    	capDriverDisconnect(hwndcap);
    	DestroyWindow(hwndcap);
    

    Wo liegt der Fehler? Bin ratlos 😞



  • benutze opencv für sowas. das macht das ganze einfacher

    beispiel mit angewandten sobel:

    #include "cv.h"
    #include "highgui.h"
    #include "cvcam.h"
    
    #define MAX_LOADSTRING 100
    
    int APIENTRY wWinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPTSTR    lpCmdLine,
                         int       nCmdShow)
    {
    
      CvCapture* cap = cvCreateCameraCapture(-1); /* erste camera */
      IplImage* img;
      IplImage* dest;
      cvGrabFrame(cap);             /* ein frame schon mal holen   */
      img = cvRetrieveFrame(cap);   /*                             */
      dest = cvCloneImage(img);     /* um ausgangsbild zu erzeugen */
      cvNamedWindow("cam");         /* fenster erzeugen */
      cvNamedWindow("Sobel");
    
      /* schleife, solange keine taste gedrückt und kein fenster geschlossen wird */
      while( -1 == cvWaitKey(1) && ( cvGetWindowHandle("cam")&&cvGetWindowHandle("Sobel"))  )
      {
        cvGrabFrame(cap);
        img = cvRetrieveFrame(cap);
    
        cvSobel(img, dest, 1, 0, 3);  /* sobel in x-richtung */
        cvShowImage("cam", img);      /* bilder anzeigen */
        cvShowImage("Sobel", dest);
      }
    
      cvReleaseCapture(&cap);
      cvDestroyAllWindows();
    
      return 0;
    }
    


  • Habe das Problem nun lösen können. Vielen Dank 🙂



  • Blubbb schrieb:

    Habe das Problem nun lösen können. Vielen Dank 🙂

    wie?



  • volkard schrieb:

    Blubbb schrieb:

    Habe das Problem nun lösen können. Vielen Dank 🙂

    wie?

    Ich habe eine Callback-Funktion erstellt:

    capSetCallbackOnVideoStream(hwndcap, CallBackProc);
    

    Diese wird nun bei jedem neuen Frame aufgerufen. Klappt perfekt.


Anmelden zum Antworten