|
![]() |
|
Registriert seit: 2. Feb 2009 Ort: Varel 70 Beiträge RAD-Studio 2009 Pro |
#1
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:
Liebe Grüße aus dem Norden
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; Jan |
![]() |
Ansicht |
![]() |
![]() |
![]() |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
![]() |
![]() |