Einzelnen Beitrag anzeigen

alf.stefan

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

DLL Funktion(en) von openCV einbinden

  Alt 17. Feb 2010, 08: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