Einzelnen Beitrag anzeigen

BoolString

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

AW: Ansprechen einer GigE Kamera (Prosilica GC2450C)

  Alt 17. Jul 2012, 22:48
Update...

ich bin inzwischen so weit, daß ich ein einzelnes Frame (theoretisch) per DLL einfangen kann. Hier scheint im Debug der Timeout ein Problem gewesen zu sein und schlechte Lötstellen von einem nicht spezifiziertes Unterwasser-Kabel. Nachdem ich diese erstmal ausgetauscht habe, habe ich auch keine 'Camera was unplugged' mehr.

Das Kommando PvCaptureWaitForFrameDone liefert nun ein Success zurück. Leider hat der entsprechend zurückgelieferte Frame keine Daten und das Status sagt, daß einige Daten verloren gingen (Error Code 16). Das ist charmant untertrieben, da Image Size 0 besagt. Die anderen Werte (die mir logisch nachvollziehbar erscheinen, wie FrameCount, FrameWidth, und FrameHeight) scheinen korrekt zu sein. Mit der BitDepth von 8 bin ich mir nicht sicher; das ist doch garantiert nicht pro RGB Kanal gemeint? Auch ist mir noch nicht ganz klar, wie ich die Daten aus dem Pointer mit den anderen Infos zu einem korrekten Bitmap zusammenstelle, welches ich dann speichern und darstellen kann.

Ich versuche es in der DLL Anbindung jetzt so:

Delphi-Quellcode:
    Function PvAttrBooleanGet (pCamera: tPvHandle; Name: PAnsiChar; Out pValue: Boolean) : tPvErr; stdcall; external 'PvAPI.dll';
    Function PvAttrBooleanSet (pCamera: tPvHandle; Name: PAnsiChar; pValue: Boolean) : tPvErr; stdcall; external 'PvAPI.dll';
    Function PvAttrEnumGet (pCamera: tPvHandle; Name: PAnsiChar; Out pBuffer : PAnsiChar; BufferSize: Cardinal; Out pSize: Cardinal): tPvErr; stdcall; external 'PvAPI.dll';
    Function PvAttrEnumSet (pCamera: tPvHandle; Name: PAnsiChar; Value: PAnsiChar): tPvErr; stdcall; external 'PvAPI.dll';
//geht noch nicht:// Function PvAttrUint32Get (pCamera: tPvHandle; Name: PAnsiChar; Out pValue: Cardinal) : tPvErr; stdcall; external 'PvAPI.dll';
    Function PvCameraListEx (pList: pPvCameraInfoExList; ListLength : Cardinal; Out ConnectedNum : tConnectedCams; Size : Cardinal) : Cardinal; stdcall; external 'PvAPI.dll';
    Function PvCameraClose (pCamera: tPvHandle) : tPvErr; stdcall; external 'PvAPI.dll';
    Function PvCameraCount : Cardinal; stdcall; external 'PvAPI.dll';
    Function PvCameraOpen (UniqueID: Cardinal; AccessFlag: tPvAccessFlags; Out pCamera: tPvHandle) : tPvErr; stdcall; external 'PvAPI.dll';
    Function PvCaptureEnd (pCamera: tPvHandle) : tPvErr; stdcall; external 'PvAPI.dll';
    Function PvCaptureStart (pCamera: tPvHandle) : tPvErr; stdcall; external 'PvAPI.dll';
    Function PvCaptureQueueFrame (pCamera: tPvHandle; pFrame: pPvFrame; FrameCallBack: Pointer ): tPvErr; stdcall; external 'PvAPI.dll';
    Function PvCaptureWaitForFrameDone (pCamera: tPvHandle; pFrame: pPvFrame; Timeout: Cardinal): tPvErr; stdcall; external 'PvAPI.dll';
    Function PvCommandRun (pCamera: tPvHandle; Name : PAnsiChar): tPvErr; stdcall; external 'PvAPI.dll';
    Function PvInitialize : tPvErr; stdcall; external 'PvAPI.dll';
    Function PvInitializeNoDiscovery : tPvErr; stdcall; external 'PvAPI.dll';
    Procedure PvUnInitialize; stdcall; external 'PvAPI.dll';
    Procedure PvVersion (Var Major, Minor: Cardinal); stdcall; external 'PvAPI.dll';

implementation


Function PvReturnErrorString (aErrCode: tPvErr) : String;
Begin
  Case aErrCode of
     ePvErrSuccess : Result := 'Code 0000: No error';
     ePvErrCameraFault : Result := 'Code 0001: Unexpected camera fault';
     ePvErrInternalFault : Result := 'Code 0002: Unexpected fault in PvApi or driver';
     ePvErrBadHandle : Result := 'Code 0003: Camera handle is invalid';
     ePvErrBadParameter : Result := 'Code 0004: Bad parameter to API call';
     ePvErrBadSequence : Result := 'Code 0005: Sequence of API calls is incorrect';
     ePvErrNotFound : Result := 'Code 0006: Camera or attribute not found';
     ePvErrAccessDenied : Result := 'Code 0007: Camera cannot be opened in the specified mode';
     ePvErrUnplugged : Result := 'Code 0008: Camera was unplugged';
     ePvErrInvalidSetup : Result := 'Code 0009: Setup is invalid (an attribute is invalid)';
     ePvErrResources : Result := 'Code 0010: System/network resources or memory not available';
     ePvErrBandwidth : Result := 'Code 0011: 1394 bandwidth not available';
     ePvErrQueueFull : Result := 'Code 0012: Too many frames on queue';
     ePvErrBufferTooSmall : Result := 'Code 0013: Frame buffer is too small';
     ePvErrCancelled : Result := 'Code 0014: Frame cancelled by user';
     ePvErrDataLost : Result := 'Code 0015: The data for the frame was lost';
     ePvErrDataMissing : Result := 'Code 0016: Some data in the frame is missing';
     ePvErrTimeout : Result := 'Code 0017: Timeout during wait';
     ePvErrOutOfRange : Result := 'Code 0018: Attribute value is out of the expected range';
     ePvErrWrongType : Result := 'Code 0019: Attribute is not this type (wrong access function)';
     ePvErrForbidden : Result := 'Code 0020: Attribute write forbidden at this time';
     ePvErrUnavailable : Result := 'Code 0021: Attribute is not available at this time';
     ePvErrFirewall : Result := 'Code 0022: A firewall is blocking the traffic (Windows only)';
     __ePvErr_force_32 : Result := 'Code $FFFFFFFF: Codon forcing Error codes to be 32bit';
  end;
