Delphi-PRAXiS
Seite 1 von 3  1 23   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Ansprechen einer GigE Kamera (Prosilica GC2450C) (https://www.delphipraxis.net/169247-ansprechen-einer-gige-kamera-prosilica-gc2450c.html)

BoolString 6. Jul 2012 12:04

Ansprechen einer GigE Kamera (Prosilica GC2450C)
 
Moin!

Ich habe hier gerade eine GigE Kamera von Prosilica GC2450C auf dem Tisch liegen, die bisher in einer anderen Anwendung steckte.

Ich würde diese Kamera nun gerne erstmalig durch eine eigene Software unter Delphi ansprechen und etwa 4-5 Bilder die Sekunde aufnehmen. Dazu ist auch ein SDK erhältlich (Prosilica SDK PvAPI und Doku). Leider komme ich derzeit nicht ganz klar mit den Aufrufstrukturen der DLL. Die Beispiele sind leider nur in C und ich bekomme die nicht (funktionsfähig) übersetzt...

Hat schon jemand mal damit Erfahrung gesammelt und könnte mir zumindest ein wenig Code für die Initialisierungsroutine/Grabbing zeigen?
Ich hab selbst bestimmt wieder ein Jahr keine einzige Zeile Delphi-Code geschrieben und bräuchte ein wenig Anstarthilfe.

Beste Grüße

Jan

brechi 8. Jul 2012 12:34

AW: Ansprechen einer GigE Kamera (Prosilica GC2450C)
 
Ich kann dir das Universal Package empfehlen (2. Link). Damit kannst du dann auch alle anderen Kameras von AVT ansprechen. Dort sind eigentlich auch genug Beispiel dabei. Wenn du Problemebe bei der Ueberstzunge einzelner Funktionen hast kann ich dir helfen, benoetigen wirst du zumindest dann folgende:


UCC_Init
UCC_GetCameras
UCC_OpenCameraEx
UCC_PrepareFreeGrab
UCC_GrabBitmap24Image
UCC_CloseCamera
UCC_Release

BoolString 10. Jul 2012 20:57

AW: Ansprechen einer GigE Kamera (Prosilica GC2450C)
 
Hallo brechi,

schönenn Dank für dein Angebot. Ich war gerade 2 Tage unterwegs und hab meine Mails nur vom Handy aus kontrolliert und nicht das Forum. Eigentlich hatte ich die Mail-Benachrichtigung angeklickt; aber da kam irgendwie nichts. Deshalb erst jetzt...

Wie du vermutlich schon erahnst, habe ich derzeit tatsächlich das Probleme die C++ Header Datei zum Import der PvAPI Funktionen in Delphi umzusetzen. Das fängt mit einigen Compilerdirektiven zur systemabhängigen Compilierung an und geht in einigen anderen Punkten weiter. Zudem hätte ich gerne ein paar Beispiele (wie geasagt, bin programmiertechnisch komplett eingerostet. Habe inzwischen mit dem AVT Support telephoniert; die konnten mir aber auch nur sagen, daß sie derzeit keine Delphi Samples bereitstellen können. Hinzu kommt, daß ich mich bisher nur äußerst selten mit DLLs beschäftigt habe.

Parallel habe ich jetzt gerade beantragt, die UniAPI zu bekommen.

Eigentlich ist der fehlende Delphi Support schade. Wir nutzen die Prosilicas seit bald 7 Jahren in verschiedenen Projekten, allerdings immer mit großen Teilen an Fremdsoftware, die die Bildaquise macht. Die kann ich aber derzeit nicht nutzen, da ich eine Art Aufnahmerecorder benötige, der bei Programmstart (einbinden ins Autostart) automatisch anfängt aufzunehmen und dabei parallel auf verschiedene, existierende Delphi-Sourcen zugreift.

Jan


PS: Hab dir gerade eine PN übers Forum zukommen lassen.

sx2008 11. Jul 2012 06:54

AW: Ansprechen einer GigE Kamera (Prosilica GC2450C)
 
Normalerweise gibt es nicht nur die Low-Level-APIs sondern auch ActiveX-APIs, die man mit Delphi problemlos ansprechen kann.
Es müsste eigentlich auch noch ein ActiveX-Control geben, das man nur auf ein Formular ziehen braucht und so das Bild angezeigt bekommt.

BoolString 11. Jul 2012 16:06

AW: Ansprechen einer GigE Kamera (Prosilica GC2450C)
 
So, einige erste Funktionen (wie Initialize und Versionsinfos) bekomme ich inzwischen aus der DLL.
Allerdings sind da noch diverse offene Fragen bezüglich der Übersetzung. Ich habe den C Code:

Delphi-Quellcode:
#define PVDECL  __stdcall
typedef void*   tPvHandle; // Camera handle


typedef enum
{
   ePvErrSuccess      = 0,       // No error
   ePvErrCameraFault  = 1,       // Unexpected camera fault
   ePvErrInternalFault = 2,       // Unexpected fault in PvApi or driver
   ePvErrBadHandle    = 3,       // Camera handle is invalid
   ePvErrBadParameter = 4,       // Bad parameter to API call
   ePvErrBadSequence  = 5,       // Sequence of API calls is incorrect
   ePvErrNotFound     = 6,       // Camera or attribute not found
   ePvErrAccessDenied = 7,       // Camera cannot be opened in the specified mode
   ePvErrUnplugged    = 8,       // Camera was unplugged
   ePvErrInvalidSetup = 9,       // Setup is invalid (an attribute is invalid)
   ePvErrResources    = 10,      // System/network resources or memory not available
   ePvErrBandwidth    = 11,      // 1394 bandwidth not available
    ePvErrQueueFull    = 12,      // Too many frames on queue
   ePvErrBufferTooSmall= 13,      // Frame buffer is too small
    ePvErrCancelled    = 14,      // Frame cancelled by user
   ePvErrDataLost     = 15,      // The data for the frame was lost
    ePvErrDataMissing  = 16,      // Some data in the frame is missing
   ePvErrTimeout      = 17,      // Timeout during wait
    ePvErrOutOfRange   = 18,      // Attribute value is out of the expected range
   ePvErrWrongType    = 19,      // Attribute is not this type (wrong access function)
    ePvErrForbidden    = 20,      // Attribute write forbidden at this time
   ePvErrUnavailable  = 21,      // Attribute is not available at this time
    ePvErrFirewall     = 22,      // A firewall is blocking the traffic (Windows only)
   __ePvErr_force_32   = 0xFFFFFFFF
} tPvErr;

typedef enum
{
   ePvAccessMonitor       = 2, // Monitor access: no control, read & listen only
   ePvAccessMaster        = 4, // Master access: full control
   __ePvAccess_force_32    = 0xFFFFFFFF
} tPvAccessFlags;


typedef struct
{
   unsigned long      StructVer;            // Version of this structure
   //---- Version 1 ----
   unsigned long      UniqueId;           // Unique value for each camera
   char               CameraName[32];     // People-friendly camera name (usually part name)
   char               ModelName[32];      // Name of camera part
   char               PartNumber[32];     // Manufacturer's part number
   char               SerialNumber[32];   // Camera's serial number
   char               FirmwareVersion[32]; // Camera's firmware version
   unsigned long      PermittedAccess;    // A combination of tPvAccessFlags
   unsigned long      InterfaceId;        // Unique value for each interface or bus
   tPvInterface       InterfaceType;      // Interface type; see tPvInterface

} tPvCameraInfoEx;


  unsigned long PVDECL PvCameraListEx(tPvCameraInfoEx* pList,
                         unsigned long ListLength,
                    unsigned long* pConnectedNum,
                    unsigned long StructSize);

  tPvErr PVDECL PvCameraOpen(unsigned long UniqueId,
              tPvAccessFlags AccessFlag,
                             tPvHandle* pCamera);
Quasi folgendermassen übersetzt:

Delphi-Quellcode:
 

  {MINENUMSIZE 4} // stimmt diese Größe???
 
  tPvHandle = Pointer;


  vErr =
      (ePvErrSuccess       = 00,       // No error
       ePvErrCameraFault   = 01,       // Unexpected camera fault
       ePvErrInternalFault = 02,       // Unexpected fault in PvApi or driver
       ePvErrBadHandle     = 03,       // Camera handle is invalid
       ePvErrBadParameter  = 04,       // Bad parameter to API call
       ePvErrBadSequence   = 05,       // Sequence of API calls is incorrect
       ePvErrNotFound      = 06,       // Camera or attribute not found
       ePvErrAccessDenied  = 07,       // Camera cannot be opened in the specified mode
       ePvErrUnplugged     = 08,       // Camera was unplugged
       ePvErrInvalidSetup  = 09,       // Setup is invalid (an attribute is invalid)
       ePvErrResources     = 10,       // System/network resources or memory not available
       ePvErrBandwidth     = 11,       // 1394 bandwidth not available
       ePvErrQueueFull     = 12,       // Too many frames on queue
       ePvErrBufferTooSmall = 13,       // Frame buffer is too small
       ePvErrCancelled     = 14,       // Frame cancelled by user
       ePvErrDataLost      = 15,       // The data for the frame was lost
       ePvErrDataMissing   = 16,       // Some data in the frame is missing
       ePvErrTimeout       = 17,       // Timeout during wait
       ePvErrOutOfRange    = 18,       // Attribute value is out of the expected range
       ePvErrWrongType     = 19,       // Attribute is not this type (wrong access function)
       ePvErrForbidden     = 20,       // Attribute write forbidden at this time
       ePvErrUnavailable   = 21,       // Attribute is not available at this time
       ePvErrFirewall      = 22,       // A firewall is blocking the traffic (Windows only)
       __ePvErr_force_32    = $FFFFFFFF
      ) ;

  tPvAccessFlags =
      (ePvAccessMonitor    = 2,        // Monitor access: no control, read & listen only
       ePvAccessMaster     = 4,        // Master access: full control
       __ePvAccess_force_32 = $FFFFFFFF
      );


tPvCameraInfoEx = Packed Record
                      StructVer  : Cardinal;                    // Version of this structure
                      //---- Version 1 ----
                      UniqueId       : Cardinal;             // Unique value for each camera
                      CameraName     : Array [0..32] of Char; // People-friendly camera name (usually part name)
                      ModelName      : Array [0..32] of Char; // Name of camera part
                      PartNumber     : Array [0..32] of Char; // Manufacturer's part number
                      SerialNumber   : Array [0..32] of Char; // Camera's serial number
                      FirmwareVersion : Array [0..32] of Char; // Camera's firmware version
                      PermittedAccess : Cardinal;             // A combination of tPvAccessFlags
                      InterfaceId    : Cardinal;             // Unique value for each interface or bus
                      InterfaceType  : tPvInterface;         // Interface type; see tPvInterface
                    end;

Function PvCameraListEx (pList : Array of tPvCameraInfoEx; ListLength : Cardinal; pConnectedNum : Cardinal; Size : Cardinal) : Cardinal; stdcall; external 'PvAPI.dll';
Function PvCameraOpen  (UNiqueID : Cardinal; AccessFlag : tPvAccessFlags; pCamera : tPvHandle) : tPvErr; stdcall; external 'PvAPI.dll';
Leider möchte das bereits an dieser frühen Stelle nicht kompilieren. Bin recht zuversichtlich, aber es kommt ja noch die Extraktion der Bilder aus dem Datenstream...

Ich denke, daß Cardinal dem unsigned long entsprechen sollte. Die Frage ist allerdings, ob die Array-Grenzen so richtig sind, ob es tatsächlich ein Packed Record ist und vor allem wie die Pointereien im Aufruf umzusetzen sind. Oder hab ich hier noch ganz andere Fehler drin?

Jan




Aufrufen würde ich das später etwa so:
Delphi-Quellcode:
    Var listAVTGigECams : Array [0..20] of tPvCameraInfoEx;
    valNumberOfCams     : Cardinal;
    valAvailableCams    : Cardinal;
    aHandle             : tPvHandle;

begin

  valNumberOfCams := PvCameraListEx (listAVTGigECameras, High (listAVTGigECams), valAvailableCameras, SizeOf (tPvCameraInfoEx));
  PvCameraOpen (listAVTGigECameras[0].UniqueID, aHandle);

end;

BoolString 11. Jul 2012 21:01

AW: Ansprechen einer GigE Kamera (Prosilica GC2450C)
 
Ohne pushen zu wollen, aber wie würde man denn dies Konstrukt:

Delphi-Quellcode:
unsigned long PVDECL PvCameraListEx(tPvCameraInfoEx* pList,
                                            unsigned long ListLength,
                                            unsigned long* pConnectedNum,
                                            unsigned long StructSize);
wohl korrekt übersetzen und aufrufen? Ich glaube ich hab nicht wirklich die Essenz der Zeiger. Einer meiner verschiedenen Versuche war:

Delphi-Quellcode:
Function PvCameraListEx (pList : Array of tPvCameraInfoEx; ListLength : Cardinal; pConnectedNum : Cardinal; Size : Cardinal) : Cardinal; stdcall; external 'PvAPI.dll';


type tlistAVTGigECams = Array [0..15] of tPvCameraInfoEx;
Var listAVTGigECams : tlistAVTGigECams;
valNumberOfCams := PvCameraListEx (listAVTGigECams, High (listAVTGigECams), valAvailableCams, SizeOf (tPvCameraInfoEx));
Mal davon abgesehen, daß meine Arrays im obigen Posting noch alle einen zu lang waren...

jan

Horst0815 12. Jul 2012 01:28

AW: Ansprechen einer GigE Kamera (Prosilica GC2450C)
 
http://forum.delphi-treff.de/showthr...er-f%FCr-C-DLL

brechi 12. Jul 2012 08:16

AW: Ansprechen einer GigE Kamera (Prosilica GC2450C)
 
Du darfst es nicht als "array of byte" uebersetzen, da dann zwei intern die Laenge+Groesse des Array uebergeben wird, woduch die Parameter nicht mehr mit dem C header uebereinstimmen. Unter der UniversaAPI koennen maximal 64 Kameras angesprochen werden. Also versuchs mal mit:

Delphi-Quellcode:
type
  tPvCameraInfoExList = array[0..63] of tPvCameraInfoEx;
  PPvCameraInfoEx = ^tPvCameraInfoEx;

Function PvCameraListEx (pList : PPvCameraInfoEx; ListLength: Cardinal; pConnectedNum : Cardinal; Size : Cardinal) : Cardinal; stdcall; external 'PvAPI.dll';

Var listAVTGigECams : tPvCameraInfoExList ;
valNumberOfCams := PvCameraListEx (@listAVTGigECams, Length(listAVTGigECams), valAvailableCams, SizeOf (tPvCameraInfoEx));
oder

Delphi-Quellcode:
type
  tPvCameraInfoExList = array of tPvCameraInfoEx;
  PPvCameraInfoEx = ^tPvCameraInfoEx;

Function PvCameraListEx (pList : PPvCameraInfoEx; ListLength: Cardinal; pConnectedNum : Cardinal; Size : Cardinal) : Cardinal; stdcall; external 'PvAPI.dll';

Var listAVTGigECams : tPvCameraInfoExList ;
setLength(listAVTGigECams , 10);
if Length(listAVTGigECams) > 0 then
  valNumberOfCams := PvCameraListEx (@listAVTGigECams[0], Length(listAVTGigECams), valAvailableCams, SizeOf (tPvCameraInfoEx));

BoolString 13. Jul 2012 12:48

AW: Ansprechen einer GigE Kamera (Prosilica GC2450C)
 
@horst0815: Danke, aber das sind Punkte, die kommen erst noch deutlich später. Wen ich mal bis zu diesem Schritt gekommen bin, werd ich da sicherlich auch Infos rausziehen können...

@brechi: Der Bezugspunkt bezüglich deiner 'Array of Byte' Anmerkung ist nicht ganz klar geworden. Hatte in den bisherigen Postings keine solche Struktur.


Die Funktion PvCameraListEx der DLL kann ich erstmal fehlerfrei anrufen. Allerdings erzeugt der Aufruf :

Delphi-Quellcode:
 tPvInterface =
      (ePvInterfaceFirewire   = 1,      // Firewire interface
       ePvInterfaceEthernet   = 2,      // Ethernet interface
       __ePvInterface_force_32 = $FFFFFFFF
      );


 tPvCameraInfoEx = Packed Record
                      StructVer      : Cardinal;                // Version of this structure
                      //---- Version 1 ----
                      UniqueId       : Cardinal;             // Unique value for each camera
                      CameraName     : Array [0..31] of Byte; // People-friendly camera name (usually part name)
                      ModelName      : Array [0..31] of Byte; // Name of camera part
                      PartNumber     : Array [0..31] of Byte; // Manufacturer's part number
                      SerialNumber   : Array [0..31] of Byte; // Camera's serial number
                      FirmwareVersion : Array [0..31] of Byte; // Camera's firmware version
                      PermittedAccess : Cardinal;             // A combination of tPvAccessFlags
                      InterfaceId    : Cardinal;             // Unique value for each interface or bus
                      InterfaceType  : tPvInterface;         // Interface type; see tPvInterface
                    end;


  tPvCameraInfoExList = array of tPvCameraInfoEx;
  pPvCameraInfoExList = ^tPvCameraInfoExList;
  tConnectedCams     = Cardinal;
  pConnectedCams     = ^tConnectedCams;



  Function PvCameraListEx (pList : pPvCameraInfoExList; ListLength : Cardinal; pConnectedNum : pConnectedCams; Size : Cardinal) : Cardinal; stdcall; external 'PvAPI.dll';

auf folgende Weise:

Delphi-Quellcode:
Var listAVTGigECams : tPvCameraInfoExList;
    valNumberOfCams : Cardinal;
    valAvailableCams : Cardinal;
    i: Integer;

begin

  SetLength (listAVTGigECams, 1);

  valNumberOfCams := PvCameraListEx (@listAVTGigECams, Length (listAVTGigECams), @valAvailableCams, SizeOf (tPvCameraInfoEx));

  Sleep (100);

  memo1.Lines.Add ('High  value           : ' + IntToStr(High  (listAVTGigECams)));
  memo1.Lines.add ('Number of cams in list : ' + IntToStr (valNumberOfCams));
  memo1.Lines.add ('Number of cams available: ' + IntToStr (valAvailableCams));

  For i := 00 to valNumberofCams-1 do
  Begin
    Memo1.Lines.Add (IntToStr (listAVTGigECams[i].UniqueID));
    Memo1.Lines.Add (Chr(listAVTGigECams[i].CameraName[0]));
  end;
end;
ein merkwürdiges Verhalten. wenn man das ganze im Debugger beobachtet, dann beinhaltet das Array listAVTGigECams nach SetLength genau einmal den Record. Nachdem die Funktion PvCameraListEx aufgerufen wurde, besitzen die Variablen valNumberOfCams und valAvailableCams die korrekten Werte (eine Kamera) in der Liste der lokalen Variablen des Dubuggers.
Das Array listAVTGigECams besitzt allerdings plötzlich 131072 (0..131071) Elemente, wovon die ersten 365 (0..364) leer sind. Das Element 366 (Index 365) beinhaltet die erwartete Record Struktur; wenn auch mit komplett unherleitbaren Werten. Gleiches gilt für die folgenden Elemente. Element 752-1093 (Index 751-1092) ist wieder leer und so weiter.

Nach dem Aufruf der Funktion PvCameraListEx kann man auch nicht mehr auf die anderen Variablen zugreifen (oben z.B. in den Memo1.lines.Add); hier werden vermutlich Speicherzuweisungen überschrieben.


Ich habe momentan die Vermutung, daß es an der Definition von tPvCameraInfoEx liegt. Das SizeOf zeigt mit 180 den Wert an, den ich erwarten würde. Allerdings ist mir die Indizierungs des Arrays auffällig mit 2*180+5 verknüpft. Es sind 5 Arrays of Byte da drin. Ich hab versucht an diversen Stelen nachzulesen (unter anderem Asserbads DLL Manual) und hab eine Übersetzungsempfehlung für
Delphi-Quellcode:
 char CameraName[32]
mit
Delphi-Quellcode:
CameraName : Array [00..31] of Byte
gefunden. Ein Char geht nicht mehr, da es unter DelphiXE dem WideChar entspricht; obgleich man dann ja wohl auch AnsiChar verwenden könnte. Die Größe von tPvInterface scheint durch den $FFFFFFFF Wert korrekt auf 4 Byte aliniert zu werden.

Wenn die Kamera abgezogen ist, wird das Array nicht bestückt und man kann auch auf die Variablen valNumberOfCams und valAvailableCams zugreifen.

[...]

brechi 13. Jul 2012 17:53

AW: Ansprechen einer GigE Kamera (Prosilica GC2450C)
 
Ich meinte auch
Delphi-Quellcode:
array of tPvCameraInfoEx;
Wenn du dynamische Arrays verwendest und diese als Pointer uebergeben willst musst du immmer @Array[0] uebergeben, niemals @Array, denn vor dem 1. Element sind noch andere Daten gespeichert (Laenge).

Also entweder du verwendest ein statisches Array (dann geh @Array aber auch dort ist @Array[0] erlaubt) oder ein dynamisches mit @Array[0].

Delphi-Quellcode:
tPvInterface =
      (ePvInterfaceFirewire = 1, // Firewire interface
       ePvInterfaceEthernet = 2, // Ethernet interface
       __ePvInterface_force_32 = $FFFFFFFF
      );


 tPvCameraInfoEx = Packed Record
                      StructVer : Cardinal;   // Version of this structure
                      //---- Version 1 ----
                      UniqueId : Cardinal; // Unique value for each camera
                      CameraName : array[0..31] of char; // People-friendly camera name (usually part name)
                      ModelName : array[0..31] of char; // Name of camera part
                      PartNumber : array[0..31] of char; // Manufacturer's part number
                      SerialNumber : array[0..31] of char; // Camera's serial number
                      FirmwareVersion : array[0..31] of char; // Camera's firmware version
                      PermittedAccess : Cardinal; // A combination of tPvAccessFlags
                      InterfaceId : Cardinal; // Unique value for each interface or bus
                      InterfaceType : tPvInterface; // Interface type; see tPvInterface
                    end;


  tPvCameraInfoExList = array of tPvCameraInfoEx;
  tConnectedCams = Cardinal;



  Function PvCameraListEx (pList : pPvCameraInfoExList; ListLength : Cardinal; out pConnectedNum : pConnectedCams; Size : Cardinal) : Cardinal; stdcall; external 'PvAPI.dll';


Var listAVTGigECams : tPvCameraInfoExList;
    valNumberOfCams : Cardinal;
    valAvailableCams : Cardinal;
    i: Integer;
begin

  SetLength (listAVTGigECams, 1);

  valNumberOfCams := PvCameraListEx (@listAVTGigECams[0], Length (listAVTGigECams), valAvailableCams, SizeOf (tPvCameraInfoEx));

  Sleep (100);

  memo1.Lines.Add ('High value : ' + IntToStr(High (listAVTGigECams)));
  memo1.Lines.add ('Number of cams in list : ' + IntToStr (valNumberOfCams));
  memo1.Lines.add ('Number of cams available: ' + IntToStr (valAvailableCams));

  For i := 0 to valNumberofCams-1 do
  Begin
    Memo1.Lines.Add (IntToStr (listAVTGigECams[i].UniqueID));
    Memo1.Lines.Add (listAVTGigECams[i].CameraName));
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:16 Uhr.
Seite 1 von 3  1 23   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz