1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
double *getPerspectiveTransform(CvPoint2D32f *P) {
double *H=calloc(18,sizeof(double));
double *adj=H+9;
double sx = (P[0].x-P[1].x)+(P[2].x-P[3].x);
double sy = (P[0].y-P[1].y)+(P[2].y-P[3].y);
double dx1 = P[1].x-P[2].x;
double dx2 = P[3].x-P[2].x;
double dy1 = P[1].y-P[2].y;
double dy2 = P[3].y-P[2].y;
double z = (dx1*dy2)-(dy1*dx2);
double g = ((sx*dy2)-(sy*dx2))/z;
double h = ((sy*dx1)-(sx*dy1))/z;
// projection matrix
double a=H[0]=P[1].x-P[0].x+g*P[1].x;
double b=H[1]=P[3].x-P[0].x+h*P[3].x;
double c=H[2]=P[0].x;
double d=H[3]=P[1].y-P[0].y+g*P[1].y;
double e=H[4]=P[3].y-P[0].y+h*P[3].y;
double f=H[5]=P[0].y;
H[6]=g;
H[7]=h;
H[8]=1;
// inverse projection matrix (adjoint matrix)
adj[0]=e-f*h;
adj[1]=c*h-b;
adj[2]=b*f-c*e;
adj[3]=f*g-d;
adj[4]=a-c*g;
adj[5]=c*d-a*f;
adj[6]=d*h-e*g;
adj[7]=b*g-a*h;
adj[8]=a*e-b*d;
// printf("a %f b %f c %f d %f e %f f %f g %f h %f i 1\n",a,b,c,d,e,f,g,h);
// printf("adj: a %f b %f c %f d %f e %f f %f g %f h %f i 1\n",adj[0],adj[1],adj[2],adj[3],adj[4],adj[5],adj[6],adj[7]);
return H;
} |
Partager