PICCANTE  0.4
The hottest HDR imaging library!
eigen_util.hpp
Go to the documentation of this file.
1 /*
2 
3 PICCANTE
4 The hottest HDR imaging library!
5 http://vcg.isti.cnr.it/piccante
6 
7 Copyright (C) 2014
8 Visual Computing Laboratory - ISTI CNR
9 http://vcg.isti.cnr.it
10 First author: Francesco Banterle
11 
12 This Source Code Form is subject to the terms of the Mozilla Public
13 License, v. 2.0. If a copy of the MPL was not distributed with this
14 file, You can obtain one at http://mozilla.org/MPL/2.0/.
15 
16 */
17 
18 #include <vector>
19 
20 #include "../base.hpp"
21 
22 #include "../util/matrix_3_x_3.hpp"
23 #include "../util/vec.hpp"
24 
25 #ifndef PIC_DISABLE_EIGEN
26 
27 #ifndef PIC_EIGEN_NOT_BUNDLED
28  #include "../externals/Eigen/LU"
29  #include "../externals/Eigen/Geometry"
30 #else
31  #include <Eigen/LU>
32  #include <Eigen/Geometry>
33 #endif
34 
35 #endif
36 
37 #ifndef PIC_EIGEN_UTIL
38 #define PIC_EIGEN_UTIL
39 
40 #ifndef PIC_DISABLE_EIGEN
41 namespace Eigen {
42  typedef Matrix<float, 3, 4> Matrix34f;
43  typedef Matrix<double, 3, 4> Matrix34d;
44 }
45 #endif
46 
47 namespace pic {
48 
49 #ifndef PIC_DISABLE_EIGEN
50 
56 PIC_INLINE Eigen::Matrix34d readMatrix34dFromFile(std::string nameFile)
57 {
58  Eigen::Matrix34d mat;
59 
60  FILE *file = fopen(nameFile.c_str(), "r");
61 
62  if(file == NULL) {
63  return mat;
64  }
65 
66  for(int i = 0; i < 3; i++) {
67  for(int j = 0; j < 4; j++) {
68  float val;
69  fscanf(file, "%f", &val);
70  mat(i, j) = double(val);
71  }
72  }
73 
74  fclose(file);
75 
76  return mat;
77 }
78 
85 PIC_INLINE bool writeMatrix34dToFile(std::string nameFile, Eigen::Matrix34d &mat)
86 {
87  FILE *file = fopen(nameFile.c_str(), "w");
88 
89  if(file == NULL) {
90  return false;
91  }
92 
93  for(int i = 0; i < 3; i++) {
94  for(int j = 0; j < 4; j++) {
95  fprintf(file, "%f ", mat(i, j));
96  }
97 
98  if(i < 2) {
99  fprintf(file, "\n");
100  }
101  }
102 
103  fclose(file);
104 
105  return true;
106 }
107 
113 PIC_INLINE Eigen::Matrix3d DiagonalMatrix(Eigen::Vector3d D)
114 {
115  Eigen::Matrix3d ret;
116 
117  ret.setZero();
118  ret(0, 0) = D[0];
119  ret(1, 1) = D[1];
120  ret(2, 2) = D[2];
121 
122  return ret;
123 }
124 
130 PIC_INLINE Eigen::Vector3d getDiagonalFromMatrix(Eigen::Matrix3d &mat)
131 {
132  Eigen::Vector3d D;
133 
134  D[0] = mat(0, 0);
135  D[1] = mat(1, 1);
136  D[2] = mat(2, 2);
137 
138  return D;
139 }
140 
146 PIC_INLINE Eigen::Matrix3d getSquareMatrix(Eigen::Matrix34d &mat)
147 {
148  Eigen::Matrix3d ret;
149  ret(0, 0) = mat(0, 0);
150  ret(0, 1) = mat(0, 1);
151  ret(0, 2) = mat(0, 2);
152 
153  ret(1, 0) = mat(1, 0);
154  ret(1, 1) = mat(1, 1);
155  ret(1, 2) = mat(1, 2);
156 
157  ret(2, 0) = mat(2, 0);
158  ret(2, 1) = mat(2, 1);
159  ret(2, 2) = mat(2, 2);
160 
161  return ret;
162 }
163 
169 PIC_INLINE Eigen::Vector3d getLastColumn(Eigen::Matrix34d &mat)
170 {
171  Eigen::Vector3d ret;
172 
173  ret[0] = mat(0, 3);
174  ret[1] = mat(1, 3);
175  ret[2] = mat(2, 3);
176 
177  return ret;
178 }
179 
185 PIC_INLINE Eigen::Vector3f addOne(Eigen::Vector2f &x)
186 {
187  return Eigen::Vector3f(x[0], x[1], 1.0f);
188 }
189 
195 PIC_INLINE Eigen::Vector3d addOne(Eigen::Vector2d &x)
196 {
197  return Eigen::Vector3d(x[0], x[1], 1.0);
198 }
199 
205 PIC_INLINE Eigen::Vector4d addOne(Eigen::Vector3d &x)
206 {
207  return Eigen::Vector4d(x[0], x[1], x[2], 1.0);
208 }
209 
214 PIC_INLINE void printfVet3d(Eigen::Vector3d &x)
215 {
216  printf("%f %f %f\n", x[0], x[1], x[2]);
217 }
218 
219 
224 PIC_INLINE void printfMat(Eigen::MatrixXd mat)
225 {
226  for(int i = 0; i < mat.rows(); i++){
227  for(int j = 0; j < mat.cols(); j++){
228  printf("%3.3f ", mat(i, j));
229  }
230  printf("\n");
231  }
232 }
233 
238 PIC_INLINE void printfMat(Eigen::Matrix3f &mat)
239 {
240  for(int i = 0; i < 3; i++){
241  for(int j = 0; j < 3; j++){
242  printf("%f ", mat(i, j));
243  }
244  printf("\n");
245  }
246 }
247 
252 PIC_INLINE void printfMat34d(Eigen::Matrix34d &mat)
253 {
254  for(int i = 0; i < 3; i++){
255  for(int j = 0; j < 4; j++){
256  printf("%.9f ", mat(i, j));
257  }
258  printf("\n");
259  }
260 }
261 
266 PIC_INLINE void fprintfMat(Eigen::MatrixXd &mat, std::string name)
267 {
268  FILE *file = fopen(name.c_str(), "w");
269  for(int i = 0; i < mat.rows(); i++){
270  for(int j = 0; j < mat.cols(); j++){
271  fprintf(file, "%.9f ", mat(i, j));
272  }
273  fprintf(file, "\n");
274  }
275  fclose(file);
276 }
277 
282 PIC_INLINE void printfMat(Eigen::Matrix3d &mat)
283 {
284  for(int i = 0; i < 3; i++){
285  for(int j = 0; j < 3; j++){
286  printf("%f ", mat(i, j));
287  }
288  printf("\n");
289  }
290 }
291 
297 PIC_INLINE Eigen::Matrix3d getShiftScaleMatrix(Eigen::Vector3f &info)
298 {
299  Eigen::Matrix3d ret;
300 
301  double cX = info[0];
302  double cY = info[1];
303  double s = 1.0 / info[2];
304 
305  ret(0,0) = s; ret(0,1) = 0.0; ret(0,2) = -cX / info[2];
306  ret(1,0) = 0.0; ret(1,1) = s; ret(1,2) = -cY / info[2];
307  ret(2,0) = 0.0; ret(2,1) = 0.0; ret(2,2) = 1.0;
308 
309  return ret;
310 }
311 
317 PIC_INLINE Eigen::Matrix3d CrossProduct(Eigen::Vector3d &t)
318 {
319  Eigen::Matrix3d ret;
320  ret(0, 0) = 0.0; ret(0, 1) = -t[2]; ret(0, 2) = t[1];
321  ret(1, 0) = t[2]; ret(1, 1) = 0.0; ret(1, 2) = -t[0];
322  ret(2, 0) = -t[1]; ret(2, 1) = t[0]; ret(2, 2) = 0.0;
323  return ret;
324 }
325 
333 PIC_INLINE Eigen::Vector3d rigidTransform(Eigen::Vector3d &point, Eigen::Matrix3d &R, Eigen::Vector3d &t)
334 {
335  return R * point + t;
336 }
337 
343 PIC_INLINE Eigen::Matrix3d RotationMatrixRefinement(Eigen::Matrix3d &R)
344 {
345  Eigen::Quaternion<double> reg(R);
346 
347  return reg.toRotationMatrix();
348 }
349 
356 PIC_INLINE Matrix3x3 MatrixConvert(Eigen::Matrix3f &mat)
357 {
358  Matrix3x3 mtx;
359  mtx.data[0] = mat(0, 0);
360  mtx.data[1] = mat(0, 1);
361  mtx.data[2] = mat(0, 2);
362 
363  mtx.data[3] = mat(1, 0);
364  mtx.data[4] = mat(1, 1);
365  mtx.data[5] = mat(1, 2);
366 
367  mtx.data[6] = mat(2, 0);
368  mtx.data[7] = mat(2, 1);
369  mtx.data[8] = mat(2, 2);
370 
371  return mtx;
372 }
373 
374 
381 PIC_INLINE Matrix3x3 MatrixConvert(Eigen::Matrix3d &mat)
382 {
383  Matrix3x3 mtx;
384  mtx.data[0] = float(mat(0, 0));
385  mtx.data[1] = float(mat(0, 1));
386  mtx.data[2] = float(mat(0, 2));
387 
388  mtx.data[3] = float(mat(1, 0));
389  mtx.data[4] = float(mat(1, 1));
390  mtx.data[5] = float(mat(1, 2));
391 
392  mtx.data[6] = float(mat(2, 0));
393  mtx.data[7] = float(mat(2, 1));
394  mtx.data[8] = float(mat(2, 2));
395 
396  return mtx;
397 }
398 
404 PIC_INLINE float *getLinearArrayFromMatrix(Eigen::Matrix3d &mat)
405 {
406  int n = int(mat.cols() * mat.rows());
407 
408  float *ret = new float[n];
409  int c = 0;
410  for(int i = 0; i < mat.rows(); i++) {
411  for(int j = 0; j < mat.cols(); j++) {
412  ret[c] = float(mat(i, j));
413  c++;
414  }
415  }
416 
417  return ret;
418 }
419 
425 PIC_INLINE float *getLinearArrayFromMatrix(Eigen::Matrix3f &mat)
426 {
427  int n = int(mat.cols() * mat.rows());
428 
429  float *ret = new float[n];
430  int c = 0;
431  for(int i = 0; i < mat.rows(); i++) {
432  for(int j = 0; j < mat.cols(); j++) {
433  ret[c] = mat(i, j);
434  c++;
435  }
436  }
437 
438  return ret;
439 }
440 
448 PIC_INLINE Eigen::MatrixXf getMatrixfFromLinearArray(float *array, int rows, int cols)
449 {
450  Eigen::MatrixXf ret = Eigen::MatrixXf(rows, cols);
451 
452  int c = 0;
453  for(int i = 0; i < rows; i++) {
454  for(int j = 0; j < cols; j++) {
455  ret(i, j) = array[c];
456  c++;
457  }
458  }
459  return ret;
460 }
461 
469 PIC_INLINE Eigen::MatrixXd getMatrixdFromLinearArray(float *array, int rows, int cols)
470 {
471  Eigen::MatrixXd ret = Eigen::MatrixXd(rows, cols);
472 
473  int c = 0;
474  for(int i = 0; i < rows; i++) {
475  for(int j = 0; j < cols; j++) {
476  ret(i, j) = array[c];
477  c++;
478  }
479  }
480  return ret;
481 }
482 
488 PIC_INLINE Eigen::Matrix3d getMatrix3dFromLinearArray(float *array)
489 {
490  Eigen::Matrix3d ret;
491 
492  int c = 0;
493  for(int i = 0; i < 3; i++) {
494  for(int j = 0; j < 3; j++) {
495  ret(i, j) = array[c];
496  c++;
497  }
498  }
499  return ret;
500 }
501 
507 PIC_INLINE Eigen::Matrix3f MatrixConvert(Matrix3x3 &mat)
508 {
509  Eigen::Matrix3f mtx;
510  mtx(0, 0) = mat.data[0];
511  mtx(0, 1) = mat.data[1];
512  mtx(0, 2) = mat.data[2];
513 
514  mtx(1, 0) = mat.data[3];
515  mtx(1, 1) = mat.data[4];
516  mtx(1, 2) = mat.data[5];
517 
518  mtx(2, 0) = mat.data[6];
519  mtx(2, 1) = mat.data[7];
520  mtx(2, 2) = mat.data[8];
521 
522  return mtx;
523 }
524 
530 PIC_INLINE Eigen::Vector3f ComputeNormalizationTransform(std::vector< Eigen::Vector2f > &points)
531 {
532  Eigen::Vector3f ret;
533 
534  if(points.size() < 2) {
535  return ret;
536  }
537 
538  ret[0] = 0.0f;
539  ret[1] = 0.0f;
540 
541  for(unsigned int i = 0; i < points.size(); i++) {
542  ret[0] += points[i][0];
543  ret[1] += points[i][1];
544  }
545 
546  float n = float(points.size());
547  ret[0] /= n;
548  ret[1] /= n;
549 
550  ret[2] = 0.0;
551  for(unsigned int i = 0; i < points.size(); i++) {
552 
553  float dx = points[i][0] - ret[0];
554  float dy = points[i][1] - ret[1];
555 
556  ret[2] += sqrtf(dx * dx + dy * dy);
557  }
558 
559  ret[2] = ret[2] / n / sqrtf(2.0f);
560 
561  return ret;
562 }
563 
569 {
570  return Vec2i(x[0], x[1]);
571 }
572 
573 #endif
574 
575 }
576 
577 #endif // PIC_EIGEN_UTIL
float data[9]
Definition: matrix_3_x_3.hpp:37
PIC_INLINE Eigen::Matrix3d getShiftScaleMatrix(Eigen::Vector3f &info)
getShiftScaleMatrix computes a shifting and scaling matrix
Definition: eigen_util.hpp:297
PIC_INLINE float * getLinearArrayFromMatrix(Eigen::Matrix3d &mat)
getLinearArray
Definition: eigen_util.hpp:404
The Matrix3x3 class provides methods for managing a 3 by 3 matrix.
Definition: matrix_3_x_3.hpp:29
PIC_INLINE Eigen::Vector3d getLastColumn(Eigen::Matrix34d &mat)
getLastColumn
Definition: eigen_util.hpp:169
PIC_INLINE Eigen::Vector3d getDiagonalFromMatrix(Eigen::Matrix3d &mat)
getDiagonalFromMatrix
Definition: eigen_util.hpp:130
PIC_INLINE void printfMat(Eigen::MatrixXd mat)
printf
Definition: eigen_util.hpp:224
PIC_INLINE Vec2i convertFromEigenToVec(Eigen::Vector2i &x)
convertFromEigenToVec
Definition: eigen_util.hpp:568
PIC_INLINE void printfMat34d(Eigen::Matrix34d &mat)
printf
Definition: eigen_util.hpp:252
Definition: eigen_util.hpp:41
Vec< 2, int > Vec2i
Vec2i.
Definition: vec.hpp:829
PIC_INLINE Eigen::Vector3f addOne(Eigen::Vector2f &x)
addOne
Definition: eigen_util.hpp:185
PIC_INLINE Eigen::MatrixXf getMatrixfFromLinearArray(float *array, int rows, int cols)
getMatrixFromLinearArray
Definition: eigen_util.hpp:448
PIC_INLINE void fprintfMat(Eigen::MatrixXd &mat, std::string name)
fprintf
Definition: eigen_util.hpp:266
PIC_INLINE Eigen::Matrix34d readMatrix34dFromFile(std::string nameFile)
readMatrix34dFromFile
Definition: eigen_util.hpp:56
PIC_INLINE Matrix3x3 MatrixConvert(Eigen::Matrix3f &mat)
MatrixConvert converts a matrix from a Eigen::Matrix3f representation into a Matrix3x3 representation...
Definition: eigen_util.hpp:356
#define PIC_INLINE
Definition: base.hpp:33
PIC_INLINE Eigen::Vector3d rigidTransform(Eigen::Vector3d &point, Eigen::Matrix3d &R, Eigen::Vector3d &t)
rigidTransform computes a rigidi transformation in 3D.
Definition: eigen_util.hpp:333
PIC_INLINE Eigen::Matrix3d getSquareMatrix(Eigen::Matrix34d &mat)
getSquareMatrix
Definition: eigen_util.hpp:146
PIC_INLINE Eigen::Matrix3d DiagonalMatrix(Eigen::Vector3d D)
DiagonalMatrix creates a diagonal matrix.
Definition: eigen_util.hpp:113
Definition: bilateral_separation.hpp:25
PIC_INLINE Eigen::Matrix3d CrossProduct(Eigen::Vector3d &t)
CrossProduct computes a cross product matrix from a vector.
Definition: eigen_util.hpp:317
PIC_INLINE Eigen::Vector3f ComputeNormalizationTransform(std::vector< Eigen::Vector2f > &points)
ComputeNormalizationTransform.
Definition: eigen_util.hpp:530
PIC_INLINE Eigen::MatrixXd getMatrixdFromLinearArray(float *array, int rows, int cols)
getMatrixFromLinearArray
Definition: eigen_util.hpp:469
PIC_INLINE Eigen::Matrix3d getMatrix3dFromLinearArray(float *array)
getMatrix3dFromLinearArray
Definition: eigen_util.hpp:488
PIC_INLINE Eigen::Matrix3d RotationMatrixRefinement(Eigen::Matrix3d &R)
RotationMatrixRefinement.
Definition: eigen_util.hpp:343
The Vec class.
Definition: vec.hpp:35
PIC_INLINE bool writeMatrix34dToFile(std::string nameFile, Eigen::Matrix34d &mat)
writeMatrix34dToFile
Definition: eigen_util.hpp:85
PIC_INLINE void printfVet3d(Eigen::Vector3d &x)
printfVet3d
Definition: eigen_util.hpp:214