end;

Und im eigentlichen Programm rufe ich die Funktionen wie nachfolgend auf. Es ist vorläufig eine Testversion, die auf jeden Fall dringender Überarbeitung bedarf. Wenn das ganze mal Bilder liefert denke ich, daß die komplette Unit mit Beispiel hier Veröffentlichung finden sollte. Dafür das in der FeatureMatrix des Herstellers die Delphi-Option gelistet ist, finde ich die reale Umsetzung für ein SDK doch etwas unumgänglich:

Delphi-Quellcode:
procedure TForm1.Button6Click(Sender: TObject);
Var aFrame : tPvFrame;
    aFrameBuffer : Array of Byte;
    aBitMap : tBitmap;
    aErrValue : tPvErr;
    aString : PAnsiChar;
    aValue : Cardinal;
    bmp_BMI : BITMAPINFO;
    bmp_Bitmap : tBitmap;

Begin
  aErrValue := PvAttrUint32Get (CamHandle, 'TotalBytesPerFrame', aFrame.ImageBufferSize);
  If aErrValue = ePvErrSuccess then
  Begin
    SetLength (aFrameBuffer, aFrame.ImageBufferSize);
    aFrame.ImageBuffer := @aFrameBuffer[0];
  end
  Else
  Begin
    Exit;
  end;

  aErrValue := PvCaptureStart (CamHandle);
  If aErrValue = ePvErrSuccess THen
  Begin

    aErrValue := PvAttrEnumSet (CamHandle, 'FrameStartTriggerMode', 'Freerun');
    Memo1.Lines.Add ('Set FrameStartTriggerMode : ' + PvReturnErrorString (aErrValue));

    If aErrValue = ePvErrSuccess Then
    Begin
// SetLength (aString, 20);
      aErrValue := PvAttrEnumGet (CamHandle, 'FrameStartTriggerMode', aString, SizeOf (aString[0]), aValue);
      Memo1.Lines.Add ('Get FrameStartTriggerMode : ' + PvReturnErrorString (aErrValue)+ ' ; String:' + aString + ';(' + IntToStr (aValue) + ')');


      aErrValue := PvCommandRun (CamHandle, 'AcquisitionStart');
      Memo1.Lines.Add ('CommandRun AcquisitionStart : ' + PvReturnErrorString (aErrValue));

      If aErrValue = ePvErrSuccess Then
      Begin

        aErrValue := PvCaptureQueueFrame (CamHandle, @aFrame, 0) ;
        Memo1.Lines.Add ('CaptureQueueFrame : ' + PvReturnErrorString (aErrValue));

        If aErrValue = ePvErrSuccess Then
        Begin

          aErrValue := PvCaptureWaitForFrameDone (CamHandle, @aFrame, PVINFINITE);
          Memo1.Lines.Add ('Capture Wait For Frame Done : ' + PvReturnErrorString (aErrValue));

          If aErrValue = ePvErrSuccess Then
          Begin
            Memo1.Lines.Add ('Frame count : ' + IntToStr (aFrame.FrameCount));
            Memo1.Lines.Add ('Bit depth : ' + IntToStr (aFrame.BitDepth));
            Memo1.Lines.Add ('Frame width : ' + IntToStr (aFrame.Width));
            Memo1.Lines.Add ('Frame height : ' + IntToStr (aFrame.Height));
            Memo1.Lines.Add ('Image size : ' + IntToStr (aFrame.ImageSize));
            Memo1.Lines.Add ('Frame status : ' + PvReturnErrorString (aFrame.Status));


            bmp_BMI.bmiHeader.biSize := SizeOf (bmp_BMI.bmiHeader);
            bmp_BMI.bmiHeader.biWidth := aFrame.Width;
            bmp_BMI.bmiHeader.biHeight := aFrame.Height;
            bmp_BMI.bmiHeader.biPlanes := 1;
            bmp_BMI.bmiHeader.biBitCount := aFrame.BitDepth;
            bmp_BMI.bmiHeader.biCompression := BI_RGB;
            bmp_BMI.bmiHeader.biSizeImage := 0;
            bmp_BMI.bmiHeader.biXPelsPerMeter := 0;
            bmp_BMI.bmiHeader.biYPelsPerMeter := 0;
            bmp_BMI.bmiHeader.biClrUsed := 0;
            bmp_BMI.bmiHeader.biClrImportant := 0;


// CreateDIBitmap (@aBitmap,...?????)
//createDIBSection

// image1.Picture.Bitmap.Handle
          end;

          aErrValue := PvCaptureEnd (CamHandle);
          Memo1.Lines.Add ('Capture end : ' + PvReturnErrorString (aErrValue));

        end;
      end;
    end;
  end;
end;
Liebe Grüße aus dem Norden

Jan
  Mit Zitat antworten Zitat