calib_inp.cpp
Go to the documentation of this file.
1 #include <math.h>
2 #include <stdio.h>
3 #include <malloc.h>
4 //#include <AR/ar.h>
5 //#include <AR/param.h>
6 //#include <AR/matrix.h>
8 #include "calib_camera.h"
9 
11 
12 static int calc_inp2( CALIB_PATT_T *patt, CALIB_COORD_T *screen, ARFloat *pos2d, ARFloat *pos3d,
13  ARFloat dist_factor[4], ARFloat x0, ARFloat y0, ARFloat f[2], ARFloat *err );
14 static void get_cpara( CALIB_COORD_T *world, CALIB_COORD_T *screen, int num, ARFloat para[3][3] );
15 static int get_fl( ARFloat *p , ARFloat *q, int num, ARFloat f[2] );
16 static int check_rotation( ARFloat rot[2][3] );
17 
19 {
20  CALIB_COORD_T *screen, *sp;
21  ARFloat *pos2d, *pos3d, *pp;
22  ARFloat f[2];
23  ARFloat x0, y0;
24  ARFloat err, minerr;
25  int res;
26  int i, j, k;
27 
28  sp = screen = (CALIB_COORD_T *)malloc(sizeof(CALIB_COORD_T) * patt->h_num * patt->v_num * patt->loop_num);
29  pp = pos2d = (ARFloat *)malloc(sizeof(ARFloat) * patt->h_num * patt->v_num * patt->loop_num * 2);
30  pos3d = (ARFloat *)malloc(sizeof(ARFloat) * patt->h_num * patt->v_num * 2);
31  for( k = 0; k < patt->loop_num; k++ ) {
32  for( j = 0; j < patt->v_num; j++ ) {
33  for( i = 0; i < patt->h_num; i++ ) {
34  ARToolKitPlus::Tracker::arParamObserv2Ideal( dist_factor,
35  patt->point[k][j*patt->h_num+i].x_coord,
36  patt->point[k][j*patt->h_num+i].y_coord,
37  &(sp->x_coord), &(sp->y_coord) );
38  *(pp++) = sp->x_coord;
39  *(pp++) = sp->y_coord;
40  sp++;
41  }
42  }
43  }
44  pp = pos3d;
45  for( j = 0; j < patt->v_num; j++ ) {
46  for( i = 0; i < patt->h_num; i++ ) {
47  *(pp++) = patt->world_coord[j*patt->h_num+i].x_coord;
48  *(pp++) = patt->world_coord[j*patt->h_num+i].y_coord;
49  }
50  }
51 
52  minerr = (ARFloat)100000000000000000000000.0;
53  for( j = -50; j <= 50; j++ ) {
54  printf("-- loop:%d --\n", j);
55  y0 = dist_factor[1] + j;
56 /* y0 = ysize/2 + j; */
57  if( y0 < 0 || y0 >= ysize ) continue;
58 
59  for( i = -50; i <= 50; i++ ) {
60  x0 = dist_factor[0] + i;
61 /* x0 = xsize/2 + i; */
62  if( x0 < 0 || x0 >= xsize ) continue;
63 
64  res = calc_inp2( patt, screen, pos2d, pos3d, dist_factor, x0, y0, f, &err );
65  if( res < 0 ) continue;
66  if( err < minerr ) {
67  printf("F = (%f,%f), Center = (%f,%f): err = %f\n", f[0], f[1], x0, y0, err);
68  minerr = err;
69 
70  mat[0][0] = f[0];
71  mat[0][1] = 0.0;
72  mat[0][2] = x0;
73  mat[0][3] = 0.0;
74  mat[1][0] = 0.0;
75  mat[1][1] = f[1];
76  mat[1][2] = y0;
77  mat[1][3] = 0.0;
78  mat[2][0] = 0.0;
79  mat[2][1] = 0.0;
80  mat[2][2] = 1.0;
81  mat[2][3] = 0.0;
82  }
83  }
84  }
85 
86  free( screen );
87  free( pos2d );
88  free( pos3d );
89 
90  if( minerr >= 100.0 ) return -1;
91  return 0;
92 }
93 
94 
95 static int calc_inp2 ( CALIB_PATT_T *patt, CALIB_COORD_T *screen, ARFloat *pos2d, ARFloat *pos3d,
96  ARFloat dist_factor[4], ARFloat x0, ARFloat y0, ARFloat f[2], ARFloat *err )
97 {
98  ARFloat x1, y1, x2, y2;
99  ARFloat p[LOOP_MAX], q[LOOP_MAX];
100  ARFloat para[3][3];
101  ARFloat rot[3][3], rot2[3][3];
102  ARFloat cpara[3][4], conv[3][4];
103  ARFloat ppos2d[4][2], ppos3d[4][2];
104  ARFloat d, werr, werr2;
105  int i, j, k, l;
106 
107  for( i = 0; i < patt->loop_num; i++ ) {
108  get_cpara( patt->world_coord, &(screen[i*patt->h_num*patt->v_num]),
109  patt->h_num*patt->v_num, para );
110  x1 = para[0][0] / para[2][0];
111  y1 = para[1][0] / para[2][0];
112  x2 = para[0][1] / para[2][1];
113  y2 = para[1][1] / para[2][1];
114 
115  p[i] = (x1 - x0)*(x2 - x0);
116  q[i] = (y1 - y0)*(y2 - y0);
117  }
118  if( get_fl(p, q, patt->loop_num, f) < 0 ) return -1;
119 
120  cpara[0][0] = f[0];
121  cpara[0][1] = 0.0;
122  cpara[0][2] = x0;
123  cpara[0][3] = 0.0;
124  cpara[1][0] = 0.0;
125  cpara[1][1] = f[1];
126  cpara[1][2] = y0;
127  cpara[1][3] = 0.0;
128  cpara[2][0] = 0.0;
129  cpara[2][1] = 0.0;
130  cpara[2][2] = 1.0;
131  cpara[2][3] = 0.0;
132 
133  werr = 0.0;
134  for( i = 0; i < patt->loop_num; i++ ) {
135  get_cpara( patt->world_coord, &(screen[i*patt->h_num*patt->v_num]),
136  patt->h_num*patt->v_num, para );
137  rot[0][0] = (para[0][0] - x0*para[2][0]) / f[0];
138  rot[0][1] = (para[1][0] - y0*para[2][0]) / f[1];
139  rot[0][2] = para[2][0];
140  d = (ARFloat)sqrt( rot[0][0]*rot[0][0] + rot[0][1]*rot[0][1] + rot[0][2]*rot[0][2] );
141  rot[0][0] /= d;
142  rot[0][1] /= d;
143  rot[0][2] /= d;
144  rot[1][0] = (para[0][1] - x0*para[2][1]) / f[0];
145  rot[1][1] = (para[1][1] - y0*para[2][1]) / f[1];
146  rot[1][2] = para[2][1];
147  d = (ARFloat)sqrt( rot[1][0]*rot[1][0] + rot[1][1]*rot[1][1] + rot[1][2]*rot[1][2] );
148  rot[1][0] /= d;
149  rot[1][1] /= d;
150  rot[1][2] /= d;
151  check_rotation( rot );
152  rot[2][0] = rot[0][1]*rot[1][2] - rot[0][2]*rot[1][1];
153  rot[2][1] = rot[0][2]*rot[1][0] - rot[0][0]*rot[1][2];
154  rot[2][2] = rot[0][0]*rot[1][1] - rot[0][1]*rot[1][0];
155  d = (ARFloat)sqrt( rot[2][0]*rot[2][0] + rot[2][1]*rot[2][1] + rot[2][2]*rot[2][2] );
156  rot[2][0] /= d;
157  rot[2][1] /= d;
158  rot[2][2] /= d;
159  rot2[0][0] = rot[0][0];
160  rot2[1][0] = rot[0][1];
161  rot2[2][0] = rot[0][2];
162  rot2[0][1] = rot[1][0];
163  rot2[1][1] = rot[1][1];
164  rot2[2][1] = rot[1][2];
165  rot2[0][2] = rot[2][0];
166  rot2[1][2] = rot[2][1];
167  rot2[2][2] = rot[2][2];
168 
169  ppos2d[0][0] = pos2d[i*patt->h_num*patt->v_num*2 + 0];
170  ppos2d[0][1] = pos2d[i*patt->h_num*patt->v_num*2 + 1];
171  ppos2d[1][0] = pos2d[i*patt->h_num*patt->v_num*2 + (patt->h_num-1)*2 + 0];
172  ppos2d[1][1] = pos2d[i*patt->h_num*patt->v_num*2 + (patt->h_num-1)*2 + 1];
173  ppos2d[2][0] = pos2d[i*patt->h_num*patt->v_num*2 + (patt->h_num*(patt->v_num-1))*2 + 0];
174  ppos2d[2][1] = pos2d[i*patt->h_num*patt->v_num*2 + (patt->h_num*(patt->v_num-1))*2 + 1];
175  ppos2d[3][0] = pos2d[i*patt->h_num*patt->v_num*2 + (patt->h_num*patt->v_num-1)*2 + 0];
176  ppos2d[3][1] = pos2d[i*patt->h_num*patt->v_num*2 + (patt->h_num*patt->v_num-1)*2 + 1];
177  ppos3d[0][0] = pos3d[0];
178  ppos3d[0][1] = pos3d[1];
179  ppos3d[1][0] = pos3d[(patt->h_num-1)*2 + 0];
180  ppos3d[1][1] = pos3d[(patt->h_num-1)*2 + 1];
181  ppos3d[2][0] = pos3d[(patt->h_num*(patt->v_num-1))*2 + 0];
182  ppos3d[2][1] = pos3d[(patt->h_num*(patt->v_num-1))*2 + 1];
183  ppos3d[3][0] = pos3d[(patt->h_num*patt->v_num-1)*2 + 0];
184  ppos3d[3][1] = pos3d[(patt->h_num*patt->v_num-1)*2 + 1];
185 
186  for( j = 0; j < 5; j++ ) {
187  theTracker->setFittingMode(AR_FITTING_TO_IDEAL);
188  werr2 = theTracker->arGetTransMat3( rot2, ppos2d, ppos3d, 4, conv, dist_factor, cpara );
189  for( k = 0; k < 3; k++ ) {
190  for( l = 0; l < 3; l++ ) {
191  rot2[k][l] = conv[k][l];
192  }}
193  }
194  werr += werr2;
195 
196  }
197  *err = (ARFloat)sqrt( werr / patt->loop_num );
198 
199  return 0;
200 }
201 
202 static void get_cpara( CALIB_COORD_T *world, CALIB_COORD_T *screen, int num, ARFloat para[3][3] )
203 {
204  ARToolKitPlus::ARMat *a, *b, *c;
205  ARToolKitPlus::ARMat *at, *aa, res;
206  int i;
207 
208  a = ARToolKitPlus::Matrix::alloc( num*2, 8 );
209  b = ARToolKitPlus::Matrix::alloc( num*2, 1 );
210  c = ARToolKitPlus::Matrix::alloc( 8, num*2 );
211  at = ARToolKitPlus::Matrix::alloc( 8, num*2 );
212  aa = ARToolKitPlus::Matrix::alloc( 8, 8 );
213  for( i = 0; i < num; i++ ) {
214  a->m[i*16+0] = world[i].x_coord;
215  a->m[i*16+1] = world[i].y_coord;
216  a->m[i*16+2] = 1.0;
217  a->m[i*16+3] = 0.0;
218  a->m[i*16+4] = 0.0;
219  a->m[i*16+5] = 0.0;
220  a->m[i*16+6] = -world[i].x_coord * screen[i].x_coord;
221  a->m[i*16+7] = -world[i].y_coord * screen[i].x_coord;
222  a->m[i*16+8] = 0.0;
223  a->m[i*16+9] = 0.0;
224  a->m[i*16+10] = 0.0;
225  a->m[i*16+11] = world[i].x_coord;
226  a->m[i*16+12] = world[i].y_coord;
227  a->m[i*16+13] = 1.0;
228  a->m[i*16+14] = -world[i].x_coord * screen[i].y_coord;
229  a->m[i*16+15] = -world[i].y_coord * screen[i].y_coord;
230  b->m[i*2+0] = screen[i].x_coord;
231  b->m[i*2+1] = screen[i].y_coord;
232  }
233  ARToolKitPlus::Matrix::trans( at, a );
234  ARToolKitPlus::Matrix::mul( aa, at, a );
236  ARToolKitPlus::Matrix::mul( c, aa, at );
237  res.row = 8;
238  res.clm = 1;
239  res.m = &(para[0][0]);
240  ARToolKitPlus::Matrix::mul( &res, c, b );
241  para[2][2] = 1.0;
242 
248 }
249 
250 static int get_fl( ARFloat *p , ARFloat *q, int num, ARFloat f[2] )
251 {
252  ARToolKitPlus::ARMat *a, *b, *c;
253  ARToolKitPlus::ARMat *at, *aa, *res;
254  int i;
255 
256 #if 1
257  a = ARToolKitPlus::Matrix::alloc( num, 2 );
258  b = ARToolKitPlus::Matrix::alloc( num, 1 );
259  c = ARToolKitPlus::Matrix::alloc( 2, num );
260  at = ARToolKitPlus::Matrix::alloc( 2, num );
261  aa = ARToolKitPlus::Matrix::alloc( 2, 2 );
262  res = ARToolKitPlus::Matrix::alloc( 2, 1 );
263  for( i = 0; i < num; i++ ) {
264  a->m[i*2+0] = *(p++);
265  a->m[i*2+1] = *(q++);
266  b->m[i] = -1.0;
267  }
268 #else
269  a = ARToolKitPlus::Matrix::alloc( num-1, 2 );
270  b = ARToolKitPlus::Matrix::alloc( num-1, 1 );
271  c = ARToolKitPlus::Matrix::alloc( 2, num-1 );
272  at = ARToolKitPlus::Matrix::alloc( 2, num-1 );
273  aa = ARToolKitPlus::Matrix::alloc( 2, 2 );
274  res = ARToolKitPlus::Matrix::alloc( 2, 1 );
275  p++; q++;
276  for( i = 0; i < num-1; i++ ) {
277  a->m[i*2+0] = *(p++);
278  a->m[i*2+1] = *(q++);
279  b->m[i] = -1.0;
280  }
281 #endif
282  ARToolKitPlus::Matrix::trans( at, a );
283  ARToolKitPlus::Matrix::mul( aa, at, a );
285  ARToolKitPlus::Matrix::mul( c, aa, at );
286  ARToolKitPlus::Matrix::mul( res, c, b );
287 
288  if( res->m[0] < 0 || res->m[1] < 0 ) return -1;
289 
290  f[0] = (ARFloat)sqrt( 1.0 / res->m[0] );
291  f[1] = (ARFloat)sqrt( 1.0 / res->m[1] );
292 
299 
300  return 0;
301 }
302 
303 static int check_rotation( ARFloat rot[2][3] )
304 {
305  ARFloat v1[3], v2[3], v3[3];
306  ARFloat ca, cb, k1, k2, k3, k4;
307  ARFloat a, b, c, d;
308  ARFloat p1, q1, r1;
309  ARFloat p2, q2, r2;
310  ARFloat p3, q3, r3;
311  ARFloat p4, q4, r4;
312  ARFloat w;
313  ARFloat e1, e2, e3, e4;
314  int f;
315 
316  v1[0] = rot[0][0];
317  v1[1] = rot[0][1];
318  v1[2] = rot[0][2];
319  v2[0] = rot[1][0];
320  v2[1] = rot[1][1];
321  v2[2] = rot[1][2];
322  v3[0] = v1[1]*v2[2] - v1[2]*v2[1];
323  v3[1] = v1[2]*v2[0] - v1[0]*v2[2];
324  v3[2] = v1[0]*v2[1] - v1[1]*v2[0];
325  w = (ARFloat)sqrt( v3[0]*v3[0]+v3[1]*v3[1]+v3[2]*v3[2] );
326  if( w == 0.0 ) return -1;
327  v3[0] /= w;
328  v3[1] /= w;
329  v3[2] /= w;
330 
331  cb = v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2];
332  if( cb < 0 ) cb *= -1.0;
333  ca = (ARFloat)(sqrt(cb+1.0) + sqrt(1.0-cb)) * (ARFloat)0.5;
334 
335  if( v3[1]*v1[0] - v1[1]*v3[0] != 0.0 ) {
336  f = 0;
337  }
338  else {
339  if( v3[2]*v1[0] - v1[2]*v3[0] != 0.0 ) {
340  w = v1[1]; v1[1] = v1[2]; v1[2] = w;
341  w = v3[1]; v3[1] = v3[2]; v3[2] = w;
342  f = 1;
343  }
344  else {
345  w = v1[0]; v1[0] = v1[2]; v1[2] = w;
346  w = v3[0]; v3[0] = v3[2]; v3[2] = w;
347  f = 2;
348  }
349  }
350  if( v3[1]*v1[0] - v1[1]*v3[0] == 0.0 ) return -1;
351  k1 = (v1[1]*v3[2] - v3[1]*v1[2]) / (v3[1]*v1[0] - v1[1]*v3[0]);
352  k2 = (v3[1] * ca) / (v3[1]*v1[0] - v1[1]*v3[0]);
353  k3 = (v1[0]*v3[2] - v3[0]*v1[2]) / (v3[0]*v1[1] - v1[0]*v3[1]);
354  k4 = (v3[0] * ca) / (v3[0]*v1[1] - v1[0]*v3[1]);
355 
356  a = k1*k1 + k3*k3 + 1;
357  b = k1*k2 + k3*k4;
358  c = k2*k2 + k4*k4 - 1;
359 
360  d = b*b - a*c;
361  if( d < 0 ) return -1;
362  r1 = (-b + (ARFloat)sqrt(d))/a;
363  p1 = k1*r1 + k2;
364  q1 = k3*r1 + k4;
365  r2 = (-b - (ARFloat)sqrt(d))/a;
366  p2 = k1*r2 + k2;
367  q2 = k3*r2 + k4;
368  if( f == 1 ) {
369  w = q1; q1 = r1; r1 = w;
370  w = q2; q2 = r2; r2 = w;
371  w = v1[1]; v1[1] = v1[2]; v1[2] = w;
372  w = v3[1]; v3[1] = v3[2]; v3[2] = w;
373  f = 0;
374  }
375  if( f == 2 ) {
376  w = p1; p1 = r1; r1 = w;
377  w = p2; p2 = r2; r2 = w;
378  w = v1[0]; v1[0] = v1[2]; v1[2] = w;
379  w = v3[0]; v3[0] = v3[2]; v3[2] = w;
380  f = 0;
381  }
382 
383  if( v3[1]*v2[0] - v2[1]*v3[0] != 0.0 ) {
384  f = 0;
385  }
386  else {
387  if( v3[2]*v2[0] - v2[2]*v3[0] != 0.0 ) {
388  w = v2[1]; v2[1] = v2[2]; v2[2] = w;
389  w = v3[1]; v3[1] = v3[2]; v3[2] = w;
390  f = 1;
391  }
392  else {
393  w = v2[0]; v2[0] = v2[2]; v2[2] = w;
394  w = v3[0]; v3[0] = v3[2]; v3[2] = w;
395  f = 2;
396  }
397  }
398  if( v3[1]*v2[0] - v2[1]*v3[0] == 0.0 ) return -1;
399  k1 = (v2[1]*v3[2] - v3[1]*v2[2]) / (v3[1]*v2[0] - v2[1]*v3[0]);
400  k2 = (v3[1] * ca) / (v3[1]*v2[0] - v2[1]*v3[0]);
401  k3 = (v2[0]*v3[2] - v3[0]*v2[2]) / (v3[0]*v2[1] - v2[0]*v3[1]);
402  k4 = (v3[0] * ca) / (v3[0]*v2[1] - v2[0]*v3[1]);
403 
404  a = k1*k1 + k3*k3 + 1;
405  b = k1*k2 + k3*k4;
406  c = k2*k2 + k4*k4 - 1;
407 
408  d = b*b - a*c;
409  if( d < 0 ) return -1;
410  r3 = (-b + (ARFloat)sqrt(d))/a;
411  p3 = k1*r3 + k2;
412  q3 = k3*r3 + k4;
413  r4 = (-b - (ARFloat)sqrt(d))/a;
414  p4 = k1*r4 + k2;
415  q4 = k3*r4 + k4;
416  if( f == 1 ) {
417  w = q3; q3 = r3; r3 = w;
418  w = q4; q4 = r4; r4 = w;
419  w = v2[1]; v2[1] = v2[2]; v2[2] = w;
420  w = v3[1]; v3[1] = v3[2]; v3[2] = w;
421  f = 0;
422  }
423  if( f == 2 ) {
424  w = p3; p3 = r3; r3 = w;
425  w = p4; p4 = r4; r4 = w;
426  w = v2[0]; v2[0] = v2[2]; v2[2] = w;
427  w = v3[0]; v3[0] = v3[2]; v3[2] = w;
428  f = 0;
429  }
430 
431  e1 = p1*p3+q1*q3+r1*r3; if( e1 < 0 ) e1 = -e1;
432  e2 = p1*p4+q1*q4+r1*r4; if( e2 < 0 ) e2 = -e2;
433  e3 = p2*p3+q2*q3+r2*r3; if( e3 < 0 ) e3 = -e3;
434  e4 = p2*p4+q2*q4+r2*r4; if( e4 < 0 ) e4 = -e4;
435  if( e1 < e2 ) {
436  if( e1 < e3 ) {
437  if( e1 < e4 ) {
438  rot[0][0] = p1;
439  rot[0][1] = q1;
440  rot[0][2] = r1;
441  rot[1][0] = p3;
442  rot[1][1] = q3;
443  rot[1][2] = r3;
444  }
445  else {
446  rot[0][0] = p2;
447  rot[0][1] = q2;
448  rot[0][2] = r2;
449  rot[1][0] = p4;
450  rot[1][1] = q4;
451  rot[1][2] = r4;
452  }
453  }
454  else {
455  if( e3 < e4 ) {
456  rot[0][0] = p2;
457  rot[0][1] = q2;
458  rot[0][2] = r2;
459  rot[1][0] = p3;
460  rot[1][1] = q3;
461  rot[1][2] = r3;
462  }
463  else {
464  rot[0][0] = p2;
465  rot[0][1] = q2;
466  rot[0][2] = r2;
467  rot[1][0] = p4;
468  rot[1][1] = q4;
469  rot[1][2] = r4;
470  }
471  }
472  }
473  else {
474  if( e2 < e3 ) {
475  if( e2 < e4 ) {
476  rot[0][0] = p1;
477  rot[0][1] = q1;
478  rot[0][2] = r1;
479  rot[1][0] = p4;
480  rot[1][1] = q4;
481  rot[1][2] = r4;
482  }
483  else {
484  rot[0][0] = p2;
485  rot[0][1] = q2;
486  rot[0][2] = r2;
487  rot[1][0] = p4;
488  rot[1][1] = q4;
489  rot[1][2] = r4;
490  }
491  }
492  else {
493  if( e3 < e4 ) {
494  rot[0][0] = p2;
495  rot[0][1] = q2;
496  rot[0][2] = r2;
497  rot[1][0] = p3;
498  rot[1][1] = q3;
499  rot[1][2] = r3;
500  }
501  else {
502  rot[0][0] = p2;
503  rot[0][1] = q2;
504  rot[0][2] = r2;
505  rot[1][0] = p4;
506  rot[1][1] = q4;
507  rot[1][2] = r4;
508  }
509  }
510  }
511 
512  return 0;
513 }
d
ARFloat * m
Definition: matrix.h:65
f
static int calc_inp2(CALIB_PATT_T *patt, CALIB_COORD_T *screen, ARFloat *pos2d, ARFloat *pos3d, ARFloat dist_factor[4], ARFloat x0, ARFloat y0, ARFloat f[2], ARFloat *err)
Definition: calib_inp.cpp:95
static int get_fl(ARFloat *p, ARFloat *q, int num, ARFloat f[2])
Definition: calib_inp.cpp:250
static int free(ARMat *m)
static int mul(ARMat *dest, ARMat *a, ARMat *b)
static void get_cpara(CALIB_COORD_T *world, CALIB_COORD_T *screen, int num, ARFloat para[3][3])
Definition: calib_inp.cpp:202
ARFloat x_coord
Definition: calib_camera.h:10
#define LOOP_MAX
Definition: calib_camera.h:6
static int check_rotation(ARFloat rot[2][3])
Definition: calib_inp.cpp:303
Tracker is the vision core of ARToolKit.
Definition: Tracker.h:70
ARToolKitPlus::Tracker * theTracker
ARFloat y_coord
Definition: calib_camera.h:11
int h_num
Definition: calib_camera.h:18
int calc_inp(CALIB_PATT_T *patt, ARFloat dist_factor[4], int xsize, int ysize, ARFloat mat[3][4])
Definition: calib_inp.cpp:18
ARFloat dist_factor[4]
static int selfInv(ARMat *m)
static SVD_FLOAT at
Definition: rpp_svd.cpp:50
CALIB_COORD_T * point[LOOP_MAX]
Definition: calib_camera.h:17
TFSIMD_FORCE_INLINE const tfScalar & w() const
#define AR_FITTING_TO_IDEAL
Definition: config.h:141
int v_num
Definition: calib_camera.h:19
float ARFloat
Definition: config.h:60
int loop_num
Definition: calib_camera.h:20
CALIB_COORD_T * world_coord
Definition: calib_camera.h:16
ARFloat mat[3][4]
static ARMat * alloc(int row, int clm)


tuw_artoolkitplus
Author(s): Markus Bader
autogenerated on Sun Sep 4 2016 03:24:33