00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 namespace pcl
00038 {
00039 template <typename real, int dimension>
00040 VectorAverage<real, dimension>::VectorAverage () :
00041 noOfSamples_ (0), accumulatedWeight_ (0),
00042 mean_ (Eigen::Matrix<real, dimension, 1>::Identity ()),
00043 covariance_ (Eigen::Matrix<real, dimension, dimension>::Identity ())
00044 {
00045 reset();
00046 }
00047
00048 template <typename real, int dimension>
00049 inline void VectorAverage<real, dimension>::reset()
00050 {
00051 noOfSamples_ = 0;
00052 accumulatedWeight_ = 0.0;
00053 mean_.fill(0);
00054 covariance_.fill(0);
00055 }
00056
00057 template <typename real, int dimension>
00058 inline void VectorAverage<real, dimension>::add(const Eigen::Matrix<real, dimension, 1>& sample, real weight) {
00059 if (weight == 0.0f)
00060 return;
00061
00062 ++noOfSamples_;
00063 accumulatedWeight_ += weight;
00064 real alpha = weight/accumulatedWeight_;
00065
00066 Eigen::Matrix<real, dimension, 1> diff = sample - mean_;
00067 covariance_ = (1.0f-alpha)*(covariance_ + alpha * (diff * diff.transpose()));
00068
00069 mean_ += alpha*(diff);
00070
00071
00072
00073
00074
00075
00076 }
00077
00078 template <typename real, int dimension>
00079 inline void VectorAverage<real, dimension>::doPCA(Eigen::Matrix<real, dimension, 1>& eigen_values, Eigen::Matrix<real, dimension, 1>& eigen_vector1,
00080 Eigen::Matrix<real, dimension, 1>& eigen_vector2, Eigen::Matrix<real, dimension, 1>& eigen_vector3) const
00081 {
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093 Eigen::SelfAdjointEigenSolver<Eigen::Matrix<real, dimension, dimension> > ei_symm(covariance_);
00094 eigen_values = ei_symm.eigenvalues();
00095 Eigen::Matrix<real, dimension, dimension> eigen_vectors = ei_symm.eigenvectors();
00096
00097 eigen_vector1 = eigen_vectors.col(0);
00098 eigen_vector2 = eigen_vectors.col(1);
00099 eigen_vector3 = eigen_vectors.col(2);
00100 }
00101
00102 template <typename real, int dimension>
00103 inline void VectorAverage<real, dimension>::doPCA(Eigen::Matrix<real, dimension, 1>& eigen_values) const
00104 {
00105
00106
00107
00108
00109
00110
00111 Eigen::SelfAdjointEigenSolver<Eigen::Matrix<real, dimension, dimension> > ei_symm(covariance_, false);
00112 eigen_values = ei_symm.eigenvalues();
00113 }
00114
00115 template <typename real, int dimension>
00116 inline void VectorAverage<real, dimension>::getEigenVector1(Eigen::Matrix<real, dimension, 1>& eigen_vector1) const
00117 {
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129 Eigen::SelfAdjointEigenSolver<Eigen::Matrix<real, dimension, dimension> > ei_symm(covariance_);
00130 Eigen::Matrix<real, dimension, dimension> eigen_vectors = ei_symm.eigenvectors();
00131 eigen_vector1 = eigen_vectors.col(0);
00132 }
00133
00134
00136
00139
00141 template <>
00142 inline void VectorAverage<float, 3>::doPCA(Eigen::Matrix<float, 3, 1>& eigen_values, Eigen::Matrix<float, 3, 1>& eigen_vector1,
00143 Eigen::Matrix<float, 3, 1>& eigen_vector2, Eigen::Matrix<float, 3, 1>& eigen_vector3) const
00144 {
00145
00146 Eigen::Matrix<float, 3, 3> eigen_vectors;
00147 eigen33(covariance_, eigen_vectors, eigen_values);
00148 eigen_vector1 = eigen_vectors.col(0);
00149 eigen_vector2 = eigen_vectors.col(1);
00150 eigen_vector3 = eigen_vectors.col(2);
00151 }
00152 template <>
00153 inline void VectorAverage<float, 3>::doPCA(Eigen::Matrix<float, 3, 1>& eigen_values) const
00154 {
00155
00156 computeRoots (covariance_, eigen_values);
00157 }
00158 template <>
00159 inline void VectorAverage<float, 3>::getEigenVector1(Eigen::Matrix<float, 3, 1>& eigen_vector1) const
00160 {
00161
00162 Eigen::Vector3f::Scalar eigen_value;
00163 Eigen::Vector3f eigen_vector;
00164 eigen33(covariance_, eigen_value, eigen_vector);
00165 eigen_vector1 = eigen_vector;
00166 }
00167
00169
00171 template <>
00172 inline void VectorAverage<double, 3>::doPCA(Eigen::Matrix<double, 3, 1>& eigen_values, Eigen::Matrix<double, 3, 1>& eigen_vector1,
00173 Eigen::Matrix<double, 3, 1>& eigen_vector2, Eigen::Matrix<double, 3, 1>& eigen_vector3) const
00174 {
00175
00176 Eigen::Matrix<double, 3, 3> eigen_vectors;
00177 eigen33(covariance_, eigen_vectors, eigen_values);
00178 eigen_vector1 = eigen_vectors.col(0);
00179 eigen_vector2 = eigen_vectors.col(1);
00180 eigen_vector3 = eigen_vectors.col(2);
00181 }
00182 template <>
00183 inline void VectorAverage<double, 3>::doPCA(Eigen::Matrix<double, 3, 1>& eigen_values) const
00184 {
00185
00186 computeRoots (covariance_, eigen_values);
00187 }
00188 template <>
00189 inline void VectorAverage<double, 3>::getEigenVector1(Eigen::Matrix<double, 3, 1>& eigen_vector1) const
00190 {
00191
00192 Eigen::Vector3d::Scalar eigen_value;
00193 Eigen::Vector3d eigen_vector;
00194 eigen33(covariance_, eigen_value, eigen_vector);
00195 eigen_vector1 = eigen_vector;
00196 }
00197 }
00198