Ich glaub ich mach an dieser Stelle mal einen Reset. Es sind in meinen letzten Beiträgen ein wenig zu viele Punkte parallel angesprochen gewesen. Deshalb jetzt mal die Konzentration auf die derzeit kritischsten Probleme; zumindest so wie sie mir erscheinen:
1.) Der gleiche, vorher gepostete Code funktioniert derzeit für eine ältere, rein monochrome Kamera (Prosilica GE2040). Ich versuche dabei das Bild über
PvCaptureWaitForFrameDone aufzunehmen. Eine Callback-Funktion habe ich derzeit noch nicht implemetiert. Für die alte Kamera klappt dies und der Datenrecord weist die korrekte Anzahl an Bytes aus. Mit der Farbkamera (Prosilica GC2450C) funktioniert dies nicht. Es kommt immer die Rückmeldung, daß Daten fehlen. Hier habe ich auch mit anderen Aufnahmemodi und Veränderungen der TimeOuts keine Erfolge erzielt. Ich vermute inzwischen fast, daß diese die Farbkamera noch andere Parameter gesetzt benötigt. Kann dies sein; und wenn ja welche?
2.) Mit der (leider geborgten und demnächst rückgabefälligen) Monochrom-Kamera (GE2040) bekomme ich ja tatsächlich ein Bild. Allerdings bin ich hier nicht in der Lage ein DIB zu erstellen. Alle Versuche führen derzeit zu einer einfarbigen Fläche. Natürlich kann ich mit:
Delphi-Quellcode:
aBitmap := TBitmap.Create;
aBitmap.PixelFormat := pf8Bit;
aBitmap.Height := aFrame.Height;
aBitmap.Width := aFrame.Width;
For y := 0 to aFrame.Height - 1 do
Begin
// lPixel := aBitmap.Scanline[y];
For x := 0 to aFrame.Width - 1 do
Begin
idx := aFrameBuffer [y*aFrame.Width + x];
aBitmap.Canvas.Pixels[x, y] := idx + idx shl 8 + idx Shl 16;
end;
end;
die Daten in ein Bitmap kopieren. Allerdings ist dies relativ langsam (auch mit Scanline) und ich vermute, es hat durchaus seine Berechtigung, daß in den meisten Fällen auf HBITMAP und CreateDIB/StretchDIB verwiesen wird. Als Langzeitziel würde ich (zur Überprüfung einer Idee) gerne auf 5-6 Bilder die Sekunde kommen.
Ich scheine derzeit aber aus den mir vorliegenden Informationen persönlich nicht in der Lage zu sein, eine vernünftige Bitmap hinzubekommen. Mir erscheint es so, daß die Daten nicht richtig zusammengesammelt werden. Das Ergebnis ist immer eine einfarbige Fläche.
3.) Als Fortführung: Gibt es eine allgemeine Form, wie man mit dem Hintergrundwissen (Mono8, Bayer8, Bayer16, ...; BayerPattern; Bytes pro Frame) eine universelle Routine gestaltet, die ein darstellbares/speicherfähiges Bild erzeugt? Ich habe diesbezüglich schon viel ergoogelt, allerdings persönlich noch keine Implementation geschafft, die aus einem Pointer auf ein Array of Byte eine funktionale Lösung erzeugt (wobei die Daten dann ja noch abhängig vom Pixel-Format sein können.
Ich werde am Wochenende versuchen der Funktion
PvCaptureQueueFrame eine Callback-Funktion zu verpassen. Laut
SDK-Dokumentation würde diese Funktion dann in einem eigenen Thread ausgeführt, NACHDEM das Bild fertig aquiriert ist. Damit würde dann die bisher eingesetzte Funktion
PvCaptureWaitForFrameDone obsolet werden. Vielleicht liegt hier auch ein Teil der Problematik.
Bis dahin würde ich es großartig finden, wenn mir jemand ein wenig auf die Sprünge helfen könnte...
Wie gesagt, ich würde die Routinen (wenn sie funktionieren) auch durchaus zur Verfügung stellen. Wenn man die Suchmaschinen bemüht stellt man schnell fest, daß es mehr Leute gibt die diese (durchaus guten) Kameras unter Delphi zum Laufen bekommen wollen...
Liebe Grüße aus dem Norden
Jan