Webcam opencv zeigt schwarzes Fenster



  • Ich habe folgenden Beispielcode ausm Internet kopiert:

    /**
         * Display video from webcam
         *
         * Author  Nash
         * License GPL
         * Website http://nashruddin.com
         */
    
        #include <stdio.h>
        #include "cv.h"
        #include "highgui.h"
    
        int main( int argc, char **argv )
        {
            CvCapture *capture = 0;
            IplImage  *frame = 0;
            int       key = 0;
    
            /* initialize camera */
            capture = cvCaptureFromCAM( 0 );
    
            /* always check */
            if ( !capture ) {
                fprintf( stderr, "Cannot open initialize webcam!\n" );
                return 1;
            }
    
            /* create a window for the video */
            cvNamedWindow( "result", CV_WINDOW_AUTOSIZE );
    
            while( key != 'q' ) {
                /* get a frame */
                frame = cvQueryFrame( capture );
    
                /* always check */
                if( !frame ) break;
    
                /* display current frame */
                cvShowImage( "result", frame );
    
                /* exit if user press 'q' */
                key = cvWaitKey( 1 );
            }
    
            /* free memory */
            cvDestroyWindow( "result" );
            cvReleaseCapture( &capture );
    
            return 0;
        }
    

    Er funktioniert auch wunderbar. Nun wollte ich ihn in ein Winapi Projekt von mir implementieren, als Thread:

    DWORD WINAPI WEBCAM()
    {
        CvCapture *capture = 0;
        IplImage  *frame = 0;
        int       key = 0;
    
        /* initialize camera */
        capture = cvCaptureFromCAM( 0 );
    
        /* always check */
        if ( !capture ) {
            fprintf( stderr, "Cannot open initialize webcam!\n" );
            return 1;
        }
    
        /* create a window for the video */
        cvNamedWindow( "result", CV_WINDOW_AUTOSIZE );
    
        while( key != 'q' ) {
            /* get a frame */
            frame = cvQueryFrame( capture );
    
            /* always check */
            if( !frame ) break;
    
            /* display current frame */
            cvShowImage( "result", frame );
    
            /* exit if user press 'q' */
            key = cvWaitKey( 1 );
        }
    
        /* free memory */
        cvDestroyWindow( "result" );
        cvReleaseCapture( &capture );
    
        return 0;
    }
    

    Dies klappt aber nicht! Es taucht nur das Fenster auf und es bleibt schwarz. Was mache ich falsch? Kann es nicht funktionieren, wenn ich es als Thread ausführen möchte?

    case 6:
    CreateThread(0,0,LPTHREAD_START_ROUTINE(WEBCAM),0,0,0);
    break;

    Danke.



  • Hi

    Ja man sollte halt verstehen was man kopiert !
    Bei opencv wirdst du noch das einte oder andere Problem bekommen das kann ich dir jetzt schon sagen !

    dau



  • Aha und was ist jetzt mein Problem?



  • Hi

    CreateThread(0,0,LPTHREAD_START_ROUTINE(WEBCAM),0,0,0);

    Das sollte wohl so aussehen.

    CreateThread(0,0,LPTHREAD_START_ROUTINE,0,0,0);
    

    lowbyte



  • Hi

    EDIT:

    Oder wohl eher so !

    DWORD ThreadID;
    
    CreateThread(NULL ,0 ,LPTHREAD_START_ROUTINE ,(LPVOID)0 ,0 ,&ThreadID);
    

    lowbyte



  • Hi

    Probier mal ...

    key = cvWaitKey( 10 ); /// 10 milisec

    Ansonnsten sollte der Code funktionieren.

    lowbyte



  • Hi

    Habs grad getestet da ich auch an einem Project arbeite mit opencv.

    So sollte es funktionieren.

    Einzubindende lib's(obwohl einige davon nicht gebraucht werden) für dies kleine Program.

    cv210.lib
    cv210d.lib
    cvaux210.lib
    cvaux210d.lib
    cxcore210.lib
    cxcore210d.lib
    cxts210.lib
    highgui210.lib
    highgui210d.lib
    ml210.lib
    ml210d.lib
    opencv_ffmpeg210.lib
    opencv_ffmpeg210d.lib
    
    #include <stdlib.h>
    #include <windows.h>
    #include "cv.h"
    #include "highgui.h"
    
    DWORD WINAPI webcam();
    
    void main()
    {
    
    	DWORD ThreadID;
    
    	CreateThread(NULL ,0 ,webcam ,(LPVOID)0 ,0 ,&ThreadID);
    
    	printf("test\n");
    	getchar();
    
    	return 0;
    }
    
    DWORD WINAPI webcam()
    {
        CvCapture *capture = 0;
        IplImage  *frame = 0;
        int       key = 0;
    
        /* initialize camera */
        capture = cvCaptureFromCAM( 0 );
    
        /* always check */
        if ( !capture ) {
           // fprintf( stderr, "Cannot open initialize webcam!\n" );
            return 1;
        }
    
        /* create a window for the video */
        cvNamedWindow( "result", CV_WINDOW_AUTOSIZE );
    
        while( key != 'q' ) {
            /* get a frame */
            frame = cvQueryFrame( capture );
    
            /* always check */
            if( !frame ) break;
    
            /* display current frame */
            cvShowImage( "result", frame );
    
            /* exit if user press 'q' */
            key = cvWaitKey( 1 );
        }
    
        /* free memory */
        cvDestroyWindow( "result" );
        cvReleaseCapture( &capture );
    
        return 0;
    }
    

    lowbyte



  • lowbyte_ schrieb:

    Hi

    Habs grad getestet da ich auch an einem Project arbeite mit opencv.

    So sollte es funktionieren.

    Einzubindende lib's(obwohl einige davon nicht gebraucht werden) für dies kleine Program.

    cv210.lib
    cv210d.lib
    cvaux210.lib
    cvaux210d.lib
    cxcore210.lib
    cxcore210d.lib
    cxts210.lib
    highgui210.lib
    highgui210d.lib
    ml210.lib
    ml210d.lib
    opencv_ffmpeg210.lib
    opencv_ffmpeg210d.lib
    
    #include <stdlib.h>
    #include <windows.h>
    #include "cv.h"
    #include "highgui.h"
    
    DWORD WINAPI webcam();
    
    void main()
    {
    
    	DWORD ThreadID;
    
    	CreateThread(NULL ,0 ,webcam ,(LPVOID)0 ,0 ,&ThreadID);
    
    	printf("test\n");
    	getchar();
    
    	return 0;
    }
    
    DWORD WINAPI webcam()
    {
        CvCapture *capture = 0;
        IplImage  *frame = 0;
        int       key = 0;
     
        /* initialize camera */
        capture = cvCaptureFromCAM( 0 );
     
        /* always check */
        if ( !capture ) {
           // fprintf( stderr, "Cannot open initialize webcam!\n" );
            return 1;
        }
     
        /* create a window for the video */
        cvNamedWindow( "result", CV_WINDOW_AUTOSIZE );
     
        while( key != 'q' ) {
            /* get a frame */
            frame = cvQueryFrame( capture );
     
            /* always check */
            if( !frame ) break;
           
            /* display current frame */
            cvShowImage( "result", frame );
     
            /* exit if user press 'q' */
            key = cvWaitKey( 1 );
        }
     
        /* free memory */
        cvDestroyWindow( "result" );
        cvReleaseCapture( &capture );
     
        return 0;
    }
    

    lowbyte

    Habs getestet. Tritt leider wieder dasselbe Problem auf.



  • Hi

    Was hast du für ein OS,Compiler.etc ?

    lowbyte



  • Hi

    Und was für eine Webcam ?

    Sollte mich mal anmelden :p



  • Ja mach das 🙂
    Ich hab Windows 7, VC++ 2010 und nen Sony Vaio Laptop mit integrierter WebCam. Als eigenes Programm läuft es ja problemlos, bloß wenn man es als Thread startet, nicht.



  • Hat keiner eine Idee?



  • Hi

    Was hast du den für ein Rückgabewert bei ..

    frame = cvQueryFrame( capture );
    

    zum Zeitpunkt in dem das Bild schwarz ist ?
    Ansonnsten solltest du einfach mal debuggen.

    Edit: Probiere mal ob du mit setzen einer expliziten Resolution weiter kommst.

    DWORD WINAPI webcam()
    {
        CvCapture *capture = 0;
        IplImage  *frame = 0;
        int       key = 0;
    
        /* initialize camera */
        capture = cvCaptureFromCAM( 0 );
    
        /* always check */
        if ( !capture ) {
           // fprintf( stderr, "Cannot open initialize webcam!\n" );
            return 1;
        }
    
        cvSetCaptureProperty(capture ,CV_CAP_PROP_FRAME_WIDTH , 640);
        cvSetCaptureProperty(capture ,CV_CAP_PROP_FRAME_HEIGHT , 480);
        cvSetCaptureProperty(capture ,CV_CAP_PROP_FPS , 25);
    
        /* create a window for the video */
        cvNamedWindow( "result", CV_WINDOW_AUTOSIZE );
    
        ...
        ...
        ...
    

    lowbyte



  • Hi

    Eine andere Sache ist das du bei :

    /* initialize camera */
    capture = cvCaptureFromCAM( 0 );
    
    /* always check */
    if ( !capture ) {
        fprintf( stderr, "Cannot open initialize webcam!\n" );
        return 1;
    }
    
    /// Warten bis kamera initialisiert ist !!!!!
    Sleep(3000);
    

    Auf die Kamera warten musst bis sie ganz initialisiert ist !
    Ich hab das immer mit einer Sleep() anweisung gemacht, dabei warte ich 2 Sekunden oder mehr.

    Wen du es genau wissen willst kannst du es auch in einer Schleife machen, indem du :

    cvQueryFrame(capture) != NULL
    

    auf ungleich NULL prüfst bis sie Initialisiert ist.

    lowbyte



  • Habe alles probiert, ohne Erfolg. Hast du es denn mal versucht als Thread zu implementieren? Es wird so nicht gehen...



  • Hi

    Ja das hab ich und es funktioniert !

    Was gibt bei dir den cvQueryFrame() zurück in dem Zeitpunkt in dem das Fenster schwarz ist ?

    Hasst du schon mal debugging betriben ?

    So sollte es ohne Probleme funktionieren. Bei mir läufts so einwanfrei.

    #include <stdlib.h>
    #include <windows.h>
    #include "cv.h"
    #include "highgui.h"
    
    DWORD WINAPI webcam();
    
    void main()
    {
    
        DWORD ThreadID;
    
        CreateThread(NULL ,0 ,webcam ,(LPVOID)0 ,0 ,&ThreadID);
    
        printf("test\n");
        getchar();
    
        return 0;
    }
    
    DWORD WINAPI webcam()
    {
        CvCapture *capture = 0;
        IplImage  *frame = 0;
        int       key = 0;
    
        /* initialize camera */
        capture = cvCaptureFromCAM( 0 );
    
        /* always check */
        if ( !capture ) {
           // fprintf( stderr, "Cannot open initialize webcam!\n" );
            return 1;
        }
    
        /* create a window for the video */
        cvNamedWindow( "result", CV_WINDOW_AUTOSIZE );
    
        while( key != 'q' ) {
            /* get a frame */
            frame = cvQueryFrame( capture );
    
            /* always check */
            if( !frame ) break;
    
            /* display current frame */
            cvShowImage( "result", frame );
    
            /* exit if user press 'q' */
            key = cvWaitKey( 1 );
        }
    
        /* free memory */
        cvDestroyWindow( "result" );
        cvReleaseCapture( &capture );
    
        return 0;
    }
    

    lowbyte



  • lowbyte_ schrieb:

    Hi

    Ja das hab ich und es funktioniert !

    Was gibt bei dir den cvQueryFrame() zurück in dem Zeitpunkt in dem das Fenster schwarz ist ?

    Hasst du schon mal debugging betriben ?

    So sollte es ohne Probleme funktionieren. Bei mir läufts so einwanfrei.

    #include <stdlib.h>
    #include <windows.h>
    #include "cv.h"
    #include "highgui.h"
    
    DWORD WINAPI webcam();
    
    void main()
    {
    
        DWORD ThreadID;
    
        CreateThread(NULL ,0 ,webcam ,(LPVOID)0 ,0 ,&ThreadID);
    
        printf("test\n");
        getchar();
    
        return 0;
    }
    
    DWORD WINAPI webcam()
    {
        CvCapture *capture = 0;
        IplImage  *frame = 0;
        int       key = 0;
     
        /* initialize camera */
        capture = cvCaptureFromCAM( 0 );
     
        /* always check */
        if ( !capture ) {
           // fprintf( stderr, "Cannot open initialize webcam!\n" );
            return 1;
        }
     
        /* create a window for the video */
        cvNamedWindow( "result", CV_WINDOW_AUTOSIZE );
     
        while( key != 'q' ) {
            /* get a frame */
            frame = cvQueryFrame( capture );
     
            /* always check */
            if( !frame ) break;
           
            /* display current frame */
            cvShowImage( "result", frame );
     
            /* exit if user press 'q' */
            key = cvWaitKey( 1 );
        }
     
        /* free memory */
        cvDestroyWindow( "result" );
        cvReleaseCapture( &capture );
     
        return 0;
    }
    

    lowbyte

    cvQueryFrame() gibt einen Wert ungleich NULL zurück. Es kann also nicht daran liegen. Mir fiel übrigens auch auf, dass wenn ich es als eigenes Konsolenprogramm laufen lasse und auf schließen gehe, das Fenster mit einer Verzögerung geschlossen wird. Es scheint so, als würde bei einem Thread nicht alles vernünftig geladen, denn als eigenes Programm läuft es ja.



  • Woran kann das denn liegen....?

    Ist doch total verrückt.



  • Hi

    Leider kann ich dir auch nicht mehr weiter helfen. Weis nicht woran es noch liegen könnte. Ich habs unter VmWare-Server mit Winxp sp3 & Vista sp & Linux-Debian mit GCC getestet.

    Ist ein bisschen merkwürdig !

    lowbyte



  • lowbyte_ schrieb:

    Hi

    Leider kann ich dir auch nicht mehr weiter helfen. Weis nicht woran es noch liegen könnte. Ich habs unter VmWare-Server mit Winxp sp3 & Vista sp & Linux-Debian mit GCC getestet.

    Ist ein bisschen merkwürdig !

    lowbyte

    Hat niemand sonst Vorschläge?? Das glaube ich nun wirklich nicht.


Anmelden zum Antworten