AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DLL Funktion(en) von openCV einbinden

Offene Frage von "alf.stefan"
Ein Thema von alf.stefan · begonnen am 17. Feb 2010 · letzter Beitrag vom 18. Feb 2010
Antwort Antwort
Seite 1 von 2  1 2      
alf.stefan

Registriert seit: 11. Apr 2003
88 Beiträge
 
Delphi 7 Professional
 
#1

DLL Funktion(en) von openCV einbinden

  Alt 17. Feb 2010, 07:29
Hallo zusammen

ich arbeite schon länger mit Delphi7 und openCV auf XPSp2. So weit funktioniert es auch, nur bei einigen Funktionen komm ich einfach nicht weiter.
Kann mal jemand auf die Deklaration und die Anwendung schauen ob ich da einen offensichtlich Fehler drin habe.

notwendige funktionen für mein momentanes Problem cvFitLine
in OpenCV Version 1.10.1 und auch 2.0a.


Delphi-Quellcode:
 Function cvCreateMemStorage( block_size : integer =0) : PCvMemStorage; cdecl;
// ist in C
// CvMemStorage* cvCreateMemStorage( int block_size=0 );

Procedure cvReleaseMemStorage( var storage : PCvMemStorage ); cdecl;
// ist in C
// void cvReleaseMemStorage( CvMemStorage** storage );

function cvCreateSeq(seq_flags: longInt; header_size: longInt; elem_size: longInt; storage: pCvMemStorage): pCvSeq; cdecl;
// ist in C
// CvSeq* cvCreateSeq( int seq_flags, int header_size,int elem_size, CvMemStorage* storage );

function cvSeqPush(seq : pCvSeq; aPoint : pCvPoint2D32f): pByte;cDecl;
// ist in C
// schar* cvSeqPush( CvSeq* seq, void* element=NULL );

function cvGetSeqElem(seq : pCvSeq; index : integer): Pointer;cDecl;
// ist in C
// char* cvGetSeqElem( const CvSeq* seq, int index );

// das sind die funktionen die funktionieren wie ich es erwarte
// hier bekomme ich Fehler
procedure cvFitLine(points : pcvArr; dist_Type : longInt; param : double; reps: double; aeps: double; line: pSingle);cdecl;
// ist in C
//void cvFitLine( const CvArr* points, int dist_type, double param, double reps, double aeps, float* line );
das sind die Funktionen die in openCV angesprochen werden, das ganze dann in einer Anwendung sieht so aus
Delphi-Quellcode:
procedure TForm1.seq;
var
  m, b: single;
  store : pCvMemStorage;
  seq : pCvSeq;
  sInfo : string;
  pErg : pByte;
  aPointer : Pointer;
  myPoint: CvPoint2D32f;
  pPoint : pCvPoint2D32f;
  row,col, elem : byte;
   line : array[0..4] of single;

