webcam-aufnahme läuft nicht richtig
-
Also ich hab meine webcam wiedergefunden und gleich mal etwas rumgespielt.
ich schrieb mir also eine Klasse cCam. Diese scheint zwar zu funktionieren:void cCam::createCam (void) { /* Kamerafenster erstellen */ this->cam = capCreateCaptureWindow ( "", WS_CHILD| WS_VISIBLE, 0, 0, 320, 240, this->hWnd, 0); capDriverConnect(this->cam, 0); capSetCallbackOnFrame(this->cam, cCam::getImageData); bmih.biSize = sizeof(BITMAPINFOHEADER); capGetVideoFormat(this->cam, &this->bmih, capGetVideoFormatSize(cam)); imgsize = bmih.biSizeImage; this->lpdata = new unsigned char[imgsize]; SetWindowLong(this->cam, GWL_USERDATA, (long ) this); } /* converting image Data */ LRESULT CALLBACK cCam::getImageData(HWND hWnd, LPVIDEOHDR lpvhdr) { cCam *This = (cCam *) GetWindowLong(hWnd, GWL_USERDATA); CopyMemory ( This->lpdata, lpvhdr->lpData, lpvhdr->dwBufferLength); return true; } cMyImage *cCam::grabImage() { capGrabFrame (this->cam); return new cMyImage( this->bmih, IMG_GBR, this->lpdata ); }sind die 3 grundlegenden Methoden der Klasse. Durch das WS_VISIBLE im CreateCaptureWindow kann man erkennen, dass die Webcam aufnimmt. (Man sieht nen Bild)
Das Erstellen des cMyImage scheint eher probleme zu machen.cMyImage::cMyImage (BITMAPINFOHEADER bm, int f, unsigned char *lpd) { bmih = bm; format = f; /* Speicher auf bild legen */ imgsize = this->bmih.biSizeImage; lpdata = new unsigned char [imgsize]; CopyMemory ((LPVOID) lpdata, (LPVOID) lpd, imgsize); switch (format) { /* Indize für das jeweilige Datenformat beschreiben */ case IMG_RGB: indexR = 0; indexB = 1; indexG = 2; break; case IMG_GBR: indexR = 2; indexB = 1; indexG = 0; break; } }funktioniert an sich zwar, aber ich bekomme nur ein schwarzes Bild, wenn ich
void cMyImage::blit (HDC hDC, int x, int y) { HDC iDC = CreateCompatibleDC(hDC); HBITMAP DIBSec = CreateDIBSection( iDC, (BITMAPINFO *) &bmih, DIB_RGB_COLORS, (void**)&this->lpdata, NULL, 0 ); SelectObject(iDC, DIBSec); BitBlt(hDC, x, y, this->bmih.biWidth, this->bmih.biHeight, iDC, 0, 0, SRCCOPY ); DeleteObject(DIBSec); DeleteDC(iDC); }aufrufe. Ändere ich im blit ein Pixel, so kann man es im Bild sehen.
Hat jemand ne Ahnung, woran das liegt?
-
Wenn ich's recht bedenke, könnte dies eher ein WinAPI-Problem sein und keins aus der Grafikprogrammierung?!?
Wäre nett, wenn's evaluiert und verschoben, oder gar beantwortet würde..
-
DocJunioR schrieb:
funktioniert an sich zwar, aber ich bekomme nur ein schwarzes Bild, wenn ich
Wirklich komplett schwarz? Oder die 16;0;16 Farbe, die alle Videoplayer anzeigen. Das ist IMHO der Grund.
Bye, TGGC (Das Jahr des Helden)
-
Stichwort Overlays, oder?!

-
bitte langsam zum Mitschreibne. Muss mir heute Notizen mit nach hause nehmen, da mein DSL-Modem abgeraucht ist.. (nach nur 4 Jahren einfach tot)
Ich blitte mein Bild, welches ich über die Methode getImageData() bekomme auf nen Fenster.
Nach TGGC's Auffassung müsste also schon hier etwas anderes in meinen Bildspeicher geschrieben werden als die Webcam selbst mit ihrem Capture-Frame darstellt? Aaaber warum?hab noch ein wenig nachgegoogled und dies hier ist das einzige was mir dazu auffiel:
eine Seite zu Delphi
Overlay
Hier wird der Bereich, auf dem sich das Live-Bild befinden soll, mit einer bestimmten Schlüsselfarbe, meist lila (Delphi: clFuchsia), belegt. Die Daten werden direkt in den Bildwiederholspeicher, jedoch in einen freien Bereich geschrieben. Bei der Ausgabe ersetzt der Grafikchip die Farbe mit dem Einzelbild. Das Aufnahmeformat muß nicht zwingend dem Format der Grafikkarte entsprechen.Vorteil ist der sehr ruhige Bildaufbau, Menüs sind sofort zu sehen. Es gibt jedoch auch einen 'Nachteil'. Wird das Videofenster ganz oder teilweise von einem anderen Fenster überdeckt, und in diesem Fenster die Schlüsselfarbe verwendet, dann wird an dieser Stelle ebenfalls das Live-Bild dargestellt.
Soo, wenn ich mir jetzt "a Dampmaschin" erklären lassen sollte und mich mal janz dumm stellen müsste, würde ich jetzt mal fragen, ob ich mein Darstellungsfenster jetzt Pink-Carmouflage streichen soll..
Allerdings ist auch dieses Blödsinn, da ich ja zum Blitten die WinAPI nutze und nicht die vfw.PS: es kommt mir schwarz vor. Bisher bin ich nicht so richtig dazu gekommen, mir mal den Dump vom Bilde zu machen.. (wäre aber mal ne Idee, nen saveBitmap in die Image-Klasse zu bauen)
-
DocJunioR schrieb:
bitte langsam zum Mitschreibne. Muss mir heute Notizen mit nach hause nehmen, da mein DSL-Modem abgeraucht ist.. (nach nur 4 Jahren einfach tot)
Zufällig dieser uralte schwere Telekom-Siemens-Kasten?! Du kannst es noch min. 1 Jahr länger am Leben erhalten: http://dslmodem.tk

-
DocJunioR schrieb:
Nach TGGC's Auffassung müsste also schon hier etwas anderes in meinen Bildspeicher geschrieben werden als die Webcam selbst mit ihrem Capture-Frame darstellt? Aaaber warum?
Wegen der Darstellungsgeschwindigkeit. Macht jeder Videoplayer so.
Bye, TGGC (Das Jahr des Helden)
-
ja naja, momentchen mal..
also ich benutze eine Funktion, die die WinAPI mir zur Verfügung stellt um meine Bilddaten aus einer Webcam abrufen zu können. Daß diese Funktion mir dann nen schwarzes Bild ausgibt (oder eben Fuchsia) kann ich nicht glauben..
-
such mal nach capSetVideoFormat, vielleicht hilft dir das was....
/EDIT: wohl eher nicht, aber das hier könnte was bringen: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_capoverlay.asp
-
Ich hatte schonmal was ähnliches programmiert und da gings.
Das Problem ist scheinbar der Datentransfer zwischen den Klassen..