AliceVision
Photogrammetric Computer Vision Framework
Stat3d.hpp
1 // This file is part of the AliceVision project.
2 // Copyright (c) 2017 AliceVision contributors.
3 // This Source Code Form is subject to the terms of the Mozilla Public License,
4 // v. 2.0. If a copy of the MPL was not distributed with this file,
5 // You can obtain one at https://mozilla.org/MPL/2.0/.
6 
7 #pragma once
8 
9 #include <aliceVision/mvsData/Point3d.hpp>
10 
11 namespace aliceVision {
12 
13 struct Stat3d
14 {
15  double xsum = 0.0;
16  double ysum = 0.0;
17  double zsum = 0.0;
18  double xxsum = 0.0;
19  double yysum = 0.0;
20  double zzsum = 0.0;
21  double xysum = 0.0;
22  double xzsum = 0.0;
23  double yzsum = 0.0;
24  int count = 0;
25 
26  double A[3][3], V[3][3], d[3], X[4], vx[3], vy[3], vz[3];
27 
28  Stat3d() {}
29 
30  void update(Point3d* p)
31  {
32  xxsum += (double)p->x * (double)p->x;
33  yysum += (double)p->y * (double)p->y;
34  zzsum += (double)p->z * (double)p->z;
35  xysum += (double)p->x * (double)p->y;
36  xzsum += (double)p->x * (double)p->z;
37  yzsum += (double)p->y * (double)p->z;
38  xsum += (double)p->x;
39  ysum += (double)p->y;
40  zsum += (double)p->z;
41  count += 1;
42  }
43 
44  void add(Stat3d* p)
45  {
46  xxsum += p->xxsum;
47  yysum += p->yysum;
48  zzsum += p->zzsum;
49  xysum += p->xysum;
50  xzsum += p->xzsum;
51  yzsum += p->yzsum;
52  xsum += p->xsum;
53  ysum += p->ysum;
54  zsum += p->zsum;
55  count += p->count;
56  }
57 
58  void getEigenVectorsDesc(Point3d& cg, Point3d& v1, Point3d& v2, Point3d& v3, float& d1, float& d2, float& d3)
59  {
60  float xmean = xsum / (double)count;
61  float ymean = ysum / (double)count;
62  float zmean = zsum / (double)count;
63 
64  A[0][0] = (xxsum - xsum * xmean - xsum * xmean + xmean * xmean * (double)count) / (double)(count);
65  A[0][1] = (xysum - ysum * xmean - xsum * ymean + xmean * ymean * (double)count) / (double)(count);
66  A[0][2] = (xzsum - zsum * xmean - xsum * zmean + xmean * zmean * (double)count) / (double)(count);
67  A[1][0] = (xysum - xsum * ymean - ysum * xmean + ymean * xmean * (double)count) / (double)(count);
68  A[1][1] = (yysum - ysum * ymean - ysum * ymean + ymean * ymean * (double)count) / (double)(count);
69  A[1][2] = (yzsum - zsum * ymean - ysum * zmean + ymean * zmean * (double)count) / (double)(count);
70  A[2][0] = (xzsum - xsum * zmean - zsum * xmean + zmean * xmean * (double)count) / (double)(count);
71  A[2][1] = (yzsum - ysum * zmean - zsum * ymean + zmean * ymean * (double)count) / (double)(count);
72  A[2][2] = (zzsum - zsum * zmean - zsum * zmean + zmean * zmean * (double)count) / (double)(count);
73 
74  /*
75  A[0][0] = xxsum;
76  A[0][1] = xysum;
77  A[0][2] = xzsum;
78  A[1][0] = xysum;
79  A[1][1] = yysum;
80  A[1][2] = yzsum;
81  A[2][0] = xzsum;
82  A[2][1] = yzsum;
83  A[2][2] = zzsum;
84  */
85 
86  // should be sorted
87  eigen_decomposition(A, V[0], V[1], V[2], d);
88 
89  v1 = Point3d((float)V[0][2], (float)V[1][2], (float)V[2][2]).normalize();
90  v2 = Point3d((float)V[0][1], (float)V[1][1], (float)V[2][1]).normalize();
91  v3 = Point3d((float)V[0][0], (float)V[1][0], (float)V[2][0]).normalize();
92 
93  cg.x = (float)(xsum / count);
94  cg.y = (float)(ysum / count);
95  cg.z = (float)(zsum / count);
96 
97  d1 = (float)d[2];
98  d2 = (float)d[1];
99  d3 = (float)d[0];
100  }
101 
102  private:
103  static void eigen_decomposition(double A[3][3], double V0[], double V1[], double V2[], double d[]);
104 };
105 
106 } // namespace aliceVision
aliceVision::Point3d
Definition: Point3d.hpp:24
aliceVision::Stat3d
Definition: Stat3d.hpp:13
aliceVision
Definition: checkerDetector.cpp:32