From dddda0e6749c352f04f11ef2874a709ee83bf0d1 Mon Sep 17 00:00:00 2001 From: Sebastian Hahta <joseha@utu.fi> Date: Fri, 12 Jul 2019 12:18:11 +0300 Subject: [PATCH] statistics: percent of samples with valid values --- applications/gui/src/camera.cpp | 41 +++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/applications/gui/src/camera.cpp b/applications/gui/src/camera.cpp index 31620c395..2e50ce265 100644 --- a/applications/gui/src/camera.cpp +++ b/applications/gui/src/camera.cpp @@ -11,19 +11,37 @@ using ftl::gui::PoseWindow; // TODO(Nick) MOVE class StatisticsImage { private: - cv::Mat data_; - cv::Size size_; - float max_f_; + cv::Mat data_; // CV_32FC3, channels: m, s, f + cv::Size size_; // image size + float n_; // total number of samples public: StatisticsImage(cv::Size size); StatisticsImage(cv::Size size, float max_f); + /* @brief reset all statistics to 0 + */ void reset(); + + /* @brief update statistics with new values + */ void update(const cv::Mat &in); + + /* @brief variance (depth) + */ void getVariance(cv::Mat &out); + + /* @brief standard deviation (depth) + */ void getStdDev(cv::Mat &out); + + /* @brief mean value (depth) + */ void getMean(cv::Mat &out); + + /* @brief percent of samples having valid depth value + */ + void getValidRatio(cv::Mat &out); }; StatisticsImage::StatisticsImage(cv::Size size) : @@ -31,24 +49,27 @@ StatisticsImage::StatisticsImage(cv::Size size) : StatisticsImage::StatisticsImage(cv::Size size, float max_f) { size_ = size; - // channels: m, s, f + n_ = 0.0f; data_ = cv::Mat(size, CV_32FC3, cv::Scalar(0.0, 0.0, 0.0)); - max_f_ = max_f; + // TODO - if (!std::isinf(max_f_)) { + if (!std::isinf(max_f)) { LOG(WARNING) << "TODO: max_f_ not used. Values calculated for all samples"; } } void StatisticsImage::reset() { + n_ = 0.0f; data_ = cv::Scalar(0.0, 0.0, 0.0); } void StatisticsImage::update(const cv::Mat &in) { DCHECK(in.type() == CV_32F); DCHECK(in.size() == size_); - // Welford's Method + + n_ = n_ + 1.0f; + // Welford's Method for (int row = 0; row < in.rows; row++) { float* ptr_data = data_.ptr<float>(row); const float* ptr_in = in.ptr<float>(row); @@ -86,6 +107,12 @@ void StatisticsImage::getMean(cv::Mat &out) { out = channels[0]; } +void StatisticsImage::getValidRatio(cv::Mat &out) { + std::vector<cv::Mat> channels(3); + cv::split(data_, channels); + cv::divide(channels[2], n_, out); +} + static Eigen::Affine3d create_rotation_matrix(float ax, float ay, float az) { Eigen::Affine3d rx = Eigen::Affine3d(Eigen::AngleAxisd(ax, Eigen::Vector3d(1, 0, 0))); -- GitLab