Opencv Webcam-Zugriff funktioniert im Thread nicht, sonst schon.



  • Kann mir jemand erklären, warum dies hier funktioniert:

    /**
         * 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;
        }
    

    Dies aber nicht:

    #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;
    }
    

    ?

    Ich habe doch bloß einen Thread eröffnet
    und möchte exakt denselben Code darin ausführen!



  • Hi

    Wie schon gesagt es sollte normalerweise funktionieren. Weis nicht was bei dir nicht in ordnung ist. Compiler einstellungen 😕 Win7 bug 😕
    Debug das ganze doch mal !
    Hab schon von Problemen gehört mit Win7 und opencv 2.1 ... aber nicht spezifisch von deinem Problem.
    Was noch eine Idee wäre ist... den Treiber der Webcam zu deinstallieren... und einefach alles opencv machen zu lassen.

    lowbyte



  • Also deine Fehlerbeschreibung ist zu dürftig. Wieso geht dies aber das nicht hilft hier keinem bei der Fehlerlösung.
    Da ich deinen andere Thread aber schon gelesen habe, bin ich wenigstens im Bilde, um was es gehen soll.
    Nun eine Vermutung meinerseits:
    Kann es nicht sein, dass der Mainthread, sprich die main-funktion schon fertig ist, bevor dein Webcamthread soweit ist? Kann allerdings sein, dass du dieses Problem mit dem getchar() in main() abfängst.
    Zweite Möglichkeit: Problematik, dass zwei Threads GUI-Operation machen wollen. Kann sein, dass die beiden sich da ins Gehege kommen.
    Was du versuchen könntest wäre alle Ausgaben, sei es ein OpenCV-Fenster oder Konsolenausgaben, nur im mainthread zu machen.

    Ein Versuch wäre es Wert
    Gruß Gate



  • Gate schrieb:

    Also deine Fehlerbeschreibung ist zu dürftig. Wieso geht dies aber das nicht hilft hier keinem bei der Fehlerlösung.
    Da ich deinen andere Thread aber schon gelesen habe, bin ich wenigstens im Bilde, um was es gehen soll.
    Nun eine Vermutung meinerseits:
    Kann es nicht sein, dass der Mainthread, sprich die main-funktion schon fertig ist, bevor dein Webcamthread soweit ist? Kann allerdings sein, dass du dieses Problem mit dem getchar() in main() abfängst.
    Zweite Möglichkeit: Problematik, dass zwei Threads GUI-Operation machen wollen. Kann sein, dass die beiden sich da ins Gehege kommen.
    Was du versuchen könntest wäre alle Ausgaben, sei es ein OpenCV-Fenster oder Konsolenausgaben, nur im mainthread zu machen.

    Ein Versuch wäre es Wert
    Gruß Gate

    Ich habe es direkt als Buttonfunktion eingefügt und es klappt: (HMENU)6. Allerdings kostet das viel Rechenzeit (wohl aufgrund der Schleife). Ich wollte dem mit Sleep(5); entgegenwirken, hat aber nicht genützt, was tun?

    Mich wundert trotzdem aber auch noch, dass es als Thread nicht geht!



  • Statt "CreateThread" schon mal "_beginthread" versucht?



  • Wutz schrieb:

    Statt "CreateThread" schon mal "_beginthread" versucht?

    Ja, gleicher Fehler.



  • Hi

    Der einzige unterschied von mir zu dir ist, dass ich es auf meinem (VM-Server <- irrelevant) auf WinXp Sp3 getestet habe, und dazu VS2008 Pro verwende.

    Hasst du mal probiert den Treiber der Webcam zu de-installieren ?

    lowbyte



  • Hallo zusammen,

    ich habe gerade eine Hiwi-job angefangen und muss einen code opencv schreiben! ich habe leider bis jetzt noch nicht mit opencv gearbeitet und daher ist die Aufgabe einbeshien schwer für mich 😞

    die Aufgabe ist eigentlich so beschrieben. Die Kameras die
    wir im Institut haben sollen ohne extra einen Treiber installieren zu müssen mit OpenCV funktionieren. Dafür muss der generische Treiber (GenAPI) in
    OpenCV integriert werden. Dadurch sind zwar spezifische Funktionen der
    Kamera nicht mehr nutzbar, aber dafür kann diese ohne zusätzliche
    Treiber verwendet werden, wenn der Code in OpenCV aufgenommen wird.

    kann mir jemend villeicht eien beispielcode schreiben oder mir die Aufgabe erklären ich wäre wirklich sehr dankbar! 🙂

    momo



  • Hey Momo,

    probiere doch einfach mal den ersten hier geposteten Code, damit kannst du erst einmal problem eine Webcam ansteuern und dir den Stream anzeigen lassen.

    Die Frage ist schlichtweg was sollen die Kameras können und was nicht.


Log in to reply