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
Ein kleiner Beispiel Code.
Ungetestetint 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.