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) != NULLauf 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.