PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : VideoCapture Macros : Warum kommt nur Müll raus ?


DanDanger
06.04.2004, 21:51
Hallo,

ich möchte die VideoCapture-API (Macros) von Microsoft benutzen,
um meine WebCam zu Interfacen. Das klappt auch alles soweit ganz gut,
aber wenn ich nun die Bilddaten als ROHE Daten (also ohne Bitmap-Header, etc, NUR die RGB-Werte) in eine Datei schreiben lasse,
kommt nur Müll dabei heraus :
hier mal mein Code :


(... Initialisierung & Co, alles OK soweit ...)
CAPSTATUS *Status ;
BITMAPINFO *pInfo ;
DWORD Size ;

Size = capGetVideoFormat(CaptureWindow, pInfo, Size) ;


fstream ofs ( "test.raw", ios::out | ios::binary );

CString bString ;
bString.Format("Breite : %i, Hoehe : %i, BPP : %i", pInfo->bmiHeader.biWidth, pInfo->bmiHeader.biHeight, pInfo->bmiHeader.biBitCount) ;
MessageBox(bString, "Image Info", MB_OK) ;
for(unsigned int i = 0; i < (pInfo->bmiHeader.biWidth * pInfo->bmiHeader.biHeight * pInfo->bmiHeader.biBitCount); i++)
{
//ofs.write("HAllo", 5) ;
ofs.write((const char *)&(pInfo->bmiColors[i].rgbRed), 3) ;
ofs.write((const char *)&(pInfo->bmiColors[i].rgbGreen), 3) ;
ofs.write((const char *)&(pInfo->bmiColors[i].rgbBlue), 3) ;
}
//ofs.write("ENDE", 4) ;
ofs.close() ;

capDriverDisconnect(CaptureWindow) ;


Was mache ich falsch ??

Neugierige Grüsse
DanDanger


Felix Kaiser
07.04.2004, 05:59
Warum schreibst du nur die Farbtabelle in die Datei? Mit welchem Format arbeitest du? Ich arbeite in dem DCC Modul für meinen IRC Client um die WebCam anzusteuern mit 160x120 bei bevorzugt 24bit, ansonsten 32bit. Wenn er mit 32bit arbeiten muss, konvertiert er das Bitmap dann auf 24bit Basis und lässt das als JPEG komprimiert durch das Netz sausen. Dabei verwende ich ganz normal die Bitmapinformationen die meiner Callback Funktion übergeben werden, bzw. eben dann die Rohdaten.

DanDanger
07.04.2004, 15:30
Hi,
erstmal, Danke für die Schnelle Antwort.

Mein Problem ist, das ich mein Programm (ein Bildanalyse-Programm) unter Linux geschrieben habe, und nun auf Windows Portiere.
Daher habe ich von der WinAPI und den Capture-Macros nur rudimentäre Ahnung.

Irgendwie kapier' ich nicht, worauf du mit der Farbpallette Hinauswillst :confused:
Ich dachte, im "pInfo->bmiColors[i]" - Struct sind die RGB-Werte des aktuellen Frames gespeichert.... ?

Ich möchte eigentlich "nur" auf die RGB - Farbwerte des aktuellen Camera-Frames Zugreifen. Die Camera hat dabei eine Auflösung von 320x240 Pixeln, 24-Bit Farbtiefe und überträgt die Daten im YUV420P - Format.

Ich kann immerhin schon ein Capture-Window erstellen, indem die Frames angezeigt wrden. Jetzt brauche ich nur noch Zugriff auf die RGB-Werte.
Wäre nett, wenn Ihr mir da mal helfen könntet....

Neugierige Grüsse
DanDanger

Felix Kaiser
08.04.2004, 12:56
Dann hast du das erstmal schön falsch verstanden. :-)
Du hast dort nur die Farbpalette, die bei Bitmaps mit niedriger Auflösung Indizes mit RGB Farben verknüpft, so Schwarz/Weiß Bitmaps und Bitmaps mit 16 oder 256 Farben. Hast dann entsprechend nur 2, 16 oder 256 Einträge in der Palette. Bei Echtfarben gibt es keine Palette, weil du direkte RGB Farbwerte hast. Die Pixeldaten hast du dann in dem Speicherblock drin, auf den die Eigenschaft lpData zeigt.

DanDanger
09.04.2004, 13:50
Hi,

Danke, dein Posting hat mich schon ein ganzes Stück weitergebracht.
Einige Fragen hab' ich trotzdem noch :) :

Mein Initialisierungscode sieht z.Zeit so aus :

CaptureWindow = capCreateCaptureWindow("CaptureWindow", WS_CHILD | WS_VISIBLE, 0, 0,
INIT_CAPWIN_SIZE_WIDTH,
INIT_CAPWIN_SIZE_HEIGHT,
hWnd, CAP_WIN_IDENTIFIER) ;

if(CaptureWindow == NULL)
{
MessageBox(p_hWnd, "Cant Init Capture Window", "ERROR", MB_ICONERROR) ;
return false ;
}

if(!capDriverConnect(CaptureWindow, VideoDeviceNr))
{
MessageBox(p_hWnd, "Cant Connect Video-Driver", "ERROR", MB_ICONERROR) ;
return false ;
}

/*
if(!capSetCallbackOnFrame(p_hWnd, OnNewFrame))
{
MessageBox(*p_hWnd, "Cant Set Callback-Function", "ERROR", MB_ICONERROR) ;
return false ;
}


Leider gibt mir mir die capSetCallbackOnFame() - Funktion immer ein FALSE zurück :confused: ?? Warum ??
Muss ich da zuerst Preview auf FALSE setzen ???

Meine Callback - Funktion sieht Übrigend so aus :

LRESULT PASCAL OnNewFrame(HWND hWnd, LPVIDEOHDR lpVHdr)
{
(...)
return 0 ;
}


Was mich gleich zur 2. Frage bringt : Wie komme ich nun an die
rohen RGB-PixelDaten ???
Liege ich mit Folgender Annahme richtig ?:
lpVHdr->lpData[0] ==> R Wert von Pixel 1
lpVHdr->lpData[1] ==> G Wert von Pixel 1
lpVHdr->lpData[2] ==> B Wert von Pixel 1
lpVHdr->lpData[3] ==> R Wert von Pixel 2
lpVHdr->lpData[4] ==> G Wert von Pixel 2
lpVHdr->lpData[5] ==> B Wert von Pixel 2
( ... usw ... )

3. Frage :
Ist es Möglich, über die Capture-Macros mehr als eine Camera GLEICHZEITIG
anzusprechen ???


Neugierige Grüsse
DanDanger

Felix Kaiser
09.04.2004, 17:14
1.) Ich arbeite nicht mit den Makros, ich arbeite direkt mit SendMessage. Vielleicht noch ein capSetVideoformat einschieben, mehr mache ich eigentlich auch nicht.

2.) Ja, genau so.

3.) Keine Ahnung, ich habe nur eine Cam. :-)
Sollte aber theoretisch kein Problem sein.

DanDanger
10.04.2004, 15:43
DANKE :-)

Jetzt funzt alles, wie es soll (War ja gar nicht sooo Kompliziert, wie ich zuerst befürchtet hatte) :-))

Gruss
DanDanger