Webcam Aufnahme



  • Hallo,

    ich möchte ein Programm zum Aufnehmen von Bildern (oder Video) von einer USB-Webcam schreiben. Ich habe mir deswegen VfW angesehen, doch benötigt man dabei ja anscheinend ein Video Fenster, was man mit capCreateCaptureWindow() erstellen muss. Ich würde gerne ein Bild(oder gleich Video) von der Webcam aufnehmen, ohne irgendein Fenster erstellen zu müssen (d.h. einfach nur eine Konsolenanwendung).

    Geht das mit VfW? Wenn ja wie? Wenn nein, was muss ich verwenden, um mein Vorhaben umzusetzen?

    Vielen Dank für die Hilfe

    Betriebssystem ist Vista.



  • Hi

    Mir gefällt da opencv sehr gut.

    http://opencv.willowgarage.com/wiki/

    C++ / C / Python

    lowbyte



  • Hi

    Ein kleiner Beispiel Code.
    Ungetestet

    int main()
    {
    
    	CvCapture *capture = NULL;
    	IplImage *frame = NULL;
    	CvVideoWriter *writer = NULL;
    	long len=0 ,i;
    	int id=0;
    
    	// Init Cam
        	capture = cvCaptureFromCAM(id);
        	if( !capture ) {
            	fprintf(stderr,"Could not initialize capturing...\n");
            	return 1;
        	}
    
    	// Wait until the camera is initialized
    	Sleep(4000);
    
    	cvNamedWindow("window", 0);
    
    	cvSetCaptureProperty(capture ,CV_CAP_PROP_FRAME_WIDTH , w);
    	cvSetCaptureProperty(capture ,CV_CAP_PROP_FRAME_HEIGHT , h);
    	cvSetCaptureProperty(capture ,CV_CAP_PROP_FPS , f);
    
       	 printf("ESC - quit the program\n");
    
    	// CV_FOURCC('D', 'I', 'V', 'X') = MPEG 4 codec
    	// Create video write struct
    	writer = cvCreateVideoWriter("video.avi", CV_FOURCC('D', 'I', 'V', 'X'), 25, cvSize(640,480)  , 1);
    	if(writer==0) {
    		printf("VideoWriter failed\n");
    	}
    
        	for(i=0;i<len;i++) {
    
    		// Capture frame
    		frame = cvQueryFrame(capture);
    
    		if(frame != NULL) {
    
    			// Write frame
    			if(! cvWriteFrame(writer ,frame) ) {
    				printf("write failed");
    			}
    
    			cvShowImage(windown ,frame);
    			}
    
    		} else {
    			printf("QueryFrame failed !");
    		}
    
    		cvWaitKey(10);
    
        }
    
    	cvReleaseVideoWriter(&writer);
    	cvReleaseCapture(&capture);
    	cvDestroyWindow("window");
    
    	return 0;
    
    }
    

    lowbyte



  • Hi

    Funktioniert nicht ganz.
    In der for(;;) schleife musst du der Variable 'len' die Anzahl benötigter Bilder angeben.
    Ansonnsten sollte es so funktionieren.

    lowbyte



  • hi

    Sorry der Code ist ein bisschen gefrickelt... Üble Formatierung.etc..
    Schreibe da von meinem e72..
    Schöner Code kann ich morgen präsentieren sofern gewünscht.

    ps: opencv ist eine sehr mächtige lib, die auch object dedection etc. Mit sich bringt.... Kann diese library nur empfehlen.

    Lowbyte



  • Unter Windows ist die kürzeste und kompatibelste Schnittstelle DirectShow.

    Hier ein Fragment zum prinzipiellen Aufbau eines "SampleGrabbers".

    Beispiele sind auch im Windows SDK unter

    ...\Samples\Multimedia\DirectShow\Capture

    zu finden - sowie in der OnlineHilfe.

    // COM-Schnittstelle fuer Direct-X vorbereiten
    hr = CoInitialize(NULL);
    
    CoCreateInstance(CLSID_CaptureGraphBuilder2,NULL,CLSCTX_INPROC_SERVER,IID_ICaptureGraphBuilder2, (void **)&pBuilder);
    
    //ICreateDevEnum* pDevEnum = NULL;
    //CoCreateInstance(CLSID_SystemDeviceEnum,NULL,CLSCTX_INPROC_SERVER,IID_ICreateDevEnum,(void **)&pDevEnum);
    //IEnumMoniker* pClassEnum = NULL;
    //hr=pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pClassEnum,0);
    	pDevEnum->Release();
    
    hr=pMoniker->BindToObject(0,0,IID_IBaseFilter,(void **)&pVCap);
    
    //---MakeGraph-----------------------------------------------
    CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,(void **)&pFg);
    
    pBuilder -> SetFiltergraph(pFg);
    wsz.Format(_T("VideoCapture_%1d"), i);
    hr = pFg->AddFilter(pVCap, wsz.GetString() ); //hr = pFg->AddFilter(pVCap[i],_T("VideoCapture"));
    
    CoCreateInstance(CLSID_SampleGrabber,NULL,CLSCTX_INPROC_SERVER,IID_IBaseFilter,(void **)&pF);
    
    ...
    


  • baron schrieb:

    Ich habe mir deswegen VfW angesehen, doch benötigt man dabei ja anscheinend ein Video Fenster, was man mit capCreateCaptureWindow() erstellen muss.

    Natürlich geht es auch ohne Fenster, aber das ganze ist schon arg alt.

    Video for Windows ist seit einiger Zeit bereits tot. Einige Webcams lassen sich mit den wichtigsten Funktionen vermutlich noch damit nutzen - andere haben den Support endgültig eingestellt. Zusätzlich benötigt eine VFW-Applikation Adminrechte.

    Besser man lässt die Finger davon und verwendet DirectShow - oder eine Biliothek die das ganze nett verpackt.


Anmelden zum Antworten