Einzelnen Beitrag anzeigen

BoolString

Registriert seit: 2. Feb 2009
Ort: Varel
70 Beiträge
 
RAD-Studio 2009 Pro
 
#15

AW: Ansprechen einer GigE Kamera (Prosilica GC2450C)

  Alt 19. Jul 2012, 09:40
Ich habe spaßeshalber mal eine andere Kamera angeschlossen (Prosilica GE2040 monochrom) und dabei ist mir etwas aufgefallen. Wenn das Bildformat der Kamera auf Mono8 gestellt ist, dann erhalte ich plötzlich auch Daten im FrameBuffer (nach PvCaptureWaitForFrameDone), der bisher immer nur mit 0 gefüllt blieb.
Stelle ich die Farbkamera (GC2450C) mit dem Prosilica Herstellertool von Bayer8 ebenfalls auf 8bit monochrom (Mono8) um, dann bekomme ich auch hier plötzlich Daten in meinen Buffer geschrieben (zumindest unterscheiden sich nach jetzigem Erkenntnisstand die Werte von 0). Das kann es zwar auf Dauer nicht sein, ich möchte ja auch gerne die Farben, aber es ist wenigstens mal wieder ein kleiner Fortschritt.
Bei beiden Varianten habe ich aber immer wieder den Fall, daß einige Frames ausfallen mit der Fehlermeldung, daß einige Daten fehlen (Error Code 16).


Ich habe mir inzwischen aus dem MSDN Informationen zusammengesucht um aus einem Speicherbereich ein Bitmap zu erzeugen, welches ich erst einmal auf dem Bildschirm mit einer TImage Komponente darstellen wollte. Für Stream und Dateien gibt es ja genug Beispiele. Für diesen Fall sind die Samples aber eer schmal gestreut und erschienen nicht anwendbar/funktional.
Derzeit scheinen die Bilddaten allerdings trotzdem irgenwo hängen zu bleiben. Auch ist noch nicht klar, wie die Palette des Bildes korrekt auszuformulieren ist. Ich versuche derzeit (bislang ja nur Graustufen) eine Palette manuell einzubauen. Werden bmiColors einfach ignoriert, wenn entsprechende RGB Werte vorliegen? Dies muss ja sicherlich anders im Header deklariert werden.
Oder gibt es hier evtl. noch andere Faktoren die ich bislang nicht gefunden habe?

Delphi-Quellcode:
Var aFrame : tPvFrame;
    aFrameBuffer : Array of Byte;
    aBitMap : tBitmap;
    aErrValue : tPvErr;
    aString : PAnsiChar;
    aValue : Cardinal;
    bmpInfo : ^BITMAPINFO;
    totalbytes : Cardinal;
    aChar : Char;
    dc : HDC;
    hBmp : HBITMAP;
    cp : PRGBQUAD;
    j : Cardinal;

            GetMem(bmpInfo, sizeof(bmpInfo.bmiHeader) + sizeof(RGBQUAD) * Trunc(Power (2, aFrame.BitDepth)));

            bmpInfo^.bmiHeader.biSize := SizeOf (bmpInfo.bmiHeader);
            bmpInfo^.bmiHeader.biWidth := aFrame.Width;
            bmpInfo^.bmiHeader.biHeight := aFrame.Height;
            bmpInfo^.bmiHeader.biPlanes := 1;
            bmpInfo^.bmiHeader.biBitCount := aFrame.BitDepth;
            bmpInfo^.bmiHeader.biCompression := BI_RGB;
            bmpInfo^.bmiHeader.biSizeImage := 0;
            bmpInfo^.bmiHeader.biXPelsPerMeter := 0;
            bmpInfo^.bmiHeader.biYPelsPerMeter := 0;
            bmpInfo^.bmiHeader.biClrUsed := 0;
            bmpInfo^.bmiHeader.biClrImportant := 0;
            for j := 0 to Trunc (Power (2, aFrame.BitDepth)) - 1 do
            begin
              bmpInfo^.bmiColors[j].rgbBlue := j;
              bmpInfo^.bmiColors[j].rgbGreen := j;
              bmpInfo^.bmiColors[j].rgbRed := j;
              bmpInfo^.bmiColors[j].rgbReserved := 0;
            end;



            dc := CreateDC('DISPLAY', nil, nil, nil);
            hBmp := CreateDIBSection(dc, bmpInfo^, DIB_RGB_COLORS, aFrame.ImageBuffer, 0, 0);
// hBmp := CreateDIBitmap(dc, bmpInfo^, DIB_RGB_COLORS, aFrame.ImageBuffer, 0, 0);
            DeleteDC(dc);
            FreeMem(bmpInfo, sizeof(bmpInfo.bmiHeader) + sizeof(RGBQUAD) * Trunc(Power (2, aFrame.BitDepth)));

            aBitmap := TBitmap.Create;
            aBitmap.Handle := hBmp;

            Image1.Picture.Bitmap := aBitmap;

Ganz herzlichen Dank an alle, die Hilfe beigesteuert haben

Jan
  Mit Zitat antworten Zitat