void main (int argc, char *argv[]) { int maxdeg; // setbuf (stdout, (char *) NULL); if (argc != 3) usage (); maxdeg = atoi (argv[2]); if (maxdeg < 1 || maxdeg > 25) usage (); leastsq (argv[1], maxdeg); exit (0); }
void update_distort(void) { int N = 9; float src1[9][3], src2[9][3], *src[9], dst1[9], dst2[9]; if (current_window) { int i; cal_priv_t *p = (cal_priv_t *)(current_window->appdata); /* build vectors of data */ /* 4 corners, center and midway along each line */ for(i = 0; i < 4; i++) { src1[i][0] = def_cal_pts[i][0]; src1[i][1] = def_cal_pts[i][1]; src1[i][2] = 1.0; dst1[i] = p->pt[i][0]; dst2[i] = p->pt[i][1]; } for(i = 0; i < 4; i++) { src1[i+4][0] = (def_cal_pts[i][0]+def_cal_pts[(i+1)%4][0])/2.0; src1[i+4][1] = (def_cal_pts[i][1]+def_cal_pts[(i+1)%4][1])/2.0; src1[i+4][2] = 1.0; dst1[i+4] = (p->pt[i][0]+p->pt[(i+1)%4][0])/2.0; dst2[i+4] = (p->pt[i][1]+p->pt[(i+1)%4][1])/2.0; } dst1[8] = src1[8][0] = 0; dst2[8] = src1[8][1] = 0; src1[8][2] = 1.0; for(i = 0; i < 4; i++) { dst1[8] += p->pt[i][0]; dst2[8] += p->pt[i][1]; } dst1[8] /= 4.0; dst2[8] /= 4.0; for(i = 0; i < N; i++) { src[i] = src2[i]; } /* solve for d1..d3 */ memcpy(src2,src1,sizeof(src1)); leastsq(src,N,3,dst1); /* solve for d2..d3 */ memcpy(src2,src1,sizeof(src1)); leastsq(src,N,3,dst2); /* set values in res in distortion matrix */ veMatrixIdentity(&(current_window->distort)); for(i = 0; i < 3; i++) { current_window->distort.data[0][i] = dst1[i]; current_window->distort.data[1][i] = dst2[i]; } printf("disort = \n[ %2.4f %2.4f %2.4f ]\n[ %2.4f %2.4f %2.4f ]\n[ %2.4f %2.4f %2.4f ]\n", current_window->distort.data[0][0], current_window->distort.data[0][1], current_window->distort.data[0][2], current_window->distort.data[1][0], current_window->distort.data[1][1], current_window->distort.data[1][2], current_window->distort.data[2][0], current_window->distort.data[2][1], current_window->distort.data[2][2]); } }