25 #include "eos/morphablemodel/io/mat_cerealisation.hpp" 26 #include "cereal/access.hpp" 27 #include "cereal/types/array.hpp" 28 #include "cereal/types/vector.hpp" 30 #include "opencv2/core/core.hpp" 39 namespace morphablemodel {
72 PcaModel(cv::Mat mean, cv::Mat pca_basis, cv::Mat eigenvalues, std::vector<std::array<int, 3>> triangle_list) : mean(mean), normalised_pca_basis(pca_basis), eigenvalues(eigenvalues), triangle_list(triangle_list)
74 const auto seed = std::random_device()();
87 return normalised_pca_basis.cols;
101 return normalised_pca_basis.rows;
111 return triangle_list;
133 return cv::Vec4f(mean.at<
float>(vertex_index), mean.at<
float>(vertex_index + 1), mean.at<
float>(vertex_index + 2), 1.0f);
145 std::normal_distribution<float> distribution(0.0f, sigma);
149 for (
auto&& a : alphas) {
150 a = distribution(engine);
170 cv::Mat alphas(coefficients);
172 cv::Mat model_sample = mean + normalised_pca_basis * alphas;
190 return normalised_pca_basis.clone();
205 return normalised_pca_basis.rowRange(vertex_id, vertex_id + 3);
220 return unnormalised_pca_basis.clone();
234 return unnormalised_pca_basis.rowRange(vertex_id, vertex_id + 3);
246 return eigenvalues.at<
float>(index);
253 cv::Mat normalised_pca_basis;
254 cv::Mat unnormalised_pca_basis;
257 std::vector<std::array<int, 3>> triangle_list;
259 friend class cereal::access;
265 template<
class Archive>
266 void serialize(Archive& archive)
268 archive(mean, normalised_pca_basis, unnormalised_pca_basis, eigenvalues, triangle_list);
288 Mat normalised_basis(unnormalised_basis.size(), unnormalised_basis.type());
289 Mat sqrt_of_eigenvalues = eigenvalues.clone();
290 for (
int i = 0; i < eigenvalues.rows; ++i) {
291 sqrt_of_eigenvalues.at<
float>(i) = std::sqrt(eigenvalues.at<
float>(i));
294 for (
int basis = 0; basis < unnormalised_basis.cols; ++basis) {
295 Mat normalised_eigenvector = unnormalised_basis.col(basis).mul(sqrt_of_eigenvalues.at<
float>(basis));
296 normalised_eigenvector.copyTo(normalised_basis.col(basis));
299 return normalised_basis;
315 Mat unnormalised_basis(normalised_basis.size(), normalised_basis.type());
316 Mat one_over_sqrt_of_eigenvalues = eigenvalues.clone();
317 for (
int i = 0; i < eigenvalues.rows; ++i) {
318 one_over_sqrt_of_eigenvalues.at<
float>(i) = 1.0f / std::sqrt(eigenvalues.at<
float>(i));
321 for (
int basis = 0; basis < normalised_basis.cols; ++basis) {
322 Mat unnormalised_eigenvector = normalised_basis.col(basis).mul(one_over_sqrt_of_eigenvalues.at<
float>(basis));
323 unnormalised_eigenvector.copyTo(unnormalised_basis.col(basis));
326 return unnormalised_basis;
This class represents a PCA-model that consists of:
Definition: PcaModel.hpp:55
cv::Mat get_normalised_pca_basis() const
Definition: PcaModel.hpp:188
cv::Mat draw_sample(float sigma=1.0f)
Definition: PcaModel.hpp:143
int get_num_principal_components() const
Definition: PcaModel.hpp:84
cv::Mat unnormalise_pca_basis(cv::Mat normalised_basis, cv::Mat eigenvalues)
Definition: PcaModel.hpp:312
int get_data_dimension() const
Definition: PcaModel.hpp:98
cv::Mat draw_sample(std::vector< float > coefficients) const
Definition: PcaModel.hpp:164
cv::Mat get_unnormalised_pca_basis(int vertex_id) const
Definition: PcaModel.hpp:230
std::vector< std::array< int, 3 > > get_triangle_list() const
Definition: PcaModel.hpp:109
float get_eigenvalue(int index) const
Definition: PcaModel.hpp:243
Namespace containing all of eos's 3D model fitting functionality.
cv::Mat normalise_pca_basis(cv::Mat unnormalised_basis, cv::Mat eigenvalues)
Definition: PcaModel.hpp:285
cv::Mat get_normalised_pca_basis(int vertex_id) const
Definition: PcaModel.hpp:201
cv::Mat get_unnormalised_pca_basis() const
Definition: PcaModel.hpp:218
PcaModel(cv::Mat mean, cv::Mat pca_basis, cv::Mat eigenvalues, std::vector< std::array< int, 3 >> triangle_list)
Definition: PcaModel.hpp:72
cv::Mat get_mean() const
Definition: PcaModel.hpp:119
cv::Vec4f get_mean_at_point(int vertex_index) const
Definition: PcaModel.hpp:130