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