From 8ec3db2450e7c5a07cbc2aa822924d75396d8565 Mon Sep 17 00:00:00 2001 From: Phuntsok Drak-pa Date: Thu, 25 Apr 2019 01:37:35 +0200 Subject: [PATCH] Doc update, better member initialization, removed unused lines --- include/genimg/methods.hh | 37 +++++++++++++++++++------------------ src/methods.cc | 30 ++++++++++++++++++++++++++---- 2 files changed, 45 insertions(+), 22 deletions(-) diff --git a/include/genimg/methods.hh b/include/genimg/methods.hh index 48f35bf..d2d86e5 100644 --- a/include/genimg/methods.hh +++ b/include/genimg/methods.hh @@ -59,6 +59,8 @@ class ImageManipulator { protected: private: + // methods ////////////////////////////////////////////////////////////////// + /// \brief Calculates the euclidian distance between two images [[nodiscard]] auto euclidian_distance(cv::Mat const& t_img) const noexcept -> double; @@ -70,9 +72,8 @@ class ImageManipulator { [[nodiscard]] auto get_controlled_square_values() const noexcept; /// \brief Generates a candidate for image generation improvement [[nodiscard]] auto create_candidate(bool const t_controlled_size) const; - + /// \brief Generates organized views of the reference image for method 5 [[nodiscard]] auto generate_tiles(int const t_cols, int const t_rows) const; - /// \brief Gets all colors from the reference image void get_color_set(); /// \brief Threaded helper for \ref get_color_set @@ -84,9 +85,8 @@ class ImageManipulator { cv::Scalar const& t_color) const; /// \brief Update this object’s generated image void update_gen_image(cv::Mat const& t_img, double const t_diff); - + /// \brief Merges tiles generated by method5 void merge_tiles(std::vector> t_tiles); - /// \brief First method as described in the /// [report](https://labs.phundrak.fr/phundrak/genetic-images/blob/master/report/report.pdf) void method1(); @@ -106,20 +106,21 @@ class ImageManipulator { int const rows, int const submethod); - std::vector> colors_ - = std::vector>{}; /*!< Color set from reference */ - cv::Mat const reference_; /*!< Reference image */ - cv::Mat generated_image_ - = cv::Mat{reference_.size().height, reference_.size().width, CV_8UC3, - cv::Scalar(0, 0, 0)}; /*!< Working, generated image */ - mutable std::mutex colors_mutex_ - = std::mutex{}; /*!< Thread mutex for color set generation */ + // members ////////////////////////////////////////////////////////////////// + + std::vector> colors_{}; /*!< Color set from reference */ + cv::Mat const reference_{}; /*!< Reference image */ + cv::Mat generated_image_{ + reference_.size().height, reference_.size().width, CV_8UC3, + cv::Scalar(0, 0, 0)}; /*!< Working, generated image */ + mutable std::mutex + colors_mutex_{}; /*!< Thread mutex for color set generation */ std::string const output_path_{""}; /*!< Write path for the generated image */ - double diff_ = euclidian_distance(generated_image_); /*!< Euclidian difference + double diff_{euclidian_distance(generated_image_)}; /*!< Euclidian difference between \ref reference_ and \ref generated_image_ */ - int const total_iterations_ = 0; /*!< Number of iterations to perform */ - int remaining_iter_ - = total_iterations_; /*!< Remaining iterations to perform */ - int const width_ = reference_.size().width; /*!< Width of the image */ - int const height_ = reference_.size().height; /*!< Height of the image */ + int const total_iterations_{0}; /*!< Number of iterations to perform */ + int remaining_iter_{ + total_iterations_}; /*!< Remaining iterations to perform */ + int const width_{reference_.size().width}; /*!< Width of the image */ + int const height_{reference_.size().height}; /*!< Height of the image */ }; diff --git a/src/methods.cc b/src/methods.cc index 21be98f..5026d56 100644 --- a/src/methods.cc +++ b/src/methods.cc @@ -9,7 +9,11 @@ #include #include -auto const thread_nbr = std::thread::hardware_concurrency(); +static auto const thread_nbr = std::thread::hardware_concurrency(); + +/////////////////////////////////////////////////////////////////////////////// +// Public // +/////////////////////////////////////////////////////////////////////////////// // constructors /////////////////////////////////////////////////////////////// /** @@ -185,7 +189,11 @@ void ImageManipulator::write_file() const cv::imwrite(output_path_, generated_image_); } -// private methods //////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +// Private // +/////////////////////////////////////////////////////////////////////////////// + +// methods //////////////////////////////////////////////////////////////////// /** * Calculates the euclidian distance between the reference image and the image @@ -281,6 +289,14 @@ void ImageManipulator::write_file() const : std::nullopt; } +/** + * Generates views and stores them in a double vector so the tiles (views) are + * stored by column top to bottom, and within the columns left to right. + * + * \param t_cols Number of columns the reference image should be divided into + * \param t_rows Number of rows the reference image should be divided into + * \return Collection of tiles (vector>) + */ [[nodiscard]] auto ImageManipulator::generate_tiles(int const t_cols, int const t_rows) const { @@ -388,6 +404,13 @@ void ImageManipulator::update_gen_image(cv::Mat const& t_img, spdlog::debug("remaining iter: {}\tdiff: {}", remaining_iter_, diff_); } +/** + * Merges the tiles generated by \ref method5 into a single image. The tiles + * are organized by column top to bottom, within each they are stored in order, + * left to right. They will be merged in \ref generated_image_. + * + * \param t_tiles Collection of tiles to be merged together + */ void ImageManipulator::merge_tiles( std::vector> t_tiles) { @@ -499,9 +522,8 @@ void ImageManipulator::method5(bool const t_controlled_size, int const t_submethod) { spdlog::debug("Beginning method5, initial difference: {}", diff_); - spdlog::debug("nb_total_iter: {}, nb_remaining_iter: {}", total_iterations_, - remaining_iter_); spdlog::debug("Running on {} threads", thread_nbr); + auto tiles = generate_tiles((t_cols != 0) ? t_cols : t_rows, t_rows); spdlog::debug("{} tiles", tiles.size());