Registriert seit: 11. Apr 2003
88 Beiträge
Delphi 7 Professional
|
Re: DLL Funktion(en) von openCV einbinden
17. Feb 2010, 15:08
here we are again!
war ein bisschen gegoogel bis ich ein c beispiel fand! allerdings mit einigermaßen unleserlichen komentaren (zumindest für den dem japanisch nicht mächtigen)
Delphi-Quellcode:
#include <cv.h>
#include <stdio.h>
#include <math.h>
float myLinearity(CvSeq *);
int main(void)
{
int i;
double fx[] = {0.0, 0.301, 0.477, 0.602, 0.699, 0.778, 0.845, 0.903, 0.954, 1.0};
double fy[] = {3.874, 3.202, 2.781, 2.49, 2.274, 2.156, 1.934, 1.74, 1.653, 1.662};
float *line = new float[4];
float linearity=0.0f;
//入れ物の確保
CvMemStorage* storage = cvCreateMemStorage(0);
//3次元の場合はCV_32FC2がCV_32FC3に、CvPoint2D32fがCvPoint3D32fになる
CvSeq* point_seq = cvCreateSeq( CV_32FC2, sizeof(CvSeq), sizeof(CvPoint2D32f), storage );
for (i=0; i<10; i++){
//値の追加はcvSeqPush
cvSeqPush(point_seq, &cvPoint2D32f(fx,fy));
}
linearity = myLinearity(point_seq);
cvFitLine(point_seq,CV_DIST_L2,0,0.01,0.01,line);
fprintf(stdout,"v=(%f,%f),vy/vx=%f,(x,y)=(%f,%f), Linearity=%f\n",line[0],line[1],line[1]/line[0],line[2],line[3],linearity);
cvClearSeq(point_seq);
cvReleaseMemStorage(&storage);
return 0;
}
//大津の直線度
float myLinearity(CvSeq *seq)
{
int i;
CvPoint2D32f *p;
float *x = new float[seq->total];
float *y = new float[seq->total];
float x_bar=0.0, y_bar=0.0;
float u11=0.0, u20=0.0, u02=0.0;
float linearity=0.0;
//吸い出し cvGetSeqElemでポインタを得るのでキャストして取得
for (i=0; i < seq->total; i++){
p=(CvPoint2D32f*)cvGetSeqElem(seq,i);
x=p->x;
y=p->y;
}
//x_bar, y_bar
for (i=0; i < seq->total; i++){
x_bar+=x;
y_bar+=y;
}
x_bar/=seq->total;
y_bar/=seq->total;
//セントラルモーメント
for (i=0; i < seq->total; i++){
u11+=((x-x_bar)*(y-y_bar));
u20+=pow(x-x_bar,2.0f);
u02+=pow(y-y_bar,2.0f);
}
u11/=seq->total;
u20/=seq->total;
u02/=seq->total;
//直線度の算出
linearity = sqrt(4*pow(u11,2.0f)+pow(u20-u02,2.0f))/(u20+u02);
return linearity;
}
Was mir aufgefallen ist
1. cvCreateSeq wird mit CV_32FC2 als 1.parameter aufgerufen! das ergibt bei mir aber einen Fehler!
aber das was mit der pSeq gemacht wird mache ich genau gleich und das funktioniert! (ist natürlich keine Garantie)
2. cvFitLine wird als Dist 2.Par CV_DIST_L2 mitgegeben, hat aber auch keine Besserung gebracht.
Im Anhang habe ich mal noch den Source Code von cvFitLine reingepackt, dort wird untersucht ob der Pointer auf das line Array Nil ist! Wie ich mein Line Array definiere ist dann also (noch) nicht für den Fehler verantwortlich, (wenn überhaupt).
Gruß
Stefan
|