begin
    m := 0.5;
    b:=2;
    store := cvCreateMemStorage(0);
    sInfo := '';
    seq := cvCreateSeq(0, sizeOf(CvSeq), sizeOf(CvPoint2D32f), store);
    for row:=0 to 0 do
      for col:= 0 to 3 do
      begin
        myPoint.x := 0.05+col;
        myPoint.y := m*myPoint.x+b;
        pErg := cvSeqPush(seq, @myPoint);
      end;

    cvFitLine(seq, 0, 0, 0.01,0.01, @line[0]);

    sInfo := '';
    for elem := 0 to seq.total-1 do
    begin
        pPoint := cvGetSeqElem(seq, elem);
        sInfo := sInfo + Format(' %5.2f %5.2f'+#13#10,[pPoint^.x, pPoint^.y]);
    end;
    Label2.Caption := sInfo;

    cvReleaseMemStorage(store);

end;
wenn der Aufruf cvFitLine auskommentiert ist, kann ich genau die Punkte aus der Sequenz auslesen wie ich sie rein gepushed habe!

Bei Bedarf kann ich auch das gesamte projekt posten.

Gruß

Stefan

PS.: wer openCV runterladen will das gibts hier: http://www.sourceforge.net/projects/opencvlibrary
  Mit Zitat antworten Zitat
Benutzerbild von Jaynder
Jaynder

Registriert seit: 2. Dez 2004
Ort: Süderelbe
134 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: DLL Funktion(en) von openCV einbinden

  Alt 17. Feb 2010, 08:28
Du musst in cvFitLine points auch in Delphi ebenfalls als const übergeben.

procedure cvFitLine(const points : pcvArr; dist_Type : longInt; param : double; reps: double; aeps: double; line: pSingle);cdecl;
  Mit Zitat antworten Zitat
alf.stefan

Registriert seit: 11. Apr 2003
88 Beiträge
 
Delphi 7 Professional
 
#3

Re: DLL Funktion(en) von openCV einbinden

  Alt 17. Feb 2010, 08:51
Danke für die Antwort!

Du meinst in der Deklaration von cvFitLine? oder beim Aufruf (???)

bei der Deklaration
Delphi-Quellcode:
procedure cvFitLine(const points : pcvArr; dist_Type : longInt; param : double; reps: double; aeps: double; line: pSingle);cdecl;
// ist in C
//void cvFitLine( const CvArr* points, int dist_type, double param, double reps, double aeps, float* line );
gibts keine Änderung weder mit Version 2.0a noch mit 1.1.0.1
  Mit Zitat antworten Zitat
Benutzerbild von Jaynder
Jaynder

Registriert seit: 2. Dez 2004
Ort: Süderelbe
134 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: DLL Funktion(en) von openCV einbinden

  Alt 17. Feb 2010, 09:17
in der Deklaration. Das wäre ein offensichtlicher Fehler gewesen.

Gut, ohne dass ich openCV kenne, fallen mir noch ein paar Sachen auf:

Was geht denn nicht - schmiert das Programm ab oder liefert es falsche Ergebnisse?
Ich sehe nicht, wo du das (vermutliche) Ergebnis Line verwendet wird.
Und warum hat es 5 singles?
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: DLL Funktion(en) von openCV einbinden

  Alt 17. Feb 2010, 09:33
Hallo,

cvFitLine(seq, 0, 0, 0.01,0.01, @line[0]);

laut Deklaration
function cvCreateSeq ... : pCvSeq
ist seq vom Typ pCvSeq

cvFitLine(points : pcvArr;
will aber ein pcvArr
Ich habe keine Lust, mir das ganze Teil herunterzuladen,
die verwendeten Daten-Typen könntest du ja mal posten

Ausserdem übergibst du mit @line[0] einen Pointer ?
Muss es nicht
cvFitLine(seq, 0, 0, 0.01,0.01, line[0]);

heissen ?


Heiko
Heiko
  Mit Zitat antworten Zitat
alf.stefan

Registriert seit: 11. Apr 2003
88 Beiträge
 
Delphi 7 Professional
 
#6

Re: DLL Funktion(en) von openCV einbinden

  Alt 17. Feb 2010, 09:48
Die 5 singles sind natürlich ein versehen! aber unabhängig davon stürzt die Funktion cvFitLine ab.

Zitat:
line
The output line parameters. In case of 2d fitting it is array of 4 floats (vx, vy, x0, y0) where (vx, vy) is a normalized vector collinear to the line and (x0, y0) is some point on the line. In case of 3D fitting it is array of 6 floats (vx, vy, vz, x0, y0, z0) where (vx, vy, vz) is a normalized vector collinear to the line and (x0, y0, z0) is some point on the line.
sowohl mit line: array[0..3] of single; als auch mit line: array[0..3] of double; cvFitLine stürzt ab

mit Runtime Error bei verwendung von libcv200.dll bzw. libcxcore200.dll.

und mit der Fehlermeldung
"Unsupported format or combination of formats (Input sequence must consist of 2d
points or 3d points) in function cvFitLine, .\cvlinefit.cpp(665)"
bei verwendung von cv110.dll bzw. cxcore110.dll.



@Jaynder Was machst Du denn mit openCV, vielleicht können wir mal unsere umgesetzten Funktionalitäten abgleichen.
  Mit Zitat antworten Zitat
alf.stefan

Registriert seit: 11. Apr 2003
88 Beiträge
 
Delphi 7 Professional
 
#7

Re: DLL Funktion(en) von openCV einbinden

  Alt 17. Feb 2010, 10:06
Hier sind mal die definitionen der verwendeten Datentypen

Delphi-Quellcode:
  type

     PCvSeqBlock = ^CvSeqBlock;
     CvSeqBlock = record
          prev : PCvSeqBlock;
          next : PCvSeqBlock;
          start_index : longint;
          count : longint;
          data : Pchar;
       end;

     PCvSeq = ^CvSeq;
     CvSeq = record
          flags : longint;
          header_size : longint;
          h_prev : PCvSeq;
          h_next : PCvSeq;
          v_prev : PCvSeq;
          v_next : PCvSeq;
          total : longint;
          elem_size : longint;
          block_max : Pchar;
          ptr : Pchar;
          delta_elems : longint;
          storage : PCvMemStorage;
          free_blocks : PCvSeqBlock;
          first : PCvSeqBlock;
       end;
Type
  PCvMemStorage = ^TCvMemStorage;
  P2PCvMemStorage = ^PCvMemStorage;
  CvMemStorage = Record
                   signature : integer;
                   bottom : PCvMemBlock; //* first allocated block */
                   top : PCvMemBlock; //* current memory block - top of the stack */
                   parent : PCvMemStorage; //* borrows new blocks from */
                   block_size: integer; //* block size */
                   free_space: integer; //* free space in the current block */
end;
type
  CvPoint2D32f = record
                    x : Single;
                    y : Single;
                 end;
  TCvPoint2D32f = CvPoint2D32f;
  PCvPoint2D32f = ^TCvPoint2D32f;
end;
welche Datentypen soll ich noch posten?



cvArr, cvMat/cvSeq, iplImage bauen alle aufeinander auf bei vielen funktionen die ein pIplImage erwarten steht in der deklaration auch "nur" ein pCvArr, deshalb denke ich dass es so richtig ist, aber ganz sicher bin ich mir nicht!

das mit der line ist uU ein folgeproblem das aber denke ich noch nicht zum tragen kommt. Wenn ein string übergeben werden muss hat es immer ganz gut funktioniert wenn ich @myStr[0] statt pChar übergeben habe deshalb habe ich es analog dazu so gemacht @line[0] als pointer auf das erste element.
  Mit Zitat antworten Zitat
Benutzerbild von Jaynder
Jaynder

Registriert seit: 2. Dez 2004
Ort: Süderelbe
134 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: DLL Funktion(en) von openCV einbinden

  Alt 17. Feb 2010, 10:11
Zitat von Jaynder:
in der Deklaration. Das wäre ein offensichtlicher Fehler gewesen.

Gut, ohne dass ich openCV kenne, ...
Sorry, kenne openCV leider nicht, habe mich nur häufiger mit der Anbindung von C-Bibliotheken auseinandersetzen müssen.

Was ist denn
Zitat:
mit der Fehlermeldung
"Unsupported format or combination of formats (Input sequence must consist of 2d
points or 3d points) in function cvFitLine, .\cvlinefit.cpp(665)"
bei verwendung von cv110.dll bzw. cxcore110.dll.
Da scheint doch der Call als solcher zu funktionieren. Was ist denn mit dem dist_Type-Parameter? der scheint doch zu entscheiden, ob 2d oder 3d-Daten übergeben werden. Vielleicht ist 0 nicht korrekt?

[Add] poste doch mal die komplette Beschreibung der Parameterliste
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: DLL Funktion(en) von openCV einbinden

  Alt 17. Feb 2010, 10:12
Hallo,

wie ist das Alignment der Record ?

Versuche testweise mal packed record.

Kennst du den Link hier schon ?
1

Heiko
Heiko
  Mit Zitat antworten Zitat
alf.stefan

Registriert seit: 11. Apr 2003
88 Beiträge
 
Delphi 7 Professional
 
#10

Re: DLL Funktion(en) von openCV einbinden

  Alt 17. Feb 2010, 10:41
@hoika ja den link kenn ich. aber da ist tote hose, keine members und nichts, eigentlich schade! bei yahoo gibts eine openCV gruppe in der etwas mehr los ist, aber da weiß auch niemand was, die sind auch nicht auf delphi ausgerichtet.

das mit dem packed record hab ich ausprobiert und hat nix gebracht
ich hab dann auch noch mal geschaut was das bringen könnte. also so wie ich das verstanden habe eine speicherung des records immer an einer 32 -bit bzw 4 byte grenze - aber wenn ich eh nur singels (4Byte) oder doubles (8byte) verwende hat das doch keinen einfluss! Oder hab ich das falsch verstanden?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es 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

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:18 Uhr.
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