From 81d1055af64d83ab8f43b64db3732297596bfab1 Mon Sep 17 00:00:00 2001 From: Sunita Nayak Date: Thu, 24 Oct 2019 07:22:48 -0700 Subject: [PATCH 01/11] Computer Vision based Alpha Matting Code alpha matting code This is a combination of 3 commits. removed whitespaces addressed issues raised in the PR removed whitespaces --- modules/README.md | 2 + modules/alphamat/CMakeLists.txt | 10 + modules/alphamat/README.md | 23 + modules/alphamat/doc/alphamat.bib | 26 + modules/alphamat/include/opencv2/alphamat.hpp | 59 + .../samples/information_flow_matting.cpp | 79 + .../alphamat/samples/input_images/plant.jpg | Bin 0 -> 274184 bytes .../samples/output_mattes/plant_result.jpg | Bin 0 -> 38338 bytes modules/alphamat/samples/trimaps/plant.png | Bin 0 -> 41874 bytes .../3rdparty/KDTreeVectorOfVectorsAdaptor.h | 117 + modules/alphamat/src/3rdparty/nanoflann.hpp | 2040 +++++++++++++++++ modules/alphamat/src/cm.cpp | 162 ++ modules/alphamat/src/cm.hpp | 28 + modules/alphamat/src/infoflow.cpp | 120 + modules/alphamat/src/intraU.cpp | 136 ++ modules/alphamat/src/intraU.hpp | 32 + modules/alphamat/src/local_info.cpp | 136 ++ modules/alphamat/src/local_info.hpp | 17 + modules/alphamat/src/precomp.hpp | 35 + .../tutorials/alphamat_tutorial.markdown | 53 + 20 files changed, 3075 insertions(+) create mode 100644 modules/alphamat/CMakeLists.txt create mode 100644 modules/alphamat/README.md create mode 100644 modules/alphamat/doc/alphamat.bib create mode 100644 modules/alphamat/include/opencv2/alphamat.hpp create mode 100644 modules/alphamat/samples/information_flow_matting.cpp create mode 100644 modules/alphamat/samples/input_images/plant.jpg create mode 100644 modules/alphamat/samples/output_mattes/plant_result.jpg create mode 100755 modules/alphamat/samples/trimaps/plant.png create mode 100644 modules/alphamat/src/3rdparty/KDTreeVectorOfVectorsAdaptor.h create mode 100644 modules/alphamat/src/3rdparty/nanoflann.hpp create mode 100644 modules/alphamat/src/cm.cpp create mode 100644 modules/alphamat/src/cm.hpp create mode 100644 modules/alphamat/src/infoflow.cpp create mode 100644 modules/alphamat/src/intraU.cpp create mode 100644 modules/alphamat/src/intraU.hpp create mode 100644 modules/alphamat/src/local_info.cpp create mode 100644 modules/alphamat/src/local_info.hpp create mode 100644 modules/alphamat/src/precomp.hpp create mode 100644 modules/alphamat/tutorials/alphamat_tutorial.markdown diff --git a/modules/README.md b/modules/README.md index 3f8dc5e42a3..b333043277b 100644 --- a/modules/README.md +++ b/modules/README.md @@ -10,6 +10,8 @@ $ cmake -D OPENCV_EXTRA_MODULES_PATH=/modules -D BUILD_opencv_ +#include "opencv2/highgui.hpp" +#include +#include +#include + +using namespace std; +using namespace cv; +using namespace cv::alphamat; + +const char* keys = +{ + "{img || input image name}" + "{tri || input trimap image name}" + "{out || output image name}" +}; + +int main(int argc, char *argv[]) +{ + bool show_help = (argc == 1); + show_help = show_help || (argc == 2 && string(argv[1]) == "--help"); + show_help = show_help || (argc == 2 && string(argv[1]) == "-h"); + + if (show_help) + { + printf("\nThis sample demonstrates Information Flow Alpha Matting\n" + "Call:\n" + " %s -img= -tri= [-out=]\n\n", argv[0]); + return 0; + } + + CommandLineParser parser(argc, argv, keys); + if (!parser.check()) + { + parser.printErrors(); + return -1; + } + + string img_path = parser.get("img"); + string trimap_path = parser.get("tri"); + string result_path = parser.get("out"); + + Mat image, tmap; + + image = imread(img_path, IMREAD_COLOR); // Read the input image file + if (image.empty()) + { + printf("Cannot read image file: %s\n", img_path.c_str()); + return -1; + } + + tmap = imread(trimap_path, IMREAD_GRAYSCALE); + if (tmap.empty()) + { + printf("Cannot read trimap file: %s\n", trimap_path.c_str()); + return -1; + } + + Mat result; + infoFlow(image, tmap, result); + + if (result_path.empty()) + { + namedWindow("result alpha matte", WINDOW_NORMAL); + imshow("result alpha matte", result); + waitKey(0); + } + else + { + imwrite(result_path, result); + } + + return 0; + +} diff --git a/modules/alphamat/samples/input_images/plant.jpg b/modules/alphamat/samples/input_images/plant.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c6f309533976f7bf8a63145de1653ddaf6171d18 GIT binary patch literal 274184 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
YI}f2y)oTMY7g3eb`BoZ?|T?klADIZe^Pc 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�DB9C6%c2 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 bVJ@{x{%xbI??ZN*}sEux}QWY5ZR}}AERXT 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

Tm&ka%V$$oJlj+abxAo89IldQNVrFD=@;Qb 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 literal 0 HcmV?d00001 diff --git a/modules/alphamat/samples/output_mattes/plant_result.jpg b/modules/alphamat/samples/output_mattes/plant_result.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4ec7e29c6b049aa870da9e00ffa3fa90cfdd6ce8 GIT binary patch literal 38338 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�r7fdEGqFcUUkMg43 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 DLy22# literal 0 HcmV?d00001 diff --git a/modules/alphamat/samples/trimaps/plant.png b/modules/alphamat/samples/trimaps/plant.png new file mode 100755 index 0000000000000000000000000000000000000000..6c646b9192d726ff9fee86e42195ae4d97bd3b72 GIT binary patch literal 41874 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 + +// ===== This example shows how to use nanoflann with these types of containers: ======= +//typedef std::vector > my_vector_of_vectors_t; +//typedef std::vector my_vector_of_vectors_t; // This requires #include +// ===================================================================================== + + +/** A simple vector-of-vectors adaptor for nanoflann, without duplicating the storage. + * The i'th vector represents a point in the state space. + * + * \tparam DIM If set to >0, it specifies a compile-time fixed dimensionality for the points in the data set, allowing more compiler optimizations. + * \tparam num_t The type of the point coordinates (typically, double or float). + * \tparam Distance The distance metric to use: nanoflann::metric_L1, nanoflann::metric_L2, nanoflann::metric_L2_Simple, etc. + * \tparam IndexType The type for indices in the KD-tree index (typically, size_t of int) + */ +template +struct KDTreeVectorOfVectorsAdaptor +{ + typedef KDTreeVectorOfVectorsAdaptor self_t; + typedef typename Distance::template traits::distance_t metric_t; + typedef nanoflann::KDTreeSingleIndexAdaptor< metric_t, self_t, DIM, IndexType> index_t; + + index_t* index; //! The kd-tree index for the user to call its methods as usual with any other FLANN index. + + /// Constructor: takes a const ref to the vector of vectors object with the data points + KDTreeVectorOfVectorsAdaptor(const size_t /* dimensionality */, const VectorOfVectorsType &mat, const int leaf_max_size = 10) : m_data(mat) + { + assert(mat.size() != 0 && mat[0].size() != 0); + const size_t dims = mat[0].size(); + if (DIM>0 && static_cast(dims) != DIM) + throw std::runtime_error("Data set dimensionality does not match the 'DIM' template argument"); + index = new index_t( static_cast(dims), *this /* adaptor */, nanoflann::KDTreeSingleIndexAdaptorParams(leaf_max_size ) ); + index->buildIndex(); + } + + ~KDTreeVectorOfVectorsAdaptor() { + delete index; + } + + const VectorOfVectorsType &m_data; + + /** Query for the \a num_closest closest points to a given point (entered as query_point[0:dim-1]). + * Note that this is a short-cut method for index->findNeighbors(). + * The user can also call index->... methods as desired. + * \note nChecks_IGNORED is ignored but kept for compatibility with the original FLANN interface. + */ + //inline void query(const num_t *query_point, const size_t num_closest, IndexType *out_indices, num_t *out_distances_sq, const int nChecks_IGNORED = 10) const + inline void query(const num_t *query_point, const size_t num_closest, IndexType *out_indices, num_t *out_distances_sq) const + { + nanoflann::KNNResultSet resultSet(num_closest); + resultSet.init(out_indices, out_distances_sq); + index->findNeighbors(resultSet, query_point, nanoflann::SearchParams()); + } + + /** @name Interface expected by KDTreeSingleIndexAdaptor + * @{ */ + + const self_t & derived() const { + return *this; + } + self_t & derived() { + return *this; + } + + // Must return the number of data points + inline size_t kdtree_get_point_count() const { + return m_data.size(); + } + + // Returns the dim'th component of the idx'th point in the class: + inline num_t kdtree_get_pt(const size_t idx, const size_t dim) const { + return m_data[idx][dim]; + } + + // Optional bounding-box computation: return false to default to a standard bbox computation loop. + // Return true if the BBOX was already computed by the class and returned in "bb" so it can be avoided to redo it again. + // Look at bb.size() to find out the expected dimensionality (e.g. 2 or 3 for point clouds) + template + bool kdtree_get_bbox(BBOX & /*bb*/) const { + return false; + } + + /** @} */ +}; // end of KDTreeVectorOfVectorsAdaptor diff --git a/modules/alphamat/src/3rdparty/nanoflann.hpp b/modules/alphamat/src/3rdparty/nanoflann.hpp new file mode 100644 index 00000000000..a8e4667dda6 --- /dev/null +++ b/modules/alphamat/src/3rdparty/nanoflann.hpp @@ -0,0 +1,2040 @@ +/*********************************************************************** + * Software License Agreement (BSD License) + * + * Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved. + * Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved. + * Copyright 2011-2016 Jose Luis Blanco (joseluisblancoc@gmail.com). + * All rights reserved. + * + * THE BSD LICENSE + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *************************************************************************/ + +/** \mainpage nanoflann C++ API documentation + * nanoflann is a C++ header-only library for building KD-Trees, mostly + * optimized for 2D or 3D point clouds. + * + * nanoflann does not require compiling or installing, just an + * #include in your code. + * + * See: + * - C++ API organized by modules + * - Online README + * - Doxygen + * documentation + */ + +#ifndef NANOFLANN_HPP_ +#define NANOFLANN_HPP_ + +#include +#include +#include +#include // for abs() +#include // for fwrite() +#include // for abs() +#include +#include // std::reference_wrapper +#include +#include + +/** Library version: 0xMmP (M=Major,m=minor,P=patch) */ +#define NANOFLANN_VERSION 0x132 + +// Avoid conflicting declaration of min/max macros in windows headers +#if !defined(NOMINMAX) && \ + (defined(_WIN32) || defined(_WIN32_) || defined(WIN32) || defined(_WIN64)) +#define NOMINMAX +#ifdef max +#undef max +#undef min +#endif +#endif + +namespace nanoflann { +/** @addtogroup nanoflann_grp nanoflann C++ library for ANN + * @{ */ + +/** the PI constant (required to avoid MSVC missing symbols) */ +template T pi_const() { + return static_cast(3.14159265358979323846); +} + +/** + * Traits if object is resizable and assignable (typically has a resize | assign + * method) + */ +template struct has_resize : std::false_type {}; + +template +struct has_resize().resize(1), 0)> + : std::true_type {}; + +template struct has_assign : std::false_type {}; + +template +struct has_assign().assign(1, 0), 0)> + : std::true_type {}; + +/** + * Free function to resize a resizable object + */ +template +inline typename std::enable_if::value, void>::type +resize(Container &c, const size_t nElements) { + c.resize(nElements); +} + +/** + * Free function that has no effects on non resizable containers (e.g. + * std::array) It raises an exception if the expected size does not match + */ +template +inline typename std::enable_if::value, void>::type +resize(Container &c, const size_t nElements) { + if (nElements != c.size()) + throw std::logic_error("Try to change the size of a std::array."); +} + +/** + * Free function to assign to a container + */ +template +inline typename std::enable_if::value, void>::type +assign(Container &c, const size_t nElements, const T &value) { + c.assign(nElements, value); +} + +/** + * Free function to assign to a std::array + */ +template +inline typename std::enable_if::value, void>::type +assign(Container &c, const size_t nElements, const T &value) { + for (size_t i = 0; i < nElements; i++) + c[i] = value; +} + +/** @addtogroup result_sets_grp Result set classes + * @{ */ +template +class KNNResultSet { +public: + typedef _DistanceType DistanceType; + typedef _IndexType IndexType; + typedef _CountType CountType; + +private: + IndexType *indices; + DistanceType *dists; + CountType capacity; + CountType count; + +public: + inline KNNResultSet(CountType capacity_) + : indices(0), dists(0), capacity(capacity_), count(0) {} + + inline void init(IndexType *indices_, DistanceType *dists_) { + indices = indices_; + dists = dists_; + count = 0; + if (capacity) + dists[capacity - 1] = (std::numeric_limits::max)(); + } + + inline CountType size() const { return count; } + + inline bool full() const { return count == capacity; } + + /** + * Called during search to add an element matching the criteria. + * @return true if the search should be continued, false if the results are + * sufficient + */ + inline bool addPoint(DistanceType dist, IndexType index) { + CountType i; + for (i = count; i > 0; --i) { +#ifdef NANOFLANN_FIRST_MATCH // If defined and two points have the same + // distance, the one with the lowest-index will be + // returned first. + if ((dists[i - 1] > dist) || + ((dist == dists[i - 1]) && (indices[i - 1] > index))) { +#else + if (dists[i - 1] > dist) { +#endif + if (i < capacity) { + dists[i] = dists[i - 1]; + indices[i] = indices[i - 1]; + } + } else + break; + } + if (i < capacity) { + dists[i] = dist; + indices[i] = index; + } + if (count < capacity) + count++; + + // tell caller that the search shall continue + return true; + } + + inline DistanceType worstDist() const { return dists[capacity - 1]; } +}; + +/** operator "<" for std::sort() */ +struct IndexDist_Sorter { + /** PairType will be typically: std::pair */ + template + inline bool operator()(const PairType &p1, const PairType &p2) const { + return p1.second < p2.second; + } +}; + +/** + * A result-set class used when performing a radius based search. + */ +template +class RadiusResultSet { +public: + typedef _DistanceType DistanceType; + typedef _IndexType IndexType; + +public: + const DistanceType radius; + + std::vector> &m_indices_dists; + + inline RadiusResultSet( + DistanceType radius_, + std::vector> &indices_dists) + : radius(radius_), m_indices_dists(indices_dists) { + init(); + } + + inline void init() { clear(); } + inline void clear() { m_indices_dists.clear(); } + + inline size_t size() const { return m_indices_dists.size(); } + + inline bool full() const { return true; } + + /** + * Called during search to add an element matching the criteria. + * @return true if the search should be continued, false if the results are + * sufficient + */ + inline bool addPoint(DistanceType dist, IndexType index) { + if (dist < radius) + m_indices_dists.push_back(std::make_pair(index, dist)); + return true; + } + + inline DistanceType worstDist() const { return radius; } + + /** + * Find the worst result (furtherest neighbor) without copying or sorting + * Pre-conditions: size() > 0 + */ + std::pair worst_item() const { + if (m_indices_dists.empty()) + throw std::runtime_error("Cannot invoke RadiusResultSet::worst_item() on " + "an empty list of results."); + typedef + typename std::vector>::const_iterator + DistIt; + DistIt it = std::max_element(m_indices_dists.begin(), m_indices_dists.end(), + IndexDist_Sorter()); + return *it; + } +}; + +/** @} */ + +/** @addtogroup loadsave_grp Load/save auxiliary functions + * @{ */ +template +void save_value(FILE *stream, const T &value, size_t count = 1) { + fwrite(&value, sizeof(value), count, stream); +} + +template +void save_value(FILE *stream, const std::vector &value) { + size_t size = value.size(); + fwrite(&size, sizeof(size_t), 1, stream); + fwrite(&value[0], sizeof(T), size, stream); +} + +template +void load_value(FILE *stream, T &value, size_t count = 1) { + size_t read_cnt = fread(&value, sizeof(value), count, stream); + if (read_cnt != count) { + throw std::runtime_error("Cannot read from file"); + } +} + +template void load_value(FILE *stream, std::vector &value) { + size_t size; + size_t read_cnt = fread(&size, sizeof(size_t), 1, stream); + if (read_cnt != 1) { + throw std::runtime_error("Cannot read from file"); + } + value.resize(size); + read_cnt = fread(&value[0], sizeof(T), size, stream); + if (read_cnt != size) { + throw std::runtime_error("Cannot read from file"); + } +} +/** @} */ + +/** @addtogroup metric_grp Metric (distance) classes + * @{ */ + +struct Metric {}; + +/** Manhattan distance functor (generic version, optimized for + * high-dimensionality data sets). Corresponding distance traits: + * nanoflann::metric_L1 \tparam T Type of the elements (e.g. double, float, + * uint8_t) \tparam _DistanceType Type of distance variables (must be signed) + * (e.g. float, double, int64_t) + */ +template +struct L1_Adaptor { + typedef T ElementType; + typedef _DistanceType DistanceType; + + const DataSource &data_source; + + L1_Adaptor(const DataSource &_data_source) : data_source(_data_source) {} + + inline DistanceType evalMetric(const T *a, const size_t b_idx, size_t size, + DistanceType worst_dist = -1) const { + DistanceType result = DistanceType(); + const T *last = a + size; + const T *lastgroup = last - 3; + size_t d = 0; + + /* Process 4 items with each loop for efficiency. */ + while (a < lastgroup) { + const DistanceType diff0 = + std::abs(a[0] - data_source.kdtree_get_pt(b_idx, d++)); + const DistanceType diff1 = + std::abs(a[1] - data_source.kdtree_get_pt(b_idx, d++)); + const DistanceType diff2 = + std::abs(a[2] - data_source.kdtree_get_pt(b_idx, d++)); + const DistanceType diff3 = + std::abs(a[3] - data_source.kdtree_get_pt(b_idx, d++)); + result += diff0 + diff1 + diff2 + diff3; + a += 4; + if ((worst_dist > 0) && (result > worst_dist)) { + return result; + } + } + /* Process last 0-3 components. Not needed for standard vector lengths. */ + while (a < last) { + result += std::abs(*a++ - data_source.kdtree_get_pt(b_idx, d++)); + } + return result; + } + + template + inline DistanceType accum_dist(const U a, const V b, const size_t) const { + return std::abs(a - b); + } +}; + +/** Squared Euclidean distance functor (generic version, optimized for + * high-dimensionality data sets). Corresponding distance traits: + * nanoflann::metric_L2 \tparam T Type of the elements (e.g. double, float, + * uint8_t) \tparam _DistanceType Type of distance variables (must be signed) + * (e.g. float, double, int64_t) + */ +template +struct L2_Adaptor { + typedef T ElementType; + typedef _DistanceType DistanceType; + + const DataSource &data_source; + + L2_Adaptor(const DataSource &_data_source) : data_source(_data_source) {} + + inline DistanceType evalMetric(const T *a, const size_t b_idx, size_t size, + DistanceType worst_dist = -1) const { + DistanceType result = DistanceType(); + const T *last = a + size; + const T *lastgroup = last - 3; + size_t d = 0; + + /* Process 4 items with each loop for efficiency. */ + while (a < lastgroup) { + const DistanceType diff0 = a[0] - data_source.kdtree_get_pt(b_idx, d++); + const DistanceType diff1 = a[1] - data_source.kdtree_get_pt(b_idx, d++); + const DistanceType diff2 = a[2] - data_source.kdtree_get_pt(b_idx, d++); + const DistanceType diff3 = a[3] - data_source.kdtree_get_pt(b_idx, d++); + result += diff0 * diff0 + diff1 * diff1 + diff2 * diff2 + diff3 * diff3; + a += 4; + if ((worst_dist > 0) && (result > worst_dist)) { + return result; + } + } + /* Process last 0-3 components. Not needed for standard vector lengths. */ + while (a < last) { + const DistanceType diff0 = *a++ - data_source.kdtree_get_pt(b_idx, d++); + result += diff0 * diff0; + } + return result; + } + + template + inline DistanceType accum_dist(const U a, const V b, const size_t) const { + return (a - b) * (a - b); + } +}; + +/** Squared Euclidean (L2) distance functor (suitable for low-dimensionality + * datasets, like 2D or 3D point clouds) Corresponding distance traits: + * nanoflann::metric_L2_Simple \tparam T Type of the elements (e.g. double, + * float, uint8_t) \tparam _DistanceType Type of distance variables (must be + * signed) (e.g. float, double, int64_t) + */ +template +struct L2_Simple_Adaptor { + typedef T ElementType; + typedef _DistanceType DistanceType; + + const DataSource &data_source; + + L2_Simple_Adaptor(const DataSource &_data_source) + : data_source(_data_source) {} + + inline DistanceType evalMetric(const T *a, const size_t b_idx, + size_t size) const { + DistanceType result = DistanceType(); + for (size_t i = 0; i < size; ++i) { + const DistanceType diff = a[i] - data_source.kdtree_get_pt(b_idx, i); + result += diff * diff; + } + return result; + } + + template + inline DistanceType accum_dist(const U a, const V b, const size_t) const { + return (a - b) * (a - b); + } +}; + +/** SO2 distance functor + * Corresponding distance traits: nanoflann::metric_SO2 + * \tparam T Type of the elements (e.g. double, float) + * \tparam _DistanceType Type of distance variables (must be signed) (e.g. + * float, double) orientation is constrained to be in [-pi, pi] + */ +template +struct SO2_Adaptor { + typedef T ElementType; + typedef _DistanceType DistanceType; + + const DataSource &data_source; + + SO2_Adaptor(const DataSource &_data_source) : data_source(_data_source) {} + + inline DistanceType evalMetric(const T *a, const size_t b_idx, + size_t size) const { + return accum_dist(a[size - 1], data_source.kdtree_get_pt(b_idx, size - 1), + size - 1); + } + + /** Note: this assumes that input angles are already in the range [-pi,pi] */ + template + inline DistanceType accum_dist(const U a, const V b, const size_t) const { + DistanceType result = DistanceType(); + DistanceType PI = pi_const(); + result = b - a; + if (result > PI) + result -= 2 * PI; + else if (result < -PI) + result += 2 * PI; + return result; + } +}; + +/** SO3 distance functor (Uses L2_Simple) + * Corresponding distance traits: nanoflann::metric_SO3 + * \tparam T Type of the elements (e.g. double, float) + * \tparam _DistanceType Type of distance variables (must be signed) (e.g. + * float, double) + */ +template +struct SO3_Adaptor { + typedef T ElementType; + typedef _DistanceType DistanceType; + + L2_Simple_Adaptor distance_L2_Simple; + + SO3_Adaptor(const DataSource &_data_source) + : distance_L2_Simple(_data_source) {} + + inline DistanceType evalMetric(const T *a, const size_t b_idx, + size_t size) const { + return distance_L2_Simple.evalMetric(a, b_idx, size); + } + + template + inline DistanceType accum_dist(const U a, const V b, const size_t idx) const { + return distance_L2_Simple.accum_dist(a, b, idx); + } +}; + +/** Metaprogramming helper traits class for the L1 (Manhattan) metric */ +struct metric_L1 : public Metric { + template struct traits { + typedef L1_Adaptor distance_t; + }; +}; +/** Metaprogramming helper traits class for the L2 (Euclidean) metric */ +struct metric_L2 : public Metric { + template struct traits { + typedef L2_Adaptor distance_t; + }; +}; +/** Metaprogramming helper traits class for the L2_simple (Euclidean) metric */ +struct metric_L2_Simple : public Metric { + template struct traits { + typedef L2_Simple_Adaptor distance_t; + }; +}; +/** Metaprogramming helper traits class for the SO3_InnerProdQuat metric */ +struct metric_SO2 : public Metric { + template struct traits { + typedef SO2_Adaptor distance_t; + }; +}; +/** Metaprogramming helper traits class for the SO3_InnerProdQuat metric */ +struct metric_SO3 : public Metric { + template struct traits { + typedef SO3_Adaptor distance_t; + }; +}; + +/** @} */ + +/** @addtogroup param_grp Parameter structs + * @{ */ + +/** Parameters (see README.md) */ +struct KDTreeSingleIndexAdaptorParams { + KDTreeSingleIndexAdaptorParams(size_t _leaf_max_size = 10) + : leaf_max_size(_leaf_max_size) {} + + size_t leaf_max_size; +}; + +/** Search options for KDTreeSingleIndexAdaptor::findNeighbors() */ +struct SearchParams { + /** Note: The first argument (checks_IGNORED_) is ignored, but kept for + * compatibility with the FLANN interface */ + SearchParams(int checks_IGNORED_ = 32, float eps_ = 0, bool sorted_ = true) + : checks(checks_IGNORED_), eps(eps_), sorted(sorted_) {} + + int checks; //!< Ignored parameter (Kept for compatibility with the FLANN + //!< interface). + float eps; //!< search for eps-approximate neighbours (default: 0) + bool sorted; //!< only for radius search, require neighbours sorted by + //!< distance (default: true) +}; +/** @} */ + +/** @addtogroup memalloc_grp Memory allocation + * @{ */ + +/** + * Allocates (using C's malloc) a generic type T. + * + * Params: + * count = number of instances to allocate. + * Returns: pointer (of type T*) to memory buffer + */ +template inline T *allocate(size_t count = 1) { + T *mem = static_cast(::malloc(sizeof(T) * count)); + return mem; +} + +/** + * Pooled storage allocator + * + * The following routines allow for the efficient allocation of storage in + * small chunks from a specified pool. Rather than allowing each structure + * to be freed individually, an entire pool of storage is freed at once. + * This method has two advantages over just using malloc() and free(). First, + * it is far more efficient for allocating small objects, as there is + * no overhead for remembering all the information needed to free each + * object or consolidating fragmented memory. Second, the decision about + * how long to keep an object is made at the time of allocation, and there + * is no need to track down all the objects to free them. + * + */ + +const size_t WORDSIZE = 16; +const size_t BLOCKSIZE = 8192; + +class PooledAllocator { + /* We maintain memory alignment to word boundaries by requiring that all + allocations be in multiples of the machine wordsize. */ + /* Size of machine word in bytes. Must be power of 2. */ + /* Minimum number of bytes requested at a time from the system. Must be + * multiple of WORDSIZE. */ + + size_t remaining; /* Number of bytes left in current block of storage. */ + void *base; /* Pointer to base of current block of storage. */ + void *loc; /* Current location in block to next allocate memory. */ + + void internal_init() { + remaining = 0; + base = NULL; + usedMemory = 0; + wastedMemory = 0; + } + +public: + size_t usedMemory; + size_t wastedMemory; + + /** + Default constructor. Initializes a new pool. + */ + PooledAllocator() { internal_init(); } + + /** + * Destructor. Frees all the memory allocated in this pool. + */ + ~PooledAllocator() { free_all(); } + + /** Frees all allocated memory chunks */ + void free_all() { + while (base != NULL) { + void *prev = + *(static_cast(base)); /* Get pointer to prev block. */ + ::free(base); + base = prev; + } + internal_init(); + } + + /** + * Returns a pointer to a piece of new memory of the given size in bytes + * allocated from the pool. + */ + void *malloc(const size_t req_size) { + /* Round size up to a multiple of wordsize. The following expression + only works for WORDSIZE that is a power of 2, by masking last bits of + incremented size to zero. + */ + const size_t size = (req_size + (WORDSIZE - 1)) & ~(WORDSIZE - 1); + + /* Check whether a new block must be allocated. Note that the first word + of a block is reserved for a pointer to the previous block. + */ + if (size > remaining) { + + wastedMemory += remaining; + + /* Allocate new storage. */ + const size_t blocksize = + (size + sizeof(void *) + (WORDSIZE - 1) > BLOCKSIZE) + ? size + sizeof(void *) + (WORDSIZE - 1) + : BLOCKSIZE; + + // use the standard C malloc to allocate memory + void *m = ::malloc(blocksize); + if (!m) { + fprintf(stderr, "Failed to allocate memory.\n"); + return NULL; + } + + /* Fill first word of new block with pointer to previous block. */ + static_cast(m)[0] = base; + base = m; + + size_t shift = 0; + // int size_t = (WORDSIZE - ( (((size_t)m) + sizeof(void*)) & + // (WORDSIZE-1))) & (WORDSIZE-1); + + remaining = blocksize - sizeof(void *) - shift; + loc = (static_cast(m) + sizeof(void *) + shift); + } + void *rloc = loc; + loc = static_cast(loc) + size; + remaining -= size; + + usedMemory += size; + + return rloc; + } + + /** + * Allocates (using this pool) a generic type T. + * + * Params: + * count = number of instances to allocate. + * Returns: pointer (of type T*) to memory buffer + */ + template T *allocate(const size_t count = 1) { + T *mem = static_cast(this->malloc(sizeof(T) * count)); + return mem; + } +}; +/** @} */ + +/** @addtogroup nanoflann_metaprog_grp Auxiliary metaprogramming stuff + * @{ */ + +/** Used to declare fixed-size arrays when DIM>0, dynamically-allocated vectors + * when DIM=-1. Fixed size version for a generic DIM: + */ +template struct array_or_vector_selector { + typedef std::array container_t; +}; +/** Dynamic size version */ +template struct array_or_vector_selector<-1, T> { + typedef std::vector container_t; +}; + +/** @} */ + +/** kd-tree base-class + * + * Contains the member functions common to the classes KDTreeSingleIndexAdaptor + * and KDTreeSingleIndexDynamicAdaptor_. + * + * \tparam Derived The name of the class which inherits this class. + * \tparam DatasetAdaptor The user-provided adaptor (see comments above). + * \tparam Distance The distance metric to use, these are all classes derived + * from nanoflann::Metric \tparam DIM Dimensionality of data points (e.g. 3 for + * 3D points) \tparam IndexType Will be typically size_t or int + */ + +template +class KDTreeBaseClass { + +public: + /** Frees the previously-built index. Automatically called within + * buildIndex(). */ + void freeIndex(Derived &obj) { + obj.pool.free_all(); + obj.root_node = NULL; + obj.m_size_at_index_build = 0; + } + + typedef typename Distance::ElementType ElementType; + typedef typename Distance::DistanceType DistanceType; + + /*--------------------- Internal Data Structures --------------------------*/ + struct Node { + /** Union used because a node can be either a LEAF node or a non-leaf node, + * so both data fields are never used simultaneously */ + union { + struct leaf { + IndexType left, right; //!< Indices of points in leaf node + } lr; + struct nonleaf { + int divfeat; //!< Dimension used for subdivision. + DistanceType divlow, divhigh; //!< The values used for subdivision. + } sub; + } node_type; + Node *child1, *child2; //!< Child nodes (both=NULL mean its a leaf node) + }; + + typedef Node *NodePtr; + + struct Interval { + ElementType low, high; + }; + + /** + * Array of indices to vectors in the dataset. + */ + std::vector vind; + + NodePtr root_node; + + size_t m_leaf_max_size; + + size_t m_size; //!< Number of current points in the dataset + size_t m_size_at_index_build; //!< Number of points in the dataset when the + //!< index was built + int dim; //!< Dimensionality of each data point + + /** Define "BoundingBox" as a fixed-size or variable-size container depending + * on "DIM" */ + typedef + typename array_or_vector_selector::container_t BoundingBox; + + /** Define "distance_vector_t" as a fixed-size or variable-size container + * depending on "DIM" */ + typedef typename array_or_vector_selector::container_t + distance_vector_t; + + /** The KD-tree used to find neighbours */ + + BoundingBox root_bbox; + + /** + * Pooled memory allocator. + * + * Using a pooled memory allocator is more efficient + * than allocating memory directly when there is a large + * number small of memory allocations. + */ + PooledAllocator pool; + + /** Returns number of points in dataset */ + size_t size(const Derived &obj) const { return obj.m_size; } + + /** Returns the length of each point in the dataset */ + size_t veclen(const Derived &obj) { + return static_cast(DIM > 0 ? DIM : obj.dim); + } + + /// Helper accessor to the dataset points: + inline ElementType dataset_get(const Derived &obj, size_t idx, + int component) const { + return obj.dataset.kdtree_get_pt(idx, component); + } + + /** + * Computes the inde memory usage + * Returns: memory used by the index + */ + size_t usedMemory(Derived &obj) { + return obj.pool.usedMemory + obj.pool.wastedMemory + + obj.dataset.kdtree_get_point_count() * + sizeof(IndexType); // pool memory and vind array memory + } + + void computeMinMax(const Derived &obj, IndexType *ind, IndexType count, + int element, ElementType &min_elem, + ElementType &max_elem) { + min_elem = dataset_get(obj, ind[0], element); + max_elem = dataset_get(obj, ind[0], element); + for (IndexType i = 1; i < count; ++i) { + ElementType val = dataset_get(obj, ind[i], element); + if (val < min_elem) + min_elem = val; + if (val > max_elem) + max_elem = val; + } + } + + /** + * Create a tree node that subdivides the list of vecs from vind[first] + * to vind[last]. The routine is called recursively on each sublist. + * + * @param left index of the first vector + * @param right index of the last vector + */ + NodePtr divideTree(Derived &obj, const IndexType left, const IndexType right, + BoundingBox &bbox) { + NodePtr node = obj.pool.template allocate(); // allocate memory + + /* If too few exemplars remain, then make this a leaf node. */ + if ((right - left) <= static_cast(obj.m_leaf_max_size)) { + node->child1 = node->child2 = NULL; /* Mark as leaf node. */ + node->node_type.lr.left = left; + node->node_type.lr.right = right; + + // compute bounding-box of leaf points + for (int i = 0; i < (DIM > 0 ? DIM : obj.dim); ++i) { + bbox[i].low = dataset_get(obj, obj.vind[left], i); + bbox[i].high = dataset_get(obj, obj.vind[left], i); + } + for (IndexType k = left + 1; k < right; ++k) { + for (int i = 0; i < (DIM > 0 ? DIM : obj.dim); ++i) { + if (bbox[i].low > dataset_get(obj, obj.vind[k], i)) + bbox[i].low = dataset_get(obj, obj.vind[k], i); + if (bbox[i].high < dataset_get(obj, obj.vind[k], i)) + bbox[i].high = dataset_get(obj, obj.vind[k], i); + } + } + } else { + IndexType idx; + int cutfeat; + DistanceType cutval; + middleSplit_(obj, &obj.vind[0] + left, right - left, idx, cutfeat, cutval, + bbox); + + node->node_type.sub.divfeat = cutfeat; + + BoundingBox left_bbox(bbox); + left_bbox[cutfeat].high = cutval; + node->child1 = divideTree(obj, left, left + idx, left_bbox); + + BoundingBox right_bbox(bbox); + right_bbox[cutfeat].low = cutval; + node->child2 = divideTree(obj, left + idx, right, right_bbox); + + node->node_type.sub.divlow = left_bbox[cutfeat].high; + node->node_type.sub.divhigh = right_bbox[cutfeat].low; + + for (int i = 0; i < (DIM > 0 ? DIM : obj.dim); ++i) { + bbox[i].low = std::min(left_bbox[i].low, right_bbox[i].low); + bbox[i].high = std::max(left_bbox[i].high, right_bbox[i].high); + } + } + + return node; + } + + void middleSplit_(Derived &obj, IndexType *ind, IndexType count, + IndexType &index, int &cutfeat, DistanceType &cutval, + const BoundingBox &bbox) { + const DistanceType EPS = static_cast(0.00001); + ElementType max_span = bbox[0].high - bbox[0].low; + for (int i = 1; i < (DIM > 0 ? DIM : obj.dim); ++i) { + ElementType span = bbox[i].high - bbox[i].low; + if (span > max_span) { + max_span = span; + } + } + ElementType max_spread = -1; + cutfeat = 0; + for (int i = 0; i < (DIM > 0 ? DIM : obj.dim); ++i) { + ElementType span = bbox[i].high - bbox[i].low; + if (span > (1 - EPS) * max_span) { + ElementType min_elem, max_elem; + computeMinMax(obj, ind, count, i, min_elem, max_elem); + ElementType spread = max_elem - min_elem; + ; + if (spread > max_spread) { + cutfeat = i; + max_spread = spread; + } + } + } + // split in the middle + DistanceType split_val = (bbox[cutfeat].low + bbox[cutfeat].high) / 2; + ElementType min_elem, max_elem; + computeMinMax(obj, ind, count, cutfeat, min_elem, max_elem); + + if (split_val < min_elem) + cutval = min_elem; + else if (split_val > max_elem) + cutval = max_elem; + else + cutval = split_val; + + IndexType lim1, lim2; + planeSplit(obj, ind, count, cutfeat, cutval, lim1, lim2); + + if (lim1 > count / 2) + index = lim1; + else if (lim2 < count / 2) + index = lim2; + else + index = count / 2; + } + + /** + * Subdivide the list of points by a plane perpendicular on axe corresponding + * to the 'cutfeat' dimension at 'cutval' position. + * + * On return: + * dataset[ind[0..lim1-1]][cutfeat]cutval + */ + void planeSplit(Derived &obj, IndexType *ind, const IndexType count, + int cutfeat, DistanceType &cutval, IndexType &lim1, + IndexType &lim2) { + /* Move vector indices for left subtree to front of list. */ + IndexType left = 0; + IndexType right = count - 1; + for (;;) { + while (left <= right && dataset_get(obj, ind[left], cutfeat) < cutval) + ++left; + while (right && left <= right && + dataset_get(obj, ind[right], cutfeat) >= cutval) + --right; + if (left > right || !right) + break; // "!right" was added to support unsigned Index types + std::swap(ind[left], ind[right]); + ++left; + --right; + } + /* If either list is empty, it means that all remaining features + * are identical. Split in the middle to maintain a balanced tree. + */ + lim1 = left; + right = count - 1; + for (;;) { + while (left <= right && dataset_get(obj, ind[left], cutfeat) <= cutval) + ++left; + while (right && left <= right && + dataset_get(obj, ind[right], cutfeat) > cutval) + --right; + if (left > right || !right) + break; // "!right" was added to support unsigned Index types + std::swap(ind[left], ind[right]); + ++left; + --right; + } + lim2 = left; + } + + DistanceType computeInitialDistances(const Derived &obj, + const ElementType *vec, + distance_vector_t &dists) const { + assert(vec); + DistanceType distsq = DistanceType(); + + for (int i = 0; i < (DIM > 0 ? DIM : obj.dim); ++i) { + if (vec[i] < obj.root_bbox[i].low) { + dists[i] = obj.distance.accum_dist(vec[i], obj.root_bbox[i].low, i); + distsq += dists[i]; + } + if (vec[i] > obj.root_bbox[i].high) { + dists[i] = obj.distance.accum_dist(vec[i], obj.root_bbox[i].high, i); + distsq += dists[i]; + } + } + return distsq; + } + + void save_tree(Derived &obj, FILE *stream, NodePtr tree) { + save_value(stream, *tree); + if (tree->child1 != NULL) { + save_tree(obj, stream, tree->child1); + } + if (tree->child2 != NULL) { + save_tree(obj, stream, tree->child2); + } + } + + void load_tree(Derived &obj, FILE *stream, NodePtr &tree) { + tree = obj.pool.template allocate(); + load_value(stream, *tree); + if (tree->child1 != NULL) { + load_tree(obj, stream, tree->child1); + } + if (tree->child2 != NULL) { + load_tree(obj, stream, tree->child2); + } + } + + /** Stores the index in a binary file. + * IMPORTANT NOTE: The set of data points is NOT stored in the file, so when + * loading the index object it must be constructed associated to the same + * source of data points used while building it. See the example: + * examples/saveload_example.cpp \sa loadIndex */ + void saveIndex_(Derived &obj, FILE *stream) { + save_value(stream, obj.m_size); + save_value(stream, obj.dim); + save_value(stream, obj.root_bbox); + save_value(stream, obj.m_leaf_max_size); + save_value(stream, obj.vind); + save_tree(obj, stream, obj.root_node); + } + + /** Loads a previous index from a binary file. + * IMPORTANT NOTE: The set of data points is NOT stored in the file, so the + * index object must be constructed associated to the same source of data + * points used while building the index. See the example: + * examples/saveload_example.cpp \sa loadIndex */ + void loadIndex_(Derived &obj, FILE *stream) { + load_value(stream, obj.m_size); + load_value(stream, obj.dim); + load_value(stream, obj.root_bbox); + load_value(stream, obj.m_leaf_max_size); + load_value(stream, obj.vind); + load_tree(obj, stream, obj.root_node); + } +}; + +/** @addtogroup kdtrees_grp KD-tree classes and adaptors + * @{ */ + +/** kd-tree static index + * + * Contains the k-d trees and other information for indexing a set of points + * for nearest-neighbor matching. + * + * The class "DatasetAdaptor" must provide the following interface (can be + * non-virtual, inlined methods): + * + * \code + * // Must return the number of data poins + * inline size_t kdtree_get_point_count() const { ... } + * + * + * // Must return the dim'th component of the idx'th point in the class: + * inline T kdtree_get_pt(const size_t idx, const size_t dim) const { ... } + * + * // Optional bounding-box computation: return false to default to a standard + * bbox computation loop. + * // Return true if the BBOX was already computed by the class and returned + * in "bb" so it can be avoided to redo it again. + * // Look at bb.size() to find out the expected dimensionality (e.g. 2 or 3 + * for point clouds) template bool kdtree_get_bbox(BBOX &bb) const + * { + * bb[0].low = ...; bb[0].high = ...; // 0th dimension limits + * bb[1].low = ...; bb[1].high = ...; // 1st dimension limits + * ... + * return true; + * } + * + * \endcode + * + * \tparam DatasetAdaptor The user-provided adaptor (see comments above). + * \tparam Distance The distance metric to use: nanoflann::metric_L1, + * nanoflann::metric_L2, nanoflann::metric_L2_Simple, etc. \tparam DIM + * Dimensionality of data points (e.g. 3 for 3D points) \tparam IndexType Will + * be typically size_t or int + */ +template +class KDTreeSingleIndexAdaptor + : public KDTreeBaseClass< + KDTreeSingleIndexAdaptor, + Distance, DatasetAdaptor, DIM, IndexType> { +public: + /** Deleted copy constructor*/ + KDTreeSingleIndexAdaptor( + const KDTreeSingleIndexAdaptor + &) = delete; + + /** + * The dataset used by this index + */ + const DatasetAdaptor &dataset; //!< The source of our data + + const KDTreeSingleIndexAdaptorParams index_params; + + Distance distance; + + typedef typename nanoflann::KDTreeBaseClass< + nanoflann::KDTreeSingleIndexAdaptor, + Distance, DatasetAdaptor, DIM, IndexType> + BaseClassRef; + + typedef typename BaseClassRef::ElementType ElementType; + typedef typename BaseClassRef::DistanceType DistanceType; + + typedef typename BaseClassRef::Node Node; + typedef Node *NodePtr; + + typedef typename BaseClassRef::Interval Interval; + /** Define "BoundingBox" as a fixed-size or variable-size container depending + * on "DIM" */ + typedef typename BaseClassRef::BoundingBox BoundingBox; + + /** Define "distance_vector_t" as a fixed-size or variable-size container + * depending on "DIM" */ + typedef typename BaseClassRef::distance_vector_t distance_vector_t; + + /** + * KDTree constructor + * + * Refer to docs in README.md or online in + * https://github.com/jlblancoc/nanoflann + * + * The KD-Tree point dimension (the length of each point in the datase, e.g. 3 + * for 3D points) is determined by means of: + * - The \a DIM template parameter if >0 (highest priority) + * - Otherwise, the \a dimensionality parameter of this constructor. + * + * @param inputData Dataset with the input features + * @param params Basically, the maximum leaf node size + */ + KDTreeSingleIndexAdaptor(const int dimensionality, + const DatasetAdaptor &inputData, + const KDTreeSingleIndexAdaptorParams ¶ms = + KDTreeSingleIndexAdaptorParams()) + : dataset(inputData), index_params(params), distance(inputData) { + BaseClassRef::root_node = NULL; + BaseClassRef::m_size = dataset.kdtree_get_point_count(); + BaseClassRef::m_size_at_index_build = BaseClassRef::m_size; + BaseClassRef::dim = dimensionality; + if (DIM > 0) + BaseClassRef::dim = DIM; + BaseClassRef::m_leaf_max_size = params.leaf_max_size; + + // Create a permutable array of indices to the input vectors. + init_vind(); + } + + /** + * Builds the index + */ + void buildIndex() { + BaseClassRef::m_size = dataset.kdtree_get_point_count(); + BaseClassRef::m_size_at_index_build = BaseClassRef::m_size; + init_vind(); + this->freeIndex(*this); + BaseClassRef::m_size_at_index_build = BaseClassRef::m_size; + if (BaseClassRef::m_size == 0) + return; + computeBoundingBox(BaseClassRef::root_bbox); + BaseClassRef::root_node = + this->divideTree(*this, 0, BaseClassRef::m_size, + BaseClassRef::root_bbox); // construct the tree + } + + /** \name Query methods + * @{ */ + + /** + * Find set of nearest neighbors to vec[0:dim-1]. Their indices are stored + * inside the result object. + * + * Params: + * result = the result object in which the indices of the + * nearest-neighbors are stored vec = the vector for which to search the + * nearest neighbors + * + * \tparam RESULTSET Should be any ResultSet + * \return True if the requested neighbors could be found. + * \sa knnSearch, radiusSearch + */ + template + bool findNeighbors(RESULTSET &result, const ElementType *vec, + const SearchParams &searchParams) const { + assert(vec); + if (this->size(*this) == 0) + return false; + if (!BaseClassRef::root_node) + throw std::runtime_error( + "[nanoflann] findNeighbors() called before building the index."); + float epsError = 1 + searchParams.eps; + + distance_vector_t + dists; // fixed or variable-sized container (depending on DIM) + auto zero = static_cast(0); + assign(dists, (DIM > 0 ? DIM : BaseClassRef::dim), + zero); // Fill it with zeros. + DistanceType distsq = this->computeInitialDistances(*this, vec, dists); + searchLevel(result, vec, BaseClassRef::root_node, distsq, dists, + epsError); // "count_leaf" parameter removed since was neither + // used nor returned to the user. + return result.full(); + } + + /** + * Find the "num_closest" nearest neighbors to the \a query_point[0:dim-1]. + * Their indices are stored inside the result object. \sa radiusSearch, + * findNeighbors \note nChecks_IGNORED is ignored but kept for compatibility + * with the original FLANN interface. \return Number `N` of valid points in + * the result set. Only the first `N` entries in `out_indices` and + * `out_distances_sq` will be valid. Return may be less than `num_closest` + * only if the number of elements in the tree is less than `num_closest`. + */ + size_t knnSearch(const ElementType *query_point, const size_t num_closest, + IndexType *out_indices, DistanceType *out_distances_sq, + const int /* nChecks_IGNORED */ = 10) const { + nanoflann::KNNResultSet resultSet(num_closest); + resultSet.init(out_indices, out_distances_sq); + this->findNeighbors(resultSet, query_point, nanoflann::SearchParams()); + return resultSet.size(); + } + + /** + * Find all the neighbors to \a query_point[0:dim-1] within a maximum radius. + * The output is given as a vector of pairs, of which the first element is a + * point index and the second the corresponding distance. Previous contents of + * \a IndicesDists are cleared. + * + * If searchParams.sorted==true, the output list is sorted by ascending + * distances. + * + * For a better performance, it is advisable to do a .reserve() on the vector + * if you have any wild guess about the number of expected matches. + * + * \sa knnSearch, findNeighbors, radiusSearchCustomCallback + * \return The number of points within the given radius (i.e. indices.size() + * or dists.size() ) + */ + size_t + radiusSearch(const ElementType *query_point, const DistanceType &radius, + std::vector> &IndicesDists, + const SearchParams &searchParams) const { + RadiusResultSet resultSet(radius, IndicesDists); + const size_t nFound = + radiusSearchCustomCallback(query_point, resultSet, searchParams); + if (searchParams.sorted) + std::sort(IndicesDists.begin(), IndicesDists.end(), IndexDist_Sorter()); + return nFound; + } + + /** + * Just like radiusSearch() but with a custom callback class for each point + * found in the radius of the query. See the source of RadiusResultSet<> as a + * start point for your own classes. \sa radiusSearch + */ + template + size_t radiusSearchCustomCallback( + const ElementType *query_point, SEARCH_CALLBACK &resultSet, + const SearchParams &searchParams = SearchParams()) const { + this->findNeighbors(resultSet, query_point, searchParams); + return resultSet.size(); + } + + /** @} */ + +public: + /** Make sure the auxiliary list \a vind has the same size than the current + * dataset, and re-generate if size has changed. */ + void init_vind() { + // Create a permutable array of indices to the input vectors. + BaseClassRef::m_size = dataset.kdtree_get_point_count(); + if (BaseClassRef::vind.size() != BaseClassRef::m_size) + BaseClassRef::vind.resize(BaseClassRef::m_size); + for (size_t i = 0; i < BaseClassRef::m_size; i++) + BaseClassRef::vind[i] = i; + } + + void computeBoundingBox(BoundingBox &bbox) { + resize(bbox, (DIM > 0 ? DIM : BaseClassRef::dim)); + if (dataset.kdtree_get_bbox(bbox)) { + // Done! It was implemented in derived class + } else { + const size_t N = dataset.kdtree_get_point_count(); + if (!N) + throw std::runtime_error("[nanoflann] computeBoundingBox() called but " + "no data points found."); + for (int i = 0; i < (DIM > 0 ? DIM : BaseClassRef::dim); ++i) { + bbox[i].low = bbox[i].high = this->dataset_get(*this, 0, i); + } + for (size_t k = 1; k < N; ++k) { + for (int i = 0; i < (DIM > 0 ? DIM : BaseClassRef::dim); ++i) { + if (this->dataset_get(*this, k, i) < bbox[i].low) + bbox[i].low = this->dataset_get(*this, k, i); + if (this->dataset_get(*this, k, i) > bbox[i].high) + bbox[i].high = this->dataset_get(*this, k, i); + } + } + } + } + + /** + * Performs an exact search in the tree starting from a node. + * \tparam RESULTSET Should be any ResultSet + * \return true if the search should be continued, false if the results are + * sufficient + */ + template + bool searchLevel(RESULTSET &result_set, const ElementType *vec, + const NodePtr node, DistanceType mindistsq, + distance_vector_t &dists, const float epsError) const { + /* If this is a leaf node, then do check and return. */ + if ((node->child1 == NULL) && (node->child2 == NULL)) { + // count_leaf += (node->lr.right-node->lr.left); // Removed since was + // neither used nor returned to the user. + DistanceType worst_dist = result_set.worstDist(); + for (IndexType i = node->node_type.lr.left; i < node->node_type.lr.right; + ++i) { + const IndexType index = BaseClassRef::vind[i]; // reorder... : i; + DistanceType dist = distance.evalMetric( + vec, index, (DIM > 0 ? DIM : BaseClassRef::dim)); + if (dist < worst_dist) { + if (!result_set.addPoint(dist, BaseClassRef::vind[i])) { + // the resultset doesn't want to receive any more points, we're done + // searching! + return false; + } + } + } + return true; + } + + /* Which child branch should be taken first? */ + int idx = node->node_type.sub.divfeat; + ElementType val = vec[idx]; + DistanceType diff1 = val - node->node_type.sub.divlow; + DistanceType diff2 = val - node->node_type.sub.divhigh; + + NodePtr bestChild; + NodePtr otherChild; + DistanceType cut_dist; + if ((diff1 + diff2) < 0) { + bestChild = node->child1; + otherChild = node->child2; + cut_dist = distance.accum_dist(val, node->node_type.sub.divhigh, idx); + } else { + bestChild = node->child2; + otherChild = node->child1; + cut_dist = distance.accum_dist(val, node->node_type.sub.divlow, idx); + } + + /* Call recursively to search next level down. */ + if (!searchLevel(result_set, vec, bestChild, mindistsq, dists, epsError)) { + // the resultset doesn't want to receive any more points, we're done + // searching! + return false; + } + + DistanceType dst = dists[idx]; + mindistsq = mindistsq + cut_dist - dst; + dists[idx] = cut_dist; + if (mindistsq * epsError <= result_set.worstDist()) { + if (!searchLevel(result_set, vec, otherChild, mindistsq, dists, + epsError)) { + // the resultset doesn't want to receive any more points, we're done + // searching! + return false; + } + } + dists[idx] = dst; + return true; + } + +public: + /** Stores the index in a binary file. + * IMPORTANT NOTE: The set of data points is NOT stored in the file, so when + * loading the index object it must be constructed associated to the same + * source of data points used while building it. See the example: + * examples/saveload_example.cpp \sa loadIndex */ + void saveIndex(FILE *stream) { this->saveIndex_(*this, stream); } + + /** Loads a previous index from a binary file. + * IMPORTANT NOTE: The set of data points is NOT stored in the file, so the + * index object must be constructed associated to the same source of data + * points used while building the index. See the example: + * examples/saveload_example.cpp \sa loadIndex */ + void loadIndex(FILE *stream) { this->loadIndex_(*this, stream); } + +}; // class KDTree + +/** kd-tree dynamic index + * + * Contains the k-d trees and other information for indexing a set of points + * for nearest-neighbor matching. + * + * The class "DatasetAdaptor" must provide the following interface (can be + * non-virtual, inlined methods): + * + * \code + * // Must return the number of data poins + * inline size_t kdtree_get_point_count() const { ... } + * + * // Must return the dim'th component of the idx'th point in the class: + * inline T kdtree_get_pt(const size_t idx, const size_t dim) const { ... } + * + * // Optional bounding-box computation: return false to default to a standard + * bbox computation loop. + * // Return true if the BBOX was already computed by the class and returned + * in "bb" so it can be avoided to redo it again. + * // Look at bb.size() to find out the expected dimensionality (e.g. 2 or 3 + * for point clouds) template bool kdtree_get_bbox(BBOX &bb) const + * { + * bb[0].low = ...; bb[0].high = ...; // 0th dimension limits + * bb[1].low = ...; bb[1].high = ...; // 1st dimension limits + * ... + * return true; + * } + * + * \endcode + * + * \tparam DatasetAdaptor The user-provided adaptor (see comments above). + * \tparam Distance The distance metric to use: nanoflann::metric_L1, + * nanoflann::metric_L2, nanoflann::metric_L2_Simple, etc. \tparam DIM + * Dimensionality of data points (e.g. 3 for 3D points) \tparam IndexType Will + * be typically size_t or int + */ +template +class KDTreeSingleIndexDynamicAdaptor_ + : public KDTreeBaseClass, + Distance, DatasetAdaptor, DIM, IndexType> { +public: + /** + * The dataset used by this index + */ + const DatasetAdaptor &dataset; //!< The source of our data + + KDTreeSingleIndexAdaptorParams index_params; + + std::vector &treeIndex; + + Distance distance; + + typedef typename nanoflann::KDTreeBaseClass< + nanoflann::KDTreeSingleIndexDynamicAdaptor_, + Distance, DatasetAdaptor, DIM, IndexType> + BaseClassRef; + + typedef typename BaseClassRef::ElementType ElementType; + typedef typename BaseClassRef::DistanceType DistanceType; + + typedef typename BaseClassRef::Node Node; + typedef Node *NodePtr; + + typedef typename BaseClassRef::Interval Interval; + /** Define "BoundingBox" as a fixed-size or variable-size container depending + * on "DIM" */ + typedef typename BaseClassRef::BoundingBox BoundingBox; + + /** Define "distance_vector_t" as a fixed-size or variable-size container + * depending on "DIM" */ + typedef typename BaseClassRef::distance_vector_t distance_vector_t; + + /** + * KDTree constructor + * + * Refer to docs in README.md or online in + * https://github.com/jlblancoc/nanoflann + * + * The KD-Tree point dimension (the length of each point in the datase, e.g. 3 + * for 3D points) is determined by means of: + * - The \a DIM template parameter if >0 (highest priority) + * - Otherwise, the \a dimensionality parameter of this constructor. + * + * @param inputData Dataset with the input features + * @param params Basically, the maximum leaf node size + */ + KDTreeSingleIndexDynamicAdaptor_( + const int dimensionality, const DatasetAdaptor &inputData, + std::vector &treeIndex_, + const KDTreeSingleIndexAdaptorParams ¶ms = + KDTreeSingleIndexAdaptorParams()) + : dataset(inputData), index_params(params), treeIndex(treeIndex_), + distance(inputData) { + BaseClassRef::root_node = NULL; + BaseClassRef::m_size = 0; + BaseClassRef::m_size_at_index_build = 0; + BaseClassRef::dim = dimensionality; + if (DIM > 0) + BaseClassRef::dim = DIM; + BaseClassRef::m_leaf_max_size = params.leaf_max_size; + } + + /** Assignment operator definiton */ + KDTreeSingleIndexDynamicAdaptor_ + operator=(const KDTreeSingleIndexDynamicAdaptor_ &rhs) { + KDTreeSingleIndexDynamicAdaptor_ tmp(rhs); + std::swap(BaseClassRef::vind, tmp.BaseClassRef::vind); + std::swap(BaseClassRef::m_leaf_max_size, tmp.BaseClassRef::m_leaf_max_size); + std::swap(index_params, tmp.index_params); + std::swap(treeIndex, tmp.treeIndex); + std::swap(BaseClassRef::m_size, tmp.BaseClassRef::m_size); + std::swap(BaseClassRef::m_size_at_index_build, + tmp.BaseClassRef::m_size_at_index_build); + std::swap(BaseClassRef::root_node, tmp.BaseClassRef::root_node); + std::swap(BaseClassRef::root_bbox, tmp.BaseClassRef::root_bbox); + std::swap(BaseClassRef::pool, tmp.BaseClassRef::pool); + return *this; + } + + /** + * Builds the index + */ + void buildIndex() { + BaseClassRef::m_size = BaseClassRef::vind.size(); + this->freeIndex(*this); + BaseClassRef::m_size_at_index_build = BaseClassRef::m_size; + if (BaseClassRef::m_size == 0) + return; + computeBoundingBox(BaseClassRef::root_bbox); + BaseClassRef::root_node = + this->divideTree(*this, 0, BaseClassRef::m_size, + BaseClassRef::root_bbox); // construct the tree + } + + /** \name Query methods + * @{ */ + + /** + * Find set of nearest neighbors to vec[0:dim-1]. Their indices are stored + * inside the result object. + * + * Params: + * result = the result object in which the indices of the + * nearest-neighbors are stored vec = the vector for which to search the + * nearest neighbors + * + * \tparam RESULTSET Should be any ResultSet + * \return True if the requested neighbors could be found. + * \sa knnSearch, radiusSearch + */ + template + bool findNeighbors(RESULTSET &result, const ElementType *vec, + const SearchParams &searchParams) const { + assert(vec); + if (this->size(*this) == 0) + return false; + if (!BaseClassRef::root_node) + return false; + float epsError = 1 + searchParams.eps; + + // fixed or variable-sized container (depending on DIM) + distance_vector_t dists; + // Fill it with zeros. + assign(dists, (DIM > 0 ? DIM : BaseClassRef::dim), + static_cast(0)); + DistanceType distsq = this->computeInitialDistances(*this, vec, dists); + searchLevel(result, vec, BaseClassRef::root_node, distsq, dists, + epsError); // "count_leaf" parameter removed since was neither + // used nor returned to the user. + return result.full(); + } + + /** + * Find the "num_closest" nearest neighbors to the \a query_point[0:dim-1]. + * Their indices are stored inside the result object. \sa radiusSearch, + * findNeighbors \note nChecks_IGNORED is ignored but kept for compatibility + * with the original FLANN interface. \return Number `N` of valid points in + * the result set. Only the first `N` entries in `out_indices` and + * `out_distances_sq` will be valid. Return may be less than `num_closest` + * only if the number of elements in the tree is less than `num_closest`. + */ + size_t knnSearch(const ElementType *query_point, const size_t num_closest, + IndexType *out_indices, DistanceType *out_distances_sq, + const int /* nChecks_IGNORED */ = 10) const { + nanoflann::KNNResultSet resultSet(num_closest); + resultSet.init(out_indices, out_distances_sq); + this->findNeighbors(resultSet, query_point, nanoflann::SearchParams()); + return resultSet.size(); + } + + /** + * Find all the neighbors to \a query_point[0:dim-1] within a maximum radius. + * The output is given as a vector of pairs, of which the first element is a + * point index and the second the corresponding distance. Previous contents of + * \a IndicesDists are cleared. + * + * If searchParams.sorted==true, the output list is sorted by ascending + * distances. + * + * For a better performance, it is advisable to do a .reserve() on the vector + * if you have any wild guess about the number of expected matches. + * + * \sa knnSearch, findNeighbors, radiusSearchCustomCallback + * \return The number of points within the given radius (i.e. indices.size() + * or dists.size() ) + */ + size_t + radiusSearch(const ElementType *query_point, const DistanceType &radius, + std::vector> &IndicesDists, + const SearchParams &searchParams) const { + RadiusResultSet resultSet(radius, IndicesDists); + const size_t nFound = + radiusSearchCustomCallback(query_point, resultSet, searchParams); + if (searchParams.sorted) + std::sort(IndicesDists.begin(), IndicesDists.end(), IndexDist_Sorter()); + return nFound; + } + + /** + * Just like radiusSearch() but with a custom callback class for each point + * found in the radius of the query. See the source of RadiusResultSet<> as a + * start point for your own classes. \sa radiusSearch + */ + template + size_t radiusSearchCustomCallback( + const ElementType *query_point, SEARCH_CALLBACK &resultSet, + const SearchParams &searchParams = SearchParams()) const { + this->findNeighbors(resultSet, query_point, searchParams); + return resultSet.size(); + } + + /** @} */ + +public: + void computeBoundingBox(BoundingBox &bbox) { + resize(bbox, (DIM > 0 ? DIM : BaseClassRef::dim)); + + if (dataset.kdtree_get_bbox(bbox)) { + // Done! It was implemented in derived class + } else { + const size_t N = BaseClassRef::m_size; + if (!N) + throw std::runtime_error("[nanoflann] computeBoundingBox() called but " + "no data points found."); + for (int i = 0; i < (DIM > 0 ? DIM : BaseClassRef::dim); ++i) { + bbox[i].low = bbox[i].high = + this->dataset_get(*this, BaseClassRef::vind[0], i); + } + for (size_t k = 1; k < N; ++k) { + for (int i = 0; i < (DIM > 0 ? DIM : BaseClassRef::dim); ++i) { + if (this->dataset_get(*this, BaseClassRef::vind[k], i) < bbox[i].low) + bbox[i].low = this->dataset_get(*this, BaseClassRef::vind[k], i); + if (this->dataset_get(*this, BaseClassRef::vind[k], i) > bbox[i].high) + bbox[i].high = this->dataset_get(*this, BaseClassRef::vind[k], i); + } + } + } + } + + /** + * Performs an exact search in the tree starting from a node. + * \tparam RESULTSET Should be any ResultSet + */ + template + void searchLevel(RESULTSET &result_set, const ElementType *vec, + const NodePtr node, DistanceType mindistsq, + distance_vector_t &dists, const float epsError) const { + /* If this is a leaf node, then do check and return. */ + if ((node->child1 == NULL) && (node->child2 == NULL)) { + // count_leaf += (node->lr.right-node->lr.left); // Removed since was + // neither used nor returned to the user. + DistanceType worst_dist = result_set.worstDist(); + for (IndexType i = node->node_type.lr.left; i < node->node_type.lr.right; + ++i) { + const IndexType index = BaseClassRef::vind[i]; // reorder... : i; + if (treeIndex[index] == -1) + continue; + DistanceType dist = distance.evalMetric( + vec, index, (DIM > 0 ? DIM : BaseClassRef::dim)); + if (dist < worst_dist) { + if (!result_set.addPoint( + static_cast(dist), + static_cast( + BaseClassRef::vind[i]))) { + // the resultset doesn't want to receive any more points, we're done + // searching! + return; // false; + } + } + } + return; + } + + /* Which child branch should be taken first? */ + int idx = node->node_type.sub.divfeat; + ElementType val = vec[idx]; + DistanceType diff1 = val - node->node_type.sub.divlow; + DistanceType diff2 = val - node->node_type.sub.divhigh; + + NodePtr bestChild; + NodePtr otherChild; + DistanceType cut_dist; + if ((diff1 + diff2) < 0) { + bestChild = node->child1; + otherChild = node->child2; + cut_dist = distance.accum_dist(val, node->node_type.sub.divhigh, idx); + } else { + bestChild = node->child2; + otherChild = node->child1; + cut_dist = distance.accum_dist(val, node->node_type.sub.divlow, idx); + } + + /* Call recursively to search next level down. */ + searchLevel(result_set, vec, bestChild, mindistsq, dists, epsError); + + DistanceType dst = dists[idx]; + mindistsq = mindistsq + cut_dist - dst; + dists[idx] = cut_dist; + if (mindistsq * epsError <= result_set.worstDist()) { + searchLevel(result_set, vec, otherChild, mindistsq, dists, epsError); + } + dists[idx] = dst; + } + +public: + /** Stores the index in a binary file. + * IMPORTANT NOTE: The set of data points is NOT stored in the file, so when + * loading the index object it must be constructed associated to the same + * source of data points used while building it. See the example: + * examples/saveload_example.cpp \sa loadIndex */ + void saveIndex(FILE *stream) { this->saveIndex_(*this, stream); } + + /** Loads a previous index from a binary file. + * IMPORTANT NOTE: The set of data points is NOT stored in the file, so the + * index object must be constructed associated to the same source of data + * points used while building the index. See the example: + * examples/saveload_example.cpp \sa loadIndex */ + void loadIndex(FILE *stream) { this->loadIndex_(*this, stream); } +}; + +/** kd-tree dynaimic index + * + * class to create multiple static index and merge their results to behave as + * single dynamic index as proposed in Logarithmic Approach. + * + * Example of usage: + * examples/dynamic_pointcloud_example.cpp + * + * \tparam DatasetAdaptor The user-provided adaptor (see comments above). + * \tparam Distance The distance metric to use: nanoflann::metric_L1, + * nanoflann::metric_L2, nanoflann::metric_L2_Simple, etc. \tparam DIM + * Dimensionality of data points (e.g. 3 for 3D points) \tparam IndexType Will + * be typically size_t or int + */ +template +class KDTreeSingleIndexDynamicAdaptor { +public: + typedef typename Distance::ElementType ElementType; + typedef typename Distance::DistanceType DistanceType; + +protected: + size_t m_leaf_max_size; + size_t treeCount; + size_t pointCount; + + /** + * The dataset used by this index + */ + const DatasetAdaptor &dataset; //!< The source of our data + + std::vector treeIndex; //!< treeIndex[idx] is the index of tree in which + //!< point at idx is stored. treeIndex[idx]=-1 + //!< means that point has been removed. + + KDTreeSingleIndexAdaptorParams index_params; + + int dim; //!< Dimensionality of each data point + + typedef KDTreeSingleIndexDynamicAdaptor_ + index_container_t; + std::vector index; + +public: + /** Get a const ref to the internal list of indices; the number of indices is + * adapted dynamically as the dataset grows in size. */ + const std::vector &getAllIndices() const { return index; } + +private: + /** finds position of least significant unset bit */ + int First0Bit(IndexType num) { + int pos = 0; + while (num & 1) { + num = num >> 1; + pos++; + } + return pos; + } + + /** Creates multiple empty trees to handle dynamic support */ + void init() { + typedef KDTreeSingleIndexDynamicAdaptor_ + my_kd_tree_t; + std::vector index_( + treeCount, my_kd_tree_t(dim /*dim*/, dataset, treeIndex, index_params)); + index = index_; + } + +public: + Distance distance; + + /** + * KDTree constructor + * + * Refer to docs in README.md or online in + * https://github.com/jlblancoc/nanoflann + * + * The KD-Tree point dimension (the length of each point in the datase, e.g. 3 + * for 3D points) is determined by means of: + * - The \a DIM template parameter if >0 (highest priority) + * - Otherwise, the \a dimensionality parameter of this constructor. + * + * @param inputData Dataset with the input features + * @param params Basically, the maximum leaf node size + */ + KDTreeSingleIndexDynamicAdaptor(const int dimensionality, + const DatasetAdaptor &inputData, + const KDTreeSingleIndexAdaptorParams ¶ms = + KDTreeSingleIndexAdaptorParams(), + const size_t maximumPointCount = 1000000000U) + : dataset(inputData), index_params(params), distance(inputData) { + treeCount = static_cast(std::log2(maximumPointCount)); + pointCount = 0U; + dim = dimensionality; + treeIndex.clear(); + if (DIM > 0) + dim = DIM; + m_leaf_max_size = params.leaf_max_size; + init(); + const size_t num_initial_points = dataset.kdtree_get_point_count(); + if (num_initial_points > 0) { + addPoints(0, num_initial_points - 1); + } + } + + /** Deleted copy constructor*/ + KDTreeSingleIndexDynamicAdaptor( + const KDTreeSingleIndexDynamicAdaptor &) = delete; + + /** Add points to the set, Inserts all points from [start, end] */ + void addPoints(IndexType start, IndexType end) { + size_t count = end - start + 1; + treeIndex.resize(treeIndex.size() + count); + for (IndexType idx = start; idx <= end; idx++) { + int pos = First0Bit(pointCount); + index[pos].vind.clear(); + treeIndex[pointCount] = pos; + for (int i = 0; i < pos; i++) { + for (int j = 0; j < static_cast(index[i].vind.size()); j++) { + index[pos].vind.push_back(index[i].vind[j]); + if (treeIndex[index[i].vind[j]] != -1) + treeIndex[index[i].vind[j]] = pos; + } + index[i].vind.clear(); + index[i].freeIndex(index[i]); + } + index[pos].vind.push_back(idx); + index[pos].buildIndex(); + pointCount++; + } + } + + /** Remove a point from the set (Lazy Deletion) */ + void removePoint(size_t idx) { + if (idx >= pointCount) + return; + treeIndex[idx] = -1; + } + + /** + * Find set of nearest neighbors to vec[0:dim-1]. Their indices are stored + * inside the result object. + * + * Params: + * result = the result object in which the indices of the + * nearest-neighbors are stored vec = the vector for which to search the + * nearest neighbors + * + * \tparam RESULTSET Should be any ResultSet + * \return True if the requested neighbors could be found. + * \sa knnSearch, radiusSearch + */ + template + bool findNeighbors(RESULTSET &result, const ElementType *vec, + const SearchParams &searchParams) const { + for (size_t i = 0; i < treeCount; i++) { + index[i].findNeighbors(result, &vec[0], searchParams); + } + return result.full(); + } +}; + +/** An L2-metric KD-tree adaptor for working with data directly stored in an + * Eigen Matrix, without duplicating the data storage. Each row in the matrix + * represents a point in the state space. + * + * Example of usage: + * \code + * Eigen::Matrix mat; + * // Fill out "mat"... + * + * typedef KDTreeEigenMatrixAdaptor< Eigen::Matrix > + * my_kd_tree_t; const int max_leaf = 10; my_kd_tree_t mat_index(mat, max_leaf + * ); mat_index.index->buildIndex(); mat_index.index->... \endcode + * + * \tparam DIM If set to >0, it specifies a compile-time fixed dimensionality + * for the points in the data set, allowing more compiler optimizations. \tparam + * Distance The distance metric to use: nanoflann::metric_L1, + * nanoflann::metric_L2, nanoflann::metric_L2_Simple, etc. + */ +template +struct KDTreeEigenMatrixAdaptor { + typedef KDTreeEigenMatrixAdaptor self_t; + typedef typename MatrixType::Scalar num_t; + typedef typename MatrixType::Index IndexType; + typedef + typename Distance::template traits::distance_t metric_t; + typedef KDTreeSingleIndexAdaptor + index_t; + + index_t *index; //! The kd-tree index for the user to call its methods as + //! usual with any other FLANN index. + + /// Constructor: takes a const ref to the matrix object with the data points + KDTreeEigenMatrixAdaptor(const size_t dimensionality, + const std::reference_wrapper &mat, + const int leaf_max_size = 10) + : m_data_matrix(mat) { + const auto dims = mat.get().cols(); + if (size_t(dims) != dimensionality) + throw std::runtime_error( + "Error: 'dimensionality' must match column count in data matrix"); + if (DIM > 0 && int(dims) != DIM) + throw std::runtime_error( + "Data set dimensionality does not match the 'DIM' template argument"); + index = + new index_t(static_cast(dims), *this /* adaptor */, + nanoflann::KDTreeSingleIndexAdaptorParams(leaf_max_size)); + index->buildIndex(); + } + +public: + /** Deleted copy constructor */ + KDTreeEigenMatrixAdaptor(const self_t &) = delete; + + ~KDTreeEigenMatrixAdaptor() { delete index; } + + const std::reference_wrapper m_data_matrix; + + /** Query for the \a num_closest closest points to a given point (entered as + * query_point[0:dim-1]). Note that this is a short-cut method for + * index->findNeighbors(). The user can also call index->... methods as + * desired. \note nChecks_IGNORED is ignored but kept for compatibility with + * the original FLANN interface. + */ + inline void query(const num_t *query_point, const size_t num_closest, + IndexType *out_indices, num_t *out_distances_sq, + const int /* nChecks_IGNORED */ = 10) const { + nanoflann::KNNResultSet resultSet(num_closest); + resultSet.init(out_indices, out_distances_sq); + index->findNeighbors(resultSet, query_point, nanoflann::SearchParams()); + } + + /** @name Interface expected by KDTreeSingleIndexAdaptor + * @{ */ + + const self_t &derived() const { return *this; } + self_t &derived() { return *this; } + + // Must return the number of data points + inline size_t kdtree_get_point_count() const { + return m_data_matrix.get().rows(); + } + + // Returns the dim'th component of the idx'th point in the class: + inline num_t kdtree_get_pt(const IndexType idx, size_t dim) const { + return m_data_matrix.get().coeff(idx, IndexType(dim)); + } + + // Optional bounding-box computation: return false to default to a standard + // bbox computation loop. + // Return true if the BBOX was already computed by the class and returned in + // "bb" so it can be avoided to redo it again. Look at bb.size() to find out + // the expected dimensionality (e.g. 2 or 3 for point clouds) + template bool kdtree_get_bbox(BBOX & /*bb*/) const { + return false; + } + + /** @} */ + +}; // end of KDTreeEigenMatrixAdaptor + /** @} */ + +/** @} */ // end of grouping +} // namespace nanoflann + +#endif /* NANOFLANN_HPP_ */ diff --git a/modules/alphamat/src/cm.cpp b/modules/alphamat/src/cm.cpp new file mode 100644 index 00000000000..e1a40456b0c --- /dev/null +++ b/modules/alphamat/src/cm.cpp @@ -0,0 +1,162 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +// #ifndef cm +// #define cm +// header file content + +#include "precomp.hpp" +#include "intraU.hpp" +#include "cm.hpp" + +namespace cv{ +namespace alphamat{ + +void generateFVectorCM(my_vector_of_vectors_t &samples, Mat &img) +{ + // CV_Assert(img.depth() == CV_8U); + + int nRows = img.rows; + int nCols = img.cols; + + samples.resize(nRows*nCols); + + int i, j; + + for (i = 0; i < nRows; ++i) + for (j = 0; j < nCols; ++j){ + samples[i*nCols+j].resize(dim); + samples[i*nCols+j][0] = img.at(i, j)[0]/255.0; + samples[i*nCols+j][1] = img.at(i, j)[1]/255.0; + samples[i*nCols+j][2] = img.at(i, j)[2]/255.0; + samples[i*nCols+j][3] = double(i)/nRows; + samples[i*nCols+j][4] = double(j)/nCols; + } +} + +void kdtree_CM(Mat &img, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, std::unordered_set& unk) +{ + // Generate feature vectors for intra U: + generateFVectorCM(samples, img); + + // Query point: same as samples from which KD tree is generated + + // construct a kd-tree index: + // Dimensionality set at run-time (default: L2) + // ------------------------------------------------------------ + typedef KDTreeVectorOfVectorsAdaptor< my_vector_of_vectors_t, double > my_kd_tree_t; + my_kd_tree_t mat_index(dim /*dim*/, samples, 10 /* max leaf */ ); + mat_index.index->buildIndex(); + + // do a knn search with cm = 20 + const size_t num_results = 20+1; + + int N = unk.size(); + + std::vector ret_indexes(num_results); + std::vector out_dists_sqr(num_results); + nanoflann::KNNResultSet resultSet(num_results); + + indm.resize(N); + int i = 0; + for (std::unordered_set::iterator it = unk.begin(); it != unk.end(); it++){ + resultSet.init(&ret_indexes[0], &out_dists_sqr[0] ); + mat_index.index->findNeighbors(resultSet, &samples[*it][0], nanoflann::SearchParams(10)); + + indm[i].resize(num_results-1); + for (std::size_t j = 1; j < num_results; j++){ + indm[i][j-1] = ret_indexes[j]; + } + i++; + } +} + +void lle(my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, float eps, std::unordered_set& unk + , SparseMatrix& Wcm, SparseMatrix& Dcm, Mat &img){ + std::cout << "In cm's lle function" << std::endl; + int k = indm[0].size(); //number of neighbours that we are considering + int n = indm.size(); //number of unknown pixels + + typedef Triplet T; + std::vector triplets, td; + + my_vector_of_vectors_t wcm; + wcm.resize(n); + + Mat C(20, 20, DataType::type), rhs(20, 1, DataType::type), Z(3, 20, DataType::type), weights(20, 1, DataType::type), pt(3, 1, DataType::type); + Mat ptDotN(20, 1, DataType::type), imd(20, 1, DataType::type); + Mat Cones(20, 1, DataType::type), Cinv(20, 1, DataType::type); + float alpha, beta, lagrangeMult; + Cones += 1; + + C = 0; + rhs = 1; + + int i, ind = 0; + for(std::unordered_set::iterator it = unk.begin(); it != unk.end(); it++){ + // filling values in Z + i = *it; + + int index_nbr; + for(int j = 0; j < k; j++){ + index_nbr = indm[ind][j]; + for(int p = 0; p < dim-2; p++){ + Z.at(p,j) = samples[index_nbr][p]; + } + } + pt.at(0,0) = samples[i][0]; + pt.at(1,0) = samples[i][1]; + pt.at(2,0) = samples[i][2]; + + C = Z.t()*Z; + for(int p=0; p(p,p) += eps; + + ptDotN = Z.t() * pt; + solve(C, ptDotN, imd); + alpha = 1 - cv::sum(imd)[0]; + solve(C, Cones, Cinv); + beta = cv::sum(Cinv)[0]; //% sum of elements of inv(corr) + lagrangeMult = alpha / beta; + solve(C, ptDotN + lagrangeMult * Cones, weights); + + float sum = cv::sum(weights)[0]; + weights = weights / sum; + + int cMaj_i = findColMajorInd(i, img.rows, img.cols); + + for(int j = 0; j < k; j++){ + int cMaj_ind_j = findColMajorInd(indm[ind][j], img.rows, img.cols); + triplets.push_back(T(cMaj_i, cMaj_ind_j, weights.at(j,0))); + td.push_back(T(cMaj_i, cMaj_i, weights.at(j,0))); + + } + ind++; + } + + Wcm.setFromTriplets(triplets.begin(), triplets.end()); + Dcm.setFromTriplets(td.begin(), td.end()); +} + +void cm(Mat& image, Mat& tmap, SparseMatrix& Wcm, SparseMatrix& Dcm){ + my_vector_of_vectors_t samples, indm, Euu; + + int i, j; + std::unordered_set unk; + for (i = 0; i < tmap.rows; i++) + for (j = 0; j < tmap.cols; j++){ + float pix = tmap.at(i, j); + if (pix == 128) + unk.insert(i*tmap.cols+j); + } + + kdtree_CM(image, indm, samples, unk); + float eps = 0.00001; + lle(indm, samples, eps, unk, Wcm, Dcm, image); + std::cout << "cm DONE" << std::endl; +} + +} + +} diff --git a/modules/alphamat/src/cm.hpp b/modules/alphamat/src/cm.hpp new file mode 100644 index 00000000000..255957f85ec --- /dev/null +++ b/modules/alphamat/src/cm.hpp @@ -0,0 +1,28 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef __OPENCV_CM_H__ +#define __OPENCV_CM_H__ + +namespace cv{ + namespace alphamat{ + +using namespace Eigen; +using namespace nanoflann; + +typedef std::vector> my_vector_of_vectors_t; +// typedef vector>> my_vector_of_set_t; + +void generateFVectorCM(my_vector_of_vectors_t &samples, Mat &img); + +void kdtree_CM(Mat &img, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, std::unordered_set& unk); + +void lle(my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, float eps, std::unordered_set& unk + , SparseMatrix& Wcm, SparseMatrix& Dcm, Mat &img); + +void cm(Mat& image, Mat& tmap, SparseMatrix& Wcm, SparseMatrix& Dcm); + +}} + +#endif diff --git a/modules/alphamat/src/infoflow.cpp b/modules/alphamat/src/infoflow.cpp new file mode 100644 index 00000000000..188435856c3 --- /dev/null +++ b/modules/alphamat/src/infoflow.cpp @@ -0,0 +1,120 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#include "precomp.hpp" +#include "opencv2/alphamat.hpp" +#include +#include + +using namespace Eigen; + +namespace cv{ +namespace alphamat{ + +void solve(SparseMatrix Wcm,SparseMatrix Wuu,SparseMatrix Wl,SparseMatrix Dcm, + SparseMatrix Duu,SparseMatrix Dl, SparseMatrix T, Mat& wf, Mat& alpha); + +void solve(SparseMatrix Wcm,SparseMatrix Wuu,SparseMatrix Wl,SparseMatrix Dcm, + SparseMatrix Duu, SparseMatrix Dl, SparseMatrix T, + Mat &wf, Mat &alpha){ + + float suu = 0.01, sl = 0.1, lamd = 100; + + SparseMatrix Lifm = ((Dcm-Wcm).transpose())*(Dcm-Wcm) + sl*(Dl-Wl) + suu*(Duu-Wuu); + + SparseMatrix A; + int n = wf.rows; + VectorXd b(n), x(n); + + Eigen::VectorXd wf_; + cv2eigen(wf, wf_); + + A = Lifm + lamd*T; + b = (lamd*T)*(wf_); + + ConjugateGradient, Lower|Upper> cg; + + cg.setMaxIterations(500); + cg.compute(A); + x = cg.solve(b); + std::cout << "#iterations: " << cg.iterations() << std::endl; + std::cout << "estimated error: " << cg.error() << std::endl; + + int nRows = alpha.rows; + int nCols = alpha.cols; + float pix_alpha; + for (int j = 0; j < nCols; ++j) + for (int i = 0; i < nRows; ++i) { + pix_alpha = x(i+j*nRows); + if (pix_alpha<0) pix_alpha=0; + if (pix_alpha>1) pix_alpha=1; + alpha.at(i, j, 0) = uchar(pix_alpha*255); + } +} + +void infoFlow(Mat& image, Mat& tmap, Mat& result){ + + clock_t begin = clock(); + int nRows = image.rows; + int nCols = image.cols; + int N = nRows*nCols; + + SparseMatrix T(N, N); + typedef Triplet Tr; + std::vector triplets; + + //Pre-process trimap + for (int i = 0; i < nRows; ++i) + for (int j = 0; j < nCols; ++j){ + float pix = tmap.at(i, j); + if (pix <= 0.2*255) tmap.at(i, j) = 0; + else if (pix >= 0.8*255) tmap.at(i, j) = 255; + else tmap.at(i, j) = 128; + } + + Mat wf = Mat::zeros(nRows*nCols, 1, CV_8U); + + // Column Major Interpretation for working with SparseMatrix + for (int i = 0; i < nRows; ++i) + for (int j = 0; j < nCols; ++j){ + float pix = tmap.at(i, j); + if (pix != 128) // collection of known pixels samples + triplets.push_back(Tr(i+j*nRows, i+j*nRows, 1)); + else + triplets.push_back(Tr(i+j*nRows, i+j*nRows, 0)); + if (pix > 200) // foreground pixel + wf.at(i+j*nRows, 0) = 1; + else + wf.at(i+j*nRows, 0) = 0; + } + + SparseMatrix Wl(N, N), Dl(N, N); + local_info(image, tmap, Wl, Dl); + + SparseMatrix Wcm(N, N), Dcm(N, N); + cm(image, tmap, Wcm, Dcm); + + Mat new_tmap = tmap.clone(); + + SparseMatrix Wuu(N, N), Duu(N, N); + Mat image_t = image.t(); + Mat tmap_t = tmap.t(); + UU(image, tmap, Wuu, Duu); + + clock_t end = clock(); + double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC; + + T.setFromTriplets(triplets.begin(), triplets.end()); + + Mat alpha = Mat::zeros(nRows, nCols, CV_8UC1); + solve(Wcm, Wuu, Wl, Dcm, Duu, Dl, T, wf, alpha); + + result = alpha; + + end = clock(); + elapsed_secs = double(end - begin) / CLOCKS_PER_SEC; + std::cout<<"total time: "< orig_ind; + +int findColMajorInd(int rowMajorInd, int nRows, int nCols) { + int iInd = rowMajorInd/nCols; + int jInd = rowMajorInd%nCols; + return (jInd*nRows+iInd); +} + +void generateFVectorIntraU(my_vector_of_vectors_t &samples, Mat &img, Mat& tmap) +{ + int nRows = img.rows; + int nCols = img.cols; + int unk_count = 0; + int i, j; + for (i = 0; i < nRows; ++i) + for (j = 0; j < nCols; ++j){ + float pix = tmap.at(i, j); + if (pix == 128) + unk_count++; + } + samples.resize(unk_count); + orig_ind.resize(unk_count); + + int c1 = 0; + for (i = 0; i < nRows; ++i) + for (j = 0; j < nCols; ++j){ + float pix = tmap.at(i, j); + if (pix == 128){ // collection of unknown pixels samples + samples[c1].resize(dim); + samples[c1][0] = img.at(i, j)[0]/255.0; + samples[c1][1] = img.at(i, j)[1]/255.0; + samples[c1][2] = img.at(i, j)[2]/255.0; + samples[c1][3] = (double(i+1)/nRows)/20; + samples[c1][4] = (double(j+1)/nCols)/20; + orig_ind[c1] = i*nCols+j; + c1++; + } + } + + std::cout << "Total number of unknown pixels : " << c1 << std::endl; +} + +void kdtree_intraU(Mat &img, Mat& tmap, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples) +{ + // Generate feature vectors for intra U: + generateFVectorIntraU(samples, img, tmap); + + typedef KDTreeVectorOfVectorsAdaptor< my_vector_of_vectors_t, double > my_kd_tree_t; + my_kd_tree_t mat_index(dim /*dim*/, samples, 10 /* max leaf */ ); + mat_index.index->buildIndex(); + // do a knn search with ku = 5 + const size_t num_results = 5+1; + + int N = samples.size(); // no. of unknown samples + + std::vector ret_indexes(num_results); + std::vector out_dists_sqr(num_results); + nanoflann::KNNResultSet resultSet(num_results); + + indm.resize(N); + for (int i = 0; i < N; i++){ + resultSet.init(&ret_indexes[0], &out_dists_sqr[0] ); + mat_index.index->findNeighbors(resultSet, &samples[i][0], nanoflann::SearchParams(10)); + + indm[i].resize(num_results-1); + for (std::size_t j = 1; j < num_results; j++){ + indm[i][j-1] = ret_indexes[j]; + } + } +} + +double l1norm(std::vector& x, std::vector& y){ + double sum = 0; + for (int i = 0; i < dim; i++) + sum += abs(x[i]-y[i]); + return sum/dim; +} + +void intraU(Mat& img, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, SparseMatrix& Wuu, SparseMatrix& Duu){ + // input: indm, samples + int n = indm.size(); // num of unknown samples + std::cout << "num of unknown samples, n : " << n << std::endl; + + int i, j, nbr_ind; + for (i = 0; i < n; i++){ + samples[i][3] *= 1/100; + samples[i][4] *= 1/100; + } + + + my_vector_of_vectors_t weights; + typedef Triplet T; + std::vector triplets, td; + + double weight; + for (i = 0; i < n; i++){ + int num_nbr = indm[i].size(); + int cMaj_i = findColMajorInd(orig_ind[i], img.rows, img.cols); + for (j = 0; j < num_nbr; j++){ + nbr_ind = indm[i][j]; + int cMaj_nbr_j = findColMajorInd(orig_ind[nbr_ind], img.rows, img.cols); + weight = max(1-l1norm(samples[i], samples[j]), 0.0); + + triplets.push_back(T(cMaj_i, cMaj_nbr_j, weight/2)); + td.push_back(T(cMaj_i, cMaj_i, weight/2)); + + triplets.push_back(T(cMaj_nbr_j, cMaj_i, weight/2)); + td.push_back(T(cMaj_nbr_j, cMaj_nbr_j, weight/2)); + } + } + + Wuu.setFromTriplets(triplets.begin(), triplets.end()); + Duu.setFromTriplets(td.begin(), td.end()); + +} + +void UU(Mat& image, Mat& tmap, SparseMatrix& Wuu, SparseMatrix& Duu){ + my_vector_of_vectors_t samples, indm; + + kdtree_intraU(image, tmap, indm, samples); + intraU(image, indm, samples, Wuu, Duu); + std::cout << "Intra U Done" << std::endl; +} + +} +} diff --git a/modules/alphamat/src/intraU.hpp b/modules/alphamat/src/intraU.hpp new file mode 100644 index 00000000000..ba7068aacf3 --- /dev/null +++ b/modules/alphamat/src/intraU.hpp @@ -0,0 +1,32 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef __OPENCV_INTRAU_H__ +#define __OPENCV_INTRAU_H__ + +namespace cv{ + namespace alphamat{ + +using namespace Eigen; +using namespace nanoflann; + +typedef std::vector> my_vector_of_vectors_t; + +void generateFVectorIntraU(my_vector_of_vectors_t &samples, Mat &img, Mat& tmap); + +void kdtree_intraU(Mat &img, Mat& tmap, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples); + +double l1norm(std::vector& x, std::vector& y); + +void intraU(Mat& image, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, SparseMatrix& Wuu, SparseMatrix& Duu); + +void UU(Mat& image, Mat& tmap, SparseMatrix& Wuu, SparseMatrix& Duu); + +int findColMajorInd(int rowMajorInd, int nRows, int nCols); + + + } +} + +#endif diff --git a/modules/alphamat/src/local_info.cpp b/modules/alphamat/src/local_info.cpp new file mode 100644 index 00000000000..a434c334eba --- /dev/null +++ b/modules/alphamat/src/local_info.cpp @@ -0,0 +1,136 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +// #ifndef local_info +// #define local_info + +#include "precomp.hpp" +#include "local_info.hpp" + +namespace cv{ + namespace alphamat{ + +void local_info(Mat& img, Mat& tmap, SparseMatrix& Wl, SparseMatrix& Dl){ + float eps = 0.000001; + int win_size = 1; + + int nRows = img.rows; + int nCols = img.cols; + int N = img.rows*img.cols; + Mat unk_img = Mat::zeros(cv::Size(nRows, nCols), CV_32FC1); + + for (int i = 0; i < nRows; ++i) + for (int j = 0; j < nCols; ++j){ + float pix = tmap.at(i, j); + if (pix == 128){ // collection of unknown pixels samples + unk_img.at(i, j) = 255; + } + } + + Mat element = getStructuringElement(MORPH_RECT, Size(2*win_size + 1, 2*win_size+1)); + /// Apply the dilation operation + Mat dilation_dst = unk_img.clone(); +// dilate(unk_img, dilation_dst, element); + + int num_win = (win_size*2 + 1)*(win_size*2 + 1); // number of pixels in window + typedef Triplet T; + std::vector triplets, td, tl; + int neighInd[9]; + int i, j; + for (j = win_size; j < nCols-win_size; j++){ + for (i = win_size; i < nRows-win_size; i++){ + float pix = tmap.at(i, j); + //std::cout << i+j*nRows << " --> " << pix << std::endl; + if (pix != 128) continue; + // extract the window out of image + Mat win = img.rowRange(i-win_size, i+win_size+1); + win = win.colRange(j-win_size, j+win_size+1); + Mat win_ravel = Mat::zeros(9, 3, CV_64F); // doubt ?? + double sum1 = 0; + double sum2 = 0; + double sum3 = 0; + + int c = 0; + for (int q = -1; q <= 1; q++){ + for (int p = -1; p <= 1; p++){ + neighInd[c] = (j+q)*nRows + (i+p); // column major + c++; + } + } + + c = 0; + //parsing column major way in the window + for (int q = 0; q < win_size*2+1; q++){ + for (int p = 0; p < win_size*2+1; p++){ + win_ravel.at(c, 0) = win.at(p, q)[0]/255.0; + win_ravel.at(c, 1) = win.at(p, q)[1]/255.0; + win_ravel.at(c, 2) = win.at(p, q)[2]/255.0; + sum1 += win.at(p, q)[0]/255.0; + sum2 += win.at(p, q)[1]/255.0; + sum3 += win.at(p, q)[2]/255.0; + c++; + } + } + win = win_ravel; + Mat win_mean = Mat::zeros(1, 3, CV_64F); + win_mean.at(0, 0) = sum1/num_win; + win_mean.at(0, 1) = sum2/num_win; + win_mean.at(0, 2) = sum3/num_win; + + // calculate the covariance matrix + Mat covariance = (win.t() * win / num_win) - (win_mean.t() * win_mean); + + Mat I = Mat::eye(img.channels(), img.channels(), CV_64F); + Mat I1 = (covariance + (eps/num_win)*I); + Mat I1_inv = I1.inv(); + + Mat X = win - repeat(win_mean, num_win, 1); + Mat vals = (1 + X * I1_inv * X.t()) / num_win; + + for (int q = 0; q < num_win; q++){ + for (int p = 0; p < num_win; p++){ + triplets.push_back(T(neighInd[p], neighInd[q], vals.at(p, q))); + } + } + } + } + + std::vector tsp; + SparseMatrix W(N, N), Wsp(N,N); + W.setFromTriplets(triplets.begin(), triplets.end()); + + SparseMatrix Wt = W.transpose(); + SparseMatrix Ws = Wt + W; + W = Ws; + + for (int k=0; k::InnerIterator it(W,k); it; ++it) + { + sumCol += it.value(); + } + if (sumCol<0.05) sumCol=1; + tsp.push_back(T(k, k, 1/sumCol)); + } + Wsp.setFromTriplets(tsp.begin(), tsp.end()); + + Wl = Wsp * W; // For normalization + //Wl = W; // No normalization + + SparseMatrix Wlt = Wl.transpose(); + + for (int k=0; k::InnerIterator it(Wlt,k); it; ++it) sumarr += it.value(); + td.push_back(T(k, k, sumarr)); + } + + Dl.setFromTriplets(td.begin(), td.end()); + + std::cout << "local_info DONE" << std::endl; + +} +}} + +// #endif diff --git a/modules/alphamat/src/local_info.hpp b/modules/alphamat/src/local_info.hpp new file mode 100644 index 00000000000..8e6db2be57f --- /dev/null +++ b/modules/alphamat/src/local_info.hpp @@ -0,0 +1,17 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef __OPENCV_LOCAL_INFO_H__ +#define __OPENCV_LOCAL_INFO_H__ + + +namespace cv{ + namespace alphamat{ + +using namespace Eigen; + +void local_info(Mat& img, Mat& tmap, SparseMatrix& Wl, SparseMatrix& Dl); +}} + +#endif diff --git a/modules/alphamat/src/precomp.hpp b/modules/alphamat/src/precomp.hpp new file mode 100644 index 00000000000..b81dc9ce83f --- /dev/null +++ b/modules/alphamat/src/precomp.hpp @@ -0,0 +1,35 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef __OPENCV_PRECOMP_H__ +#define __OPENCV_PRECOMP_H__ + +#include +#include +#include +#include + +#include +#include + +#include "3rdparty/nanoflann.hpp" +#include "3rdparty/KDTreeVectorOfVectorsAdaptor.h" + +#ifdef HAVE_EIGEN +#include +#include +#include +#endif + +namespace cv{ +namespace alphamat{ +const int dim = 5; // dimension of feature vectors +} +} + +#include "intraU.hpp" +#include "cm.hpp" +#include "local_info.hpp" + +#endif diff --git a/modules/alphamat/tutorials/alphamat_tutorial.markdown b/modules/alphamat/tutorials/alphamat_tutorial.markdown new file mode 100644 index 00000000000..f54472dc970 --- /dev/null +++ b/modules/alphamat/tutorials/alphamat_tutorial.markdown @@ -0,0 +1,53 @@ +Information Flow Alpha Matting {#tutorial_alphamat} +============================ + +This project was part of Google Summer of Code 2019. + +*Student:* Muskaan Kularia + +*Mentor:* Sunita Nayak + +Alphamatting is the problem of extracting the foreground from an image. The extracted foreground can be used for further operations like changing the background in an image. + +Given an input image and its corresponding trimap, we try to extract the foreground from the background. Following is an example: + +Input Image: ![](samples/input_images/plant.jpg) +Input Trimap: ![](samples/trimaps/plant.png) +Output alpha Matte: ![](samples/output_mattes/plant_result.jpg) + +This project is implementation of @cite aksoy2017designing . It required implementation of parts of other papers [2,3,4]. + +# Building + +This module uses the Eigen package. + +Build the sample code of the alphamat module using the following cmake command, followed by `make` command. +``` +cmake -DOPENCV_EXTRA_MODULES_PATH= -DBUILD_EXAMPLES=ON .. + +make +``` +Please refer to OpenCV building tutorials for further details, if needed. The following target needs to be build for testing the sample code below: example_alphamat_information_flow_matting + +# Testing + +The built target can be tested as follows: +``` +example_alphamat_information_flow_matting -img= -tri= -out= +``` +# Source Code of the sample + +@includelineno alphamat/samples/information\_flow\_matting.cpp + + +# References + +[1] Yagiz Aksoy, Tunc Ozan Aydin, Marc Pollefeys, "[Designing Effective Inter-Pixel Information Flow for Natural Image Matting](http://people.inf.ethz.ch/aksoyy/ifm/)", CVPR, 2017. + +[2] Roweis, Sam T., and Lawrence K. Saul. "[Nonlinear dimensionality reduction by locally linear embedding](https://science.sciencemag.org/content/290/5500/2323)" Science 290.5500 (2000): 2323-2326. + +[3] Anat Levin, Dani Lischinski, Yair Weiss, "[A Closed Form Solution to Natural Image Matting](https://www.researchgate.net/publication/5764820_A_Closed-Form_Solution_to_Natural_Image_Matting)", IEEE TPAMI, 2008. + +[4] Qifeng Chen, Dingzeyu Li, Chi-Keung Tang, "[KNN Matting](http://dingzeyu.li/files/knn-matting-tpami.pdf)", IEEE TPAMI, 2013. + +[5] Yagiz Aksoy, "[Affinity Based Matting Toolbox](https://github.com/yaksoy/AffinityBasedMattingToolbox)". From 99fc5e61f6533ca6c4159da3c38d252ba51fa38c Mon Sep 17 00:00:00 2001 From: Sunita Nayak Date: Thu, 6 Feb 2020 12:06:51 -0800 Subject: [PATCH 02/11] removed global variable --- modules/alphamat/src/intraU.cpp | 17 +++++++++-------- modules/alphamat/src/intraU.hpp | 6 +++--- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/modules/alphamat/src/intraU.cpp b/modules/alphamat/src/intraU.cpp index c694d97b1bc..7c23efb67ab 100644 --- a/modules/alphamat/src/intraU.cpp +++ b/modules/alphamat/src/intraU.cpp @@ -8,15 +8,13 @@ namespace cv{ namespace alphamat{ -std::vector orig_ind; - int findColMajorInd(int rowMajorInd, int nRows, int nCols) { int iInd = rowMajorInd/nCols; int jInd = rowMajorInd%nCols; return (jInd*nRows+iInd); } -void generateFVectorIntraU(my_vector_of_vectors_t &samples, Mat &img, Mat& tmap) +void generateFVectorIntraU(my_vector_of_vectors_t &samples, Mat &img, Mat& tmap, std::vector& orig_ind) { int nRows = img.rows; int nCols = img.cols; @@ -50,10 +48,10 @@ void generateFVectorIntraU(my_vector_of_vectors_t &samples, Mat &img, Mat& tmap) std::cout << "Total number of unknown pixels : " << c1 << std::endl; } -void kdtree_intraU(Mat &img, Mat& tmap, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples) +void kdtree_intraU(Mat &img, Mat& tmap, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, std::vector& orig_ind) { // Generate feature vectors for intra U: - generateFVectorIntraU(samples, img, tmap); + generateFVectorIntraU(samples, img, tmap, orig_ind); typedef KDTreeVectorOfVectorsAdaptor< my_vector_of_vectors_t, double > my_kd_tree_t; my_kd_tree_t mat_index(dim /*dim*/, samples, 10 /* max leaf */ ); @@ -86,7 +84,7 @@ double l1norm(std::vector& x, std::vector& y){ return sum/dim; } -void intraU(Mat& img, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, SparseMatrix& Wuu, SparseMatrix& Duu){ +void intraU(Mat& img, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, std::vector& orig_ind, SparseMatrix& Wuu, SparseMatrix& Duu){ // input: indm, samples int n = indm.size(); // num of unknown samples std::cout << "num of unknown samples, n : " << n << std::endl; @@ -125,11 +123,14 @@ void intraU(Mat& img, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samp } void UU(Mat& image, Mat& tmap, SparseMatrix& Wuu, SparseMatrix& Duu){ + my_vector_of_vectors_t samples, indm; + std::vector orig_ind; - kdtree_intraU(image, tmap, indm, samples); - intraU(image, indm, samples, Wuu, Duu); + kdtree_intraU(image, tmap, indm, samples, orig_ind); + intraU(image, indm, samples, orig_ind, Wuu, Duu); std::cout << "Intra U Done" << std::endl; + } } diff --git a/modules/alphamat/src/intraU.hpp b/modules/alphamat/src/intraU.hpp index ba7068aacf3..de1c0ccfc7a 100644 --- a/modules/alphamat/src/intraU.hpp +++ b/modules/alphamat/src/intraU.hpp @@ -13,13 +13,13 @@ using namespace nanoflann; typedef std::vector> my_vector_of_vectors_t; -void generateFVectorIntraU(my_vector_of_vectors_t &samples, Mat &img, Mat& tmap); +void generateFVectorIntraU(my_vector_of_vectors_t &samples, Mat &img, Mat& tmap, std::vector& orig_ind); -void kdtree_intraU(Mat &img, Mat& tmap, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples); +void kdtree_intraU(Mat &img, Mat& tmap, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, std::vector& orig_ind); double l1norm(std::vector& x, std::vector& y); -void intraU(Mat& image, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, SparseMatrix& Wuu, SparseMatrix& Duu); +void intraU(Mat& image, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, std::vector& orig_ind, SparseMatrix& Wuu, SparseMatrix& Duu); void UU(Mat& image, Mat& tmap, SparseMatrix& Wuu, SparseMatrix& Duu); From a7fdae84f6ae2e1024784876482eb104ed539b0a Mon Sep 17 00:00:00 2001 From: Sunita Nayak Date: Wed, 18 Mar 2020 17:30:34 -0700 Subject: [PATCH 03/11] incorporated changes suggested by second round of review --- modules/alphamat/include/opencv2/alphamat.hpp | 40 ++----------------- modules/alphamat/src/cm.cpp | 11 ++--- modules/alphamat/src/cm.hpp | 10 ----- modules/alphamat/src/infoflow.cpp | 5 ++- modules/alphamat/src/intraU.cpp | 6 +-- modules/alphamat/src/intraU.hpp | 9 +---- .../tutorials/alphamat_tutorial.markdown | 4 +- 7 files changed, 17 insertions(+), 68 deletions(-) diff --git a/modules/alphamat/include/opencv2/alphamat.hpp b/modules/alphamat/include/opencv2/alphamat.hpp index 97e60c42585..c6f1f719fed 100644 --- a/modules/alphamat/include/opencv2/alphamat.hpp +++ b/modules/alphamat/include/opencv2/alphamat.hpp @@ -1,38 +1,6 @@ -/* - By downloading, copying, installing or using the software you agree to this - license. If you do not agree to this license, do not download, install, - copy or use the software. - License Agreement - For Open Source Computer Vision Library - (3-clause BSD License) - Copyright (C) 2013, OpenCV Foundation, all rights reserved. - Third party copyrights are property of their respective owners. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the names of the copyright holders nor the names of the contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - This software is provided by the copyright holders and contributors "as is" and - any express or implied warranties, including, but not limited to, the implied - warranties of merchantability and fitness for a particular purpose are - disclaimed. In no event shall copyright holders or contributors be liable for - any direct, indirect, incidental, special, exemplary, or consequential damages - (including, but not limited to, procurement of substitute goods or services; - loss of use, data, or profits; or business interruption) however caused - and on any theory of liability, whether in contract, strict liability, - or tort (including negligence or otherwise) arising in any way out of - the use of this software, even if advised of the possibility of such damage. - */ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. /** Information Flow algorithm implementaton for alphamatting */ @@ -53,7 +21,7 @@ namespace cv{ namespace alphamat{ -CV_EXPORTS_W void infoFlow(Mat& image, Mat& tmap, Mat& result); +CV_EXPORTS_W void infoFlow(InputArray image, InputArray tmap, Mat& result); }} #endif diff --git a/modules/alphamat/src/cm.cpp b/modules/alphamat/src/cm.cpp index e1a40456b0c..15150089218 100644 --- a/modules/alphamat/src/cm.cpp +++ b/modules/alphamat/src/cm.cpp @@ -2,10 +2,6 @@ // It is subject to the license terms in the LICENSE file found in the top-level directory // of this distribution and at http://opencv.org/license.html. -// #ifndef cm -// #define cm -// header file content - #include "precomp.hpp" #include "intraU.hpp" #include "cm.hpp" @@ -13,9 +9,8 @@ namespace cv{ namespace alphamat{ -void generateFVectorCM(my_vector_of_vectors_t &samples, Mat &img) +static void generateFVectorCM(my_vector_of_vectors_t &samples, Mat &img) { - // CV_Assert(img.depth() == CV_8U); int nRows = img.rows; int nCols = img.cols; @@ -35,7 +30,7 @@ void generateFVectorCM(my_vector_of_vectors_t &samples, Mat &img) } } -void kdtree_CM(Mat &img, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, std::unordered_set& unk) +static void kdtree_CM(Mat &img, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, std::unordered_set& unk) { // Generate feature vectors for intra U: generateFVectorCM(samples, img); @@ -72,7 +67,7 @@ void kdtree_CM(Mat &img, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& s } } -void lle(my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, float eps, std::unordered_set& unk +static void lle(my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, float eps, std::unordered_set& unk , SparseMatrix& Wcm, SparseMatrix& Dcm, Mat &img){ std::cout << "In cm's lle function" << std::endl; int k = indm[0].size(); //number of neighbours that we are considering diff --git a/modules/alphamat/src/cm.hpp b/modules/alphamat/src/cm.hpp index 255957f85ec..52d1f2e47d9 100644 --- a/modules/alphamat/src/cm.hpp +++ b/modules/alphamat/src/cm.hpp @@ -11,16 +11,6 @@ namespace cv{ using namespace Eigen; using namespace nanoflann; -typedef std::vector> my_vector_of_vectors_t; -// typedef vector>> my_vector_of_set_t; - -void generateFVectorCM(my_vector_of_vectors_t &samples, Mat &img); - -void kdtree_CM(Mat &img, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, std::unordered_set& unk); - -void lle(my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, float eps, std::unordered_set& unk - , SparseMatrix& Wcm, SparseMatrix& Dcm, Mat &img); - void cm(Mat& image, Mat& tmap, SparseMatrix& Wcm, SparseMatrix& Dcm); }} diff --git a/modules/alphamat/src/infoflow.cpp b/modules/alphamat/src/infoflow.cpp index 188435856c3..2dac69a8803 100644 --- a/modules/alphamat/src/infoflow.cpp +++ b/modules/alphamat/src/infoflow.cpp @@ -53,8 +53,11 @@ void solve(SparseMatrix Wcm,SparseMatrix Wuu,SparseMatrix& orig_ind) +static void generateFVectorIntraU(my_vector_of_vectors_t &samples, Mat &img, Mat& tmap, std::vector& orig_ind) { int nRows = img.rows; int nCols = img.cols; @@ -48,7 +48,7 @@ void generateFVectorIntraU(my_vector_of_vectors_t &samples, Mat &img, Mat& tmap, std::cout << "Total number of unknown pixels : " << c1 << std::endl; } -void kdtree_intraU(Mat &img, Mat& tmap, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, std::vector& orig_ind) +static void kdtree_intraU(Mat &img, Mat& tmap, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, std::vector& orig_ind) { // Generate feature vectors for intra U: generateFVectorIntraU(samples, img, tmap, orig_ind); @@ -84,7 +84,7 @@ double l1norm(std::vector& x, std::vector& y){ return sum/dim; } -void intraU(Mat& img, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, std::vector& orig_ind, SparseMatrix& Wuu, SparseMatrix& Duu){ +static void intraU(Mat& img, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, std::vector& orig_ind, SparseMatrix& Wuu, SparseMatrix& Duu){ // input: indm, samples int n = indm.size(); // num of unknown samples std::cout << "num of unknown samples, n : " << n << std::endl; diff --git a/modules/alphamat/src/intraU.hpp b/modules/alphamat/src/intraU.hpp index de1c0ccfc7a..9f00ea7e518 100644 --- a/modules/alphamat/src/intraU.hpp +++ b/modules/alphamat/src/intraU.hpp @@ -13,18 +13,11 @@ using namespace nanoflann; typedef std::vector> my_vector_of_vectors_t; -void generateFVectorIntraU(my_vector_of_vectors_t &samples, Mat &img, Mat& tmap, std::vector& orig_ind); - -void kdtree_intraU(Mat &img, Mat& tmap, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, std::vector& orig_ind); - double l1norm(std::vector& x, std::vector& y); -void intraU(Mat& image, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, std::vector& orig_ind, SparseMatrix& Wuu, SparseMatrix& Duu); - -void UU(Mat& image, Mat& tmap, SparseMatrix& Wuu, SparseMatrix& Duu); - int findColMajorInd(int rowMajorInd, int nRows, int nCols); +void UU(Mat& image, Mat& tmap, SparseMatrix& Wuu, SparseMatrix& Duu); } } diff --git a/modules/alphamat/tutorials/alphamat_tutorial.markdown b/modules/alphamat/tutorials/alphamat_tutorial.markdown index f54472dc970..ad97a814f10 100644 --- a/modules/alphamat/tutorials/alphamat_tutorial.markdown +++ b/modules/alphamat/tutorials/alphamat_tutorial.markdown @@ -23,7 +23,7 @@ This module uses the Eigen package. Build the sample code of the alphamat module using the following cmake command, followed by `make` command. ``` -cmake -DOPENCV_EXTRA_MODULES_PATH= -DBUILD_EXAMPLES=ON .. +cmake -DCMAKE_BUILD_TYPE=RELEASE -DOPENCV_EXTRA_MODULES_PATH= -DBUILD_EXAMPLES=ON .. make ``` @@ -37,7 +37,7 @@ example_alphamat_information_flow_matting -img= -tri=< ``` # Source Code of the sample -@includelineno alphamat/samples/information\_flow\_matting.cpp +@includelineno alphamat/samples/information_flow_matting.cpp # References From 72b78eb09f531db0c2bc3aec07192ffa6bc447bd Mon Sep 17 00:00:00 2001 From: Sunita Nayak Date: Wed, 18 Mar 2020 18:20:39 -0700 Subject: [PATCH 04/11] updated build instructions --- modules/alphamat/tutorials/alphamat_tutorial.markdown | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/alphamat/tutorials/alphamat_tutorial.markdown b/modules/alphamat/tutorials/alphamat_tutorial.markdown index ad97a814f10..3fbb06eafe4 100644 --- a/modules/alphamat/tutorials/alphamat_tutorial.markdown +++ b/modules/alphamat/tutorials/alphamat_tutorial.markdown @@ -21,13 +21,13 @@ This project is implementation of @cite aksoy2017designing . It required impleme This module uses the Eigen package. -Build the sample code of the alphamat module using the following cmake command, followed by `make` command. +Build the sample code of the alphamat module using the following two cmake commands run inside the build folder: ``` -cmake -DCMAKE_BUILD_TYPE=RELEASE -DOPENCV_EXTRA_MODULES_PATH= -DBUILD_EXAMPLES=ON .. +cmake -DOPENCV_EXTRA_MODULES_PATH= -DBUILD_EXAMPLES=ON .. -make +cmake --build . --config Release --target example_alphamat_information_flow_matting ``` -Please refer to OpenCV building tutorials for further details, if needed. The following target needs to be build for testing the sample code below: example_alphamat_information_flow_matting +Please refer to OpenCV building tutorials for further details, if needed. # Testing From 01410ffef51f6c5f4e25f4c91ee812d2247fc310 Mon Sep 17 00:00:00 2001 From: Sunita Nayak Date: Wed, 18 Mar 2020 18:31:23 -0700 Subject: [PATCH 05/11] changed to OutputArray --- modules/alphamat/include/opencv2/alphamat.hpp | 2 +- modules/alphamat/src/infoflow.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/alphamat/include/opencv2/alphamat.hpp b/modules/alphamat/include/opencv2/alphamat.hpp index c6f1f719fed..62e67e90935 100644 --- a/modules/alphamat/include/opencv2/alphamat.hpp +++ b/modules/alphamat/include/opencv2/alphamat.hpp @@ -21,7 +21,7 @@ namespace cv{ namespace alphamat{ -CV_EXPORTS_W void infoFlow(InputArray image, InputArray tmap, Mat& result); +CV_EXPORTS_W void infoFlow(InputArray image, InputArray tmap, OutputArray result); }} #endif diff --git a/modules/alphamat/src/infoflow.cpp b/modules/alphamat/src/infoflow.cpp index 2dac69a8803..a8accd1e6b2 100644 --- a/modules/alphamat/src/infoflow.cpp +++ b/modules/alphamat/src/infoflow.cpp @@ -53,7 +53,7 @@ void solve(SparseMatrix Wcm,SparseMatrix Wuu,SparseMatrix Date: Thu, 19 Mar 2020 08:39:15 -0700 Subject: [PATCH 06/11] removed whitespaces --- modules/alphamat/src/infoflow.cpp | 4 ++-- modules/alphamat/tutorials/alphamat_tutorial.markdown | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/alphamat/src/infoflow.cpp b/modules/alphamat/src/infoflow.cpp index a8accd1e6b2..24c35063e63 100644 --- a/modules/alphamat/src/infoflow.cpp +++ b/modules/alphamat/src/infoflow.cpp @@ -57,7 +57,7 @@ void infoFlow(InputArray image_ia, InputArray tmap_ia, OutputArray result){ Mat image = image_ia.getMat(); Mat tmap = tmap_ia.getMat(); - + clock_t begin = clock(); int nRows = image.rows; int nCols = image.cols; @@ -114,7 +114,7 @@ void infoFlow(InputArray image_ia, InputArray tmap_ia, OutputArray result){ solve(Wcm, Wuu, Wl, Dcm, Duu, Dl, T, wf, alpha); alpha.copyTo(result); - + end = clock(); elapsed_secs = double(end - begin) / CLOCKS_PER_SEC; std::cout<<"total time: "< -DBUILD_EXAMP cmake --build . --config Release --target example_alphamat_information_flow_matting ``` -Please refer to OpenCV building tutorials for further details, if needed. +Please refer to OpenCV building tutorials for further details, if needed. # Testing From 9b0cdecbde1df993652e16f7f1d695e1b8f92412 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Thu, 19 Mar 2020 23:03:29 +0000 Subject: [PATCH 07/11] alphamat: fix bugs triggered by assertions of Debug builds --- modules/alphamat/src/infoflow.cpp | 2 +- modules/alphamat/src/local_info.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/alphamat/src/infoflow.cpp b/modules/alphamat/src/infoflow.cpp index 24c35063e63..331aef3a590 100644 --- a/modules/alphamat/src/infoflow.cpp +++ b/modules/alphamat/src/infoflow.cpp @@ -49,7 +49,7 @@ void solve(SparseMatrix Wcm,SparseMatrix Wuu,SparseMatrix1) pix_alpha=1; - alpha.at(i, j, 0) = uchar(pix_alpha*255); + alpha.at(i, j) = uchar(pix_alpha*255); } } diff --git a/modules/alphamat/src/local_info.cpp b/modules/alphamat/src/local_info.cpp index a434c334eba..eed40fd5724 100644 --- a/modules/alphamat/src/local_info.cpp +++ b/modules/alphamat/src/local_info.cpp @@ -18,7 +18,7 @@ void local_info(Mat& img, Mat& tmap, SparseMatrix& Wl, SparseMatrix Date: Thu, 19 Mar 2020 23:55:48 +0000 Subject: [PATCH 08/11] alphamat: fix documentation --- modules/alphamat/include/opencv2/alphamat.hpp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/modules/alphamat/include/opencv2/alphamat.hpp b/modules/alphamat/include/opencv2/alphamat.hpp index 62e67e90935..927fbb09eac 100644 --- a/modules/alphamat/include/opencv2/alphamat.hpp +++ b/modules/alphamat/include/opencv2/alphamat.hpp @@ -11,17 +11,22 @@ * @defgroup alphamat Alpha Matting * This module is dedicated to compute alpha matting of images, given the input image and an input trimap. * The samples directory includes easy examples of how to use the module. - * + */ + +namespace cv { namespace alphamat { +//! @addtogroup alphamat +//! @{ + +/** * The implementation is based on Designing Effective Inter-Pixel Information Flow for Natural Image Matting by Yağız Aksoy, Tunç Ozan Aydın and Marc Pollefeys, CVPR 2019. * * This module has been originally developed by Muskaan Kularia and Sunita Nayak as a project * for Google Summer of Code 2019 (GSoC 19). * */ - -namespace cv{ namespace alphamat{ - CV_EXPORTS_W void infoFlow(InputArray image, InputArray tmap, OutputArray result); -}} +//! @} +}} // namespace + #endif From 84f08a3e1b4f44fafeb398942cbabe8112798a74 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Thu, 19 Mar 2020 23:16:28 +0000 Subject: [PATCH 09/11] alphamat: coding style fixes - get rid of std::cout - remove clock_t - drop unnecessary cast: float pix = tmap.at(i, j); - global 'dim' => 'ALPHAMAT_DIM' - fix sample command line handling --- modules/alphamat/CMakeLists.txt | 7 +- .../samples/information_flow_matting.cpp | 41 ++++---- modules/alphamat/src/cm.cpp | 57 ++++++----- modules/alphamat/src/cm.hpp | 7 +- modules/alphamat/src/infoflow.cpp | 79 +++++++-------- modules/alphamat/src/intraU.cpp | 81 +++++++++------- modules/alphamat/src/intraU.hpp | 14 ++- modules/alphamat/src/local_info.cpp | 95 +++++++++++-------- modules/alphamat/src/local_info.hpp | 10 +- modules/alphamat/src/precomp.hpp | 10 +- 10 files changed, 217 insertions(+), 184 deletions(-) diff --git a/modules/alphamat/CMakeLists.txt b/modules/alphamat/CMakeLists.txt index 23d03feec9e..f5c9d8917f2 100644 --- a/modules/alphamat/CMakeLists.txt +++ b/modules/alphamat/CMakeLists.txt @@ -1,10 +1,9 @@ if(NOT HAVE_EIGEN) - set(DISABLE_MSG "Module opencv_alphamat disabled because the following dependencies are not found:") - set(DISABLE_MSG "${DISABLE_MSG} Eigen") - message(STATUS ${DISABLE_MSG}) + message(STATUS "Module opencv_alphamat disabled because the following dependencies are not found: Eigen") ocv_module_disable(alphamat) endif() -ocv_define_module(alphamat opencv_core +ocv_define_module(alphamat + opencv_core opencv_imgproc ) diff --git a/modules/alphamat/samples/information_flow_matting.cpp b/modules/alphamat/samples/information_flow_matting.cpp index bdfad72aed1..1967c4c77b0 100644 --- a/modules/alphamat/samples/information_flow_matting.cpp +++ b/modules/alphamat/samples/information_flow_matting.cpp @@ -13,51 +13,50 @@ using namespace cv; using namespace cv::alphamat; const char* keys = -{ "{img || input image name}" "{tri || input trimap image name}" "{out || output image name}" -}; + "{help h || print help message}" +; int main(int argc, char *argv[]) { - bool show_help = (argc == 1); - show_help = show_help || (argc == 2 && string(argv[1]) == "--help"); - show_help = show_help || (argc == 2 && string(argv[1]) == "-h"); + CommandLineParser parser(argc, argv, keys); + parser.about("This sample demonstrates Information Flow Alpha Matting"); - if (show_help) + if (parser.has("help")) { - printf("\nThis sample demonstrates Information Flow Alpha Matting\n" - "Call:\n" - " %s -img= -tri= [-out=]\n\n", argv[0]); + parser.printMessage(); return 0; } - CommandLineParser parser(argc, argv, keys); - if (!parser.check()) - { - parser.printErrors(); - return -1; - } - string img_path = parser.get("img"); string trimap_path = parser.get("tri"); string result_path = parser.get("out"); + if (!parser.check() + || img_path.empty() || trimap_path.empty() + ) + { + parser.printMessage(); + parser.printErrors(); + return 1; + } + Mat image, tmap; image = imread(img_path, IMREAD_COLOR); // Read the input image file if (image.empty()) { - printf("Cannot read image file: %s\n", img_path.c_str()); - return -1; + printf("Cannot read image file: '%s'\n", img_path.c_str()); + return 1; } tmap = imread(trimap_path, IMREAD_GRAYSCALE); if (tmap.empty()) { - printf("Cannot read trimap file: %s\n", trimap_path.c_str()); - return -1; + printf("Cannot read trimap file: '%s'\n", trimap_path.c_str()); + return 1; } Mat result; @@ -72,8 +71,8 @@ int main(int argc, char *argv[]) else { imwrite(result_path, result); + printf("Result saved: '%s'\n", result_path.c_str()); } return 0; - } diff --git a/modules/alphamat/src/cm.cpp b/modules/alphamat/src/cm.cpp index 15150089218..9f8829ba41c 100644 --- a/modules/alphamat/src/cm.cpp +++ b/modules/alphamat/src/cm.cpp @@ -6,12 +6,10 @@ #include "intraU.hpp" #include "cm.hpp" -namespace cv{ -namespace alphamat{ +namespace cv { namespace alphamat { static void generateFVectorCM(my_vector_of_vectors_t &samples, Mat &img) { - int nRows = img.rows; int nCols = img.cols; @@ -20,14 +18,17 @@ static void generateFVectorCM(my_vector_of_vectors_t &samples, Mat &img) int i, j; for (i = 0; i < nRows; ++i) - for (j = 0; j < nCols; ++j){ - samples[i*nCols+j].resize(dim); + { + for (j = 0; j < nCols; ++j) + { + samples[i*nCols+j].resize(ALPHAMAT_DIM); samples[i*nCols+j][0] = img.at(i, j)[0]/255.0; samples[i*nCols+j][1] = img.at(i, j)[1]/255.0; samples[i*nCols+j][2] = img.at(i, j)[2]/255.0; samples[i*nCols+j][3] = double(i)/nRows; samples[i*nCols+j][4] = double(j)/nCols; } + } } static void kdtree_CM(Mat &img, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, std::unordered_set& unk) @@ -41,7 +42,7 @@ static void kdtree_CM(Mat &img, my_vector_of_vectors_t& indm, my_vector_of_vecto // Dimensionality set at run-time (default: L2) // ------------------------------------------------------------ typedef KDTreeVectorOfVectorsAdaptor< my_vector_of_vectors_t, double > my_kd_tree_t; - my_kd_tree_t mat_index(dim /*dim*/, samples, 10 /* max leaf */ ); + my_kd_tree_t mat_index(ALPHAMAT_DIM /*dim*/, samples, 10 /* max leaf */ ); mat_index.index->buildIndex(); // do a knn search with cm = 20 @@ -55,12 +56,14 @@ static void kdtree_CM(Mat &img, my_vector_of_vectors_t& indm, my_vector_of_vecto indm.resize(N); int i = 0; - for (std::unordered_set::iterator it = unk.begin(); it != unk.end(); it++){ - resultSet.init(&ret_indexes[0], &out_dists_sqr[0] ); + for (std::unordered_set::iterator it = unk.begin(); it != unk.end(); it++) + { + resultSet.init(&ret_indexes[0], &out_dists_sqr[0]); mat_index.index->findNeighbors(resultSet, &samples[*it][0], nanoflann::SearchParams(10)); indm[i].resize(num_results-1); - for (std::size_t j = 1; j < num_results; j++){ + for (std::size_t j = 1; j < num_results; j++) + { indm[i][j-1] = ret_indexes[j]; } i++; @@ -68,8 +71,9 @@ static void kdtree_CM(Mat &img, my_vector_of_vectors_t& indm, my_vector_of_vecto } static void lle(my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, float eps, std::unordered_set& unk - , SparseMatrix& Wcm, SparseMatrix& Dcm, Mat &img){ - std::cout << "In cm's lle function" << std::endl; + , SparseMatrix& Wcm, SparseMatrix& Dcm, Mat &img) +{ + CV_LOG_INFO(NULL, "ALPHAMAT: In cm's lle function"); int k = indm[0].size(); //number of neighbours that we are considering int n = indm.size(); //number of unknown pixels @@ -81,7 +85,7 @@ static void lle(my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, f Mat C(20, 20, DataType::type), rhs(20, 1, DataType::type), Z(3, 20, DataType::type), weights(20, 1, DataType::type), pt(3, 1, DataType::type); Mat ptDotN(20, 1, DataType::type), imd(20, 1, DataType::type); - Mat Cones(20, 1, DataType::type), Cinv(20, 1, DataType::type); + Mat Cones(20, 1, DataType::type), Cinv(20, 1, DataType::type); float alpha, beta, lagrangeMult; Cones += 1; @@ -89,14 +93,17 @@ static void lle(my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, f rhs = 1; int i, ind = 0; - for(std::unordered_set::iterator it = unk.begin(); it != unk.end(); it++){ + for(std::unordered_set::iterator it = unk.begin(); it != unk.end(); it++) + { // filling values in Z i = *it; int index_nbr; - for(int j = 0; j < k; j++){ + for(int j = 0; j < k; j++) + { index_nbr = indm[ind][j]; - for(int p = 0; p < dim-2; p++){ + for(int p = 0; p < ALPHAMAT_DIM-2; p++) + { Z.at(p,j) = samples[index_nbr][p]; } } @@ -105,8 +112,10 @@ static void lle(my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, f pt.at(2,0) = samples[i][2]; C = Z.t()*Z; - for(int p=0; p(p,p) += eps; + } ptDotN = Z.t() * pt; solve(C, ptDotN, imd); @@ -121,7 +130,8 @@ static void lle(my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, f int cMaj_i = findColMajorInd(i, img.rows, img.cols); - for(int j = 0; j < k; j++){ + for(int j = 0; j < k; j++) + { int cMaj_ind_j = findColMajorInd(indm[ind][j], img.rows, img.cols); triplets.push_back(T(cMaj_i, cMaj_ind_j, weights.at(j,0))); td.push_back(T(cMaj_i, cMaj_i, weights.at(j,0))); @@ -140,18 +150,19 @@ void cm(Mat& image, Mat& tmap, SparseMatrix& Wcm, SparseMatrix& int i, j; std::unordered_set unk; for (i = 0; i < tmap.rows; i++) - for (j = 0; j < tmap.cols; j++){ - float pix = tmap.at(i, j); + { + for (j = 0; j < tmap.cols; j++) + { + uchar pix = tmap.at(i, j); if (pix == 128) unk.insert(i*tmap.cols+j); } + } kdtree_CM(image, indm, samples, unk); float eps = 0.00001; lle(indm, samples, eps, unk, Wcm, Dcm, image); - std::cout << "cm DONE" << std::endl; -} - + CV_LOG_INFO(NULL, "ALPHAMAT: cm DONE"); } -} +}} // namespace diff --git a/modules/alphamat/src/cm.hpp b/modules/alphamat/src/cm.hpp index 52d1f2e47d9..2e6baf431e3 100644 --- a/modules/alphamat/src/cm.hpp +++ b/modules/alphamat/src/cm.hpp @@ -2,11 +2,10 @@ // It is subject to the license terms in the LICENSE file found in the top-level directory // of this distribution and at http://opencv.org/license.html. -#ifndef __OPENCV_CM_H__ -#define __OPENCV_CM_H__ +#ifndef __OPENCV_ALPHAMAT_CM_H__ +#define __OPENCV_ALPHAMAT_CM_H__ -namespace cv{ - namespace alphamat{ +namespace cv { namespace alphamat { using namespace Eigen; using namespace nanoflann; diff --git a/modules/alphamat/src/infoflow.cpp b/modules/alphamat/src/infoflow.cpp index 331aef3a590..2d55cdd780c 100644 --- a/modules/alphamat/src/infoflow.cpp +++ b/modules/alphamat/src/infoflow.cpp @@ -3,22 +3,18 @@ // of this distribution and at http://opencv.org/license.html. #include "precomp.hpp" -#include "opencv2/alphamat.hpp" -#include + #include using namespace Eigen; -namespace cv{ -namespace alphamat{ - -void solve(SparseMatrix Wcm,SparseMatrix Wuu,SparseMatrix Wl,SparseMatrix Dcm, - SparseMatrix Duu,SparseMatrix Dl, SparseMatrix T, Mat& wf, Mat& alpha); +namespace cv { namespace alphamat { +static void solve(SparseMatrix Wcm,SparseMatrix Wuu,SparseMatrix Wl,SparseMatrix Dcm, - SparseMatrix Duu, SparseMatrix Dl, SparseMatrix T, - Mat &wf, Mat &alpha){ - + SparseMatrix Duu, SparseMatrix Dl, SparseMatrix T, + Mat &wf, Mat &alpha) +{ float suu = 0.01, sl = 0.1, lamd = 100; SparseMatrix Lifm = ((Dcm-Wcm).transpose())*(Dcm-Wcm) + sl*(Dl-Wl) + suu*(Duu-Wuu); @@ -38,27 +34,31 @@ void solve(SparseMatrix Wcm,SparseMatrix Wuu,SparseMatrix1) pix_alpha=1; alpha.at(i, j) = uchar(pix_alpha*255); } + } } -void infoFlow(InputArray image_ia, InputArray tmap_ia, OutputArray result){ - +void infoFlow(InputArray image_ia, InputArray tmap_ia, OutputArray result) +{ Mat image = image_ia.getMat(); Mat tmap = tmap_ia.getMat(); - clock_t begin = clock(); + int64 begin = cv::getTickCount(); + int nRows = image.rows; int nCols = image.cols; int N = nRows*nCols; @@ -69,28 +69,31 @@ void infoFlow(InputArray image_ia, InputArray tmap_ia, OutputArray result){ //Pre-process trimap for (int i = 0; i < nRows; ++i) + { for (int j = 0; j < nCols; ++j){ - float pix = tmap.at(i, j); - if (pix <= 0.2*255) tmap.at(i, j) = 0; - else if (pix >= 0.8*255) tmap.at(i, j) = 255; - else tmap.at(i, j) = 128; + uchar& pix = tmap.at(i, j); + if (pix <= 0.2f * 255) pix = 0; + else if (pix >= 0.8f * 255) pix = 255; + else pix = 128; } + } Mat wf = Mat::zeros(nRows*nCols, 1, CV_8U); // Column Major Interpretation for working with SparseMatrix - for (int i = 0; i < nRows; ++i) - for (int j = 0; j < nCols; ++j){ - float pix = tmap.at(i, j); - if (pix != 128) // collection of known pixels samples - triplets.push_back(Tr(i+j*nRows, i+j*nRows, 1)); - else - triplets.push_back(Tr(i+j*nRows, i+j*nRows, 0)); - if (pix > 200) // foreground pixel - wf.at(i+j*nRows, 0) = 1; - else - wf.at(i+j*nRows, 0) = 0; - } + for (int i = 0; i < nRows; ++i) + { + for (int j = 0; j < nCols; ++j) + { + uchar pix = tmap.at(i, j); + + // collection of known pixels samples + triplets.push_back(Tr(i+j*nRows, i+j*nRows, (pix != 128) ? 1 : 0)); + + // foreground pixel + wf.at(i+j*nRows, 0) = (pix > 200) ? 1 : 0; + } + } SparseMatrix Wl(N, N), Dl(N, N); local_info(image, tmap, Wl, Dl); @@ -105,8 +108,7 @@ void infoFlow(InputArray image_ia, InputArray tmap_ia, OutputArray result){ Mat tmap_t = tmap.t(); UU(image, tmap, Wuu, Duu); - clock_t end = clock(); - double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC; + double elapsed_secs = ((double)(getTickCount() - begin)) / getTickFrequency(); T.setFromTriplets(triplets.begin(), triplets.end()); @@ -115,9 +117,8 @@ void infoFlow(InputArray image_ia, InputArray tmap_ia, OutputArray result){ alpha.copyTo(result); - end = clock(); - elapsed_secs = double(end - begin) / CLOCKS_PER_SEC; - std::cout<<"total time: "<(i, j); + { + for (j = 0; j < nCols; ++j) + { + uchar pix = tmap.at(i, j); if (pix == 128) unk_count++; } + } samples.resize(unk_count); orig_ind.resize(unk_count); int c1 = 0; for (i = 0; i < nRows; ++i) - for (j = 0; j < nCols; ++j){ - float pix = tmap.at(i, j); - if (pix == 128){ // collection of unknown pixels samples - samples[c1].resize(dim); + { + for (j = 0; j < nCols; ++j) + { + uchar pix = tmap.at(i, j); + if (pix == 128) // collection of unknown pixels samples + { + samples[c1].resize(ALPHAMAT_DIM); samples[c1][0] = img.at(i, j)[0]/255.0; samples[c1][1] = img.at(i, j)[1]/255.0; samples[c1][2] = img.at(i, j)[2]/255.0; samples[c1][3] = (double(i+1)/nRows)/20; samples[c1][4] = (double(j+1)/nCols)/20; orig_ind[c1] = i*nCols+j; - c1++; - } + c1++; + } } + } - std::cout << "Total number of unknown pixels : " << c1 << std::endl; + CV_LOG_INFO(NULL, "ALPHAMAT: Total number of unknown pixels : " << c1); } static void kdtree_intraU(Mat &img, Mat& tmap, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, std::vector& orig_ind) @@ -54,7 +61,7 @@ static void kdtree_intraU(Mat &img, Mat& tmap, my_vector_of_vectors_t& indm, my_ generateFVectorIntraU(samples, img, tmap, orig_ind); typedef KDTreeVectorOfVectorsAdaptor< my_vector_of_vectors_t, double > my_kd_tree_t; - my_kd_tree_t mat_index(dim /*dim*/, samples, 10 /* max leaf */ ); + my_kd_tree_t mat_index(ALPHAMAT_DIM /*dim*/, samples, 10 /* max leaf */ ); mat_index.index->buildIndex(); // do a knn search with ku = 5 const size_t num_results = 5+1; @@ -66,31 +73,39 @@ static void kdtree_intraU(Mat &img, Mat& tmap, my_vector_of_vectors_t& indm, my_ nanoflann::KNNResultSet resultSet(num_results); indm.resize(N); - for (int i = 0; i < N; i++){ - resultSet.init(&ret_indexes[0], &out_dists_sqr[0] ); + for (int i = 0; i < N; i++) + { + resultSet.init(&ret_indexes[0], &out_dists_sqr[0]); mat_index.index->findNeighbors(resultSet, &samples[i][0], nanoflann::SearchParams(10)); indm[i].resize(num_results-1); - for (std::size_t j = 1; j < num_results; j++){ + for (std::size_t j = 1; j < num_results; j++) + { indm[i][j-1] = ret_indexes[j]; } } } -double l1norm(std::vector& x, std::vector& y){ +static +double l1norm(std::vector& x, std::vector& y) +{ double sum = 0; - for (int i = 0; i < dim; i++) + for (int i = 0; i < ALPHAMAT_DIM; i++) sum += abs(x[i]-y[i]); - return sum/dim; + return sum/ALPHAMAT_DIM; } -static void intraU(Mat& img, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, std::vector& orig_ind, SparseMatrix& Wuu, SparseMatrix& Duu){ +static +void intraU(Mat& img, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, + std::vector& orig_ind, SparseMatrix& Wuu, SparseMatrix& Duu) +{ // input: indm, samples int n = indm.size(); // num of unknown samples - std::cout << "num of unknown samples, n : " << n << std::endl; + CV_LOG_INFO(NULL, "ALPHAMAT: num of unknown samples, n : " << n); int i, j, nbr_ind; - for (i = 0; i < n; i++){ + for (i = 0; i < n; i++) + { samples[i][3] *= 1/100; samples[i][4] *= 1/100; } @@ -98,13 +113,15 @@ static void intraU(Mat& img, my_vector_of_vectors_t& indm, my_vector_of_vectors_ my_vector_of_vectors_t weights; typedef Triplet T; - std::vector triplets, td; + std::vector triplets, td; double weight; - for (i = 0; i < n; i++){ - int num_nbr = indm[i].size(); - int cMaj_i = findColMajorInd(orig_ind[i], img.rows, img.cols); - for (j = 0; j < num_nbr; j++){ + for (i = 0; i < n; i++) + { + int num_nbr = indm[i].size(); + int cMaj_i = findColMajorInd(orig_ind[i], img.rows, img.cols); + for (j = 0; j < num_nbr; j++) + { nbr_ind = indm[i][j]; int cMaj_nbr_j = findColMajorInd(orig_ind[nbr_ind], img.rows, img.cols); weight = max(1-l1norm(samples[i], samples[j]), 0.0); @@ -122,16 +139,14 @@ static void intraU(Mat& img, my_vector_of_vectors_t& indm, my_vector_of_vectors_ } -void UU(Mat& image, Mat& tmap, SparseMatrix& Wuu, SparseMatrix& Duu){ - +void UU(Mat& image, Mat& tmap, SparseMatrix& Wuu, SparseMatrix& Duu) +{ my_vector_of_vectors_t samples, indm; std::vector orig_ind; kdtree_intraU(image, tmap, indm, samples, orig_ind); intraU(image, indm, samples, orig_ind, Wuu, Duu); - std::cout << "Intra U Done" << std::endl; - + CV_LOG_INFO(NULL, "ALPHAMAT: Intra U Done"); } -} -} +}} // namespace diff --git a/modules/alphamat/src/intraU.hpp b/modules/alphamat/src/intraU.hpp index 9f00ea7e518..fdd7dcf639f 100644 --- a/modules/alphamat/src/intraU.hpp +++ b/modules/alphamat/src/intraU.hpp @@ -2,24 +2,22 @@ // It is subject to the license terms in the LICENSE file found in the top-level directory // of this distribution and at http://opencv.org/license.html. -#ifndef __OPENCV_INTRAU_H__ -#define __OPENCV_INTRAU_H__ +#ifndef __OPENCV_ALPHAMAT_INTRAU_H__ +#define __OPENCV_ALPHAMAT_INTRAU_H__ -namespace cv{ - namespace alphamat{ +namespace cv { namespace alphamat { + +const int ALPHAMAT_DIM = 5; // dimension of feature vectors using namespace Eigen; using namespace nanoflann; typedef std::vector> my_vector_of_vectors_t; -double l1norm(std::vector& x, std::vector& y); - int findColMajorInd(int rowMajorInd, int nRows, int nCols); void UU(Mat& image, Mat& tmap, SparseMatrix& Wuu, SparseMatrix& Duu); - } -} +}} // namespace #endif diff --git a/modules/alphamat/src/local_info.cpp b/modules/alphamat/src/local_info.cpp index eed40fd5724..4033590de1d 100644 --- a/modules/alphamat/src/local_info.cpp +++ b/modules/alphamat/src/local_info.cpp @@ -8,41 +8,48 @@ #include "precomp.hpp" #include "local_info.hpp" -namespace cv{ - namespace alphamat{ +namespace cv { namespace alphamat { -void local_info(Mat& img, Mat& tmap, SparseMatrix& Wl, SparseMatrix& Dl){ +void local_info(Mat& img, Mat& tmap, SparseMatrix& Wl, SparseMatrix& Dl) +{ float eps = 0.000001; int win_size = 1; int nRows = img.rows; int nCols = img.cols; - int N = img.rows*img.cols; + int N = img.rows*img.cols; Mat unk_img = Mat::zeros(cv::Size(nCols, nRows), CV_32FC1); for (int i = 0; i < nRows; ++i) - for (int j = 0; j < nCols; ++j){ - float pix = tmap.at(i, j); - if (pix == 128){ // collection of unknown pixels samples + { + for (int j = 0; j < nCols; ++j) + { + uchar pix = tmap.at(i, j); + if (pix == 128) // collection of unknown pixels samples + { unk_img.at(i, j) = 255; } } + } Mat element = getStructuringElement(MORPH_RECT, Size(2*win_size + 1, 2*win_size+1)); - /// Apply the dilation operation - Mat dilation_dst = unk_img.clone(); -// dilate(unk_img, dilation_dst, element); + /// Apply the dilation operation + Mat dilation_dst = unk_img.clone(); + //dilate(unk_img, dilation_dst, element); int num_win = (win_size*2 + 1)*(win_size*2 + 1); // number of pixels in window typedef Triplet T; - std::vector triplets, td, tl; - int neighInd[9]; + std::vector triplets, td, tl; + int neighInd[9]; int i, j; - for (j = win_size; j < nCols-win_size; j++){ - for (i = win_size; i < nRows-win_size; i++){ - float pix = tmap.at(i, j); - //std::cout << i+j*nRows << " --> " << pix << std::endl; - if (pix != 128) continue; + for (j = win_size; j < nCols-win_size; j++) + { + for (i = win_size; i < nRows-win_size; i++) + { + uchar pix = tmap.at(i, j); + //std::cout << i+j*nRows << " --> " << pix << std::endl; + if (pix != 128) + continue; // extract the window out of image Mat win = img.rowRange(i-win_size, i+win_size+1); win = win.colRange(j-win_size, j+win_size+1); @@ -51,25 +58,29 @@ void local_info(Mat& img, Mat& tmap, SparseMatrix& Wl, SparseMatrix(c, 0) = win.at(p, q)[0]/255.0; win_ravel.at(c, 1) = win.at(p, q)[1]/255.0; win_ravel.at(c, 2) = win.at(p, q)[2]/255.0; sum1 += win.at(p, q)[0]/255.0; sum2 += win.at(p, q)[1]/255.0; sum3 += win.at(p, q)[2]/255.0; - c++; + c++; } } win = win_ravel; @@ -82,17 +93,19 @@ void local_info(Mat& img, Mat& tmap, SparseMatrix& Wl, SparseMatrix(p, q))); - } - } + for (int q = 0; q < num_win; q++) + { + for (int p = 0; p < num_win; p++) + { + triplets.push_back(T(neighInd[p], neighInd[q], vals.at(p, q))); + } + } } } @@ -104,7 +117,8 @@ void local_info(Mat& img, Mat& tmap, SparseMatrix& Wl, SparseMatrix Ws = Wt + W; W = Ws; - for (int k=0; k::InnerIterator it(W,k); it; ++it) { @@ -120,7 +134,8 @@ void local_info(Mat& img, Mat& tmap, SparseMatrix& Wl, SparseMatrix Wlt = Wl.transpose(); - for (int k=0; k::InnerIterator it(Wlt,k); it; ++it) sumarr += it.value(); td.push_back(T(k, k, sumarr)); @@ -128,9 +143,9 @@ void local_info(Mat& img, Mat& tmap, SparseMatrix& Wl, SparseMatrix& Wl, SparseMatrix& Dl); -}} + +}} // namespace #endif diff --git a/modules/alphamat/src/precomp.hpp b/modules/alphamat/src/precomp.hpp index b81dc9ce83f..e043d813ded 100644 --- a/modules/alphamat/src/precomp.hpp +++ b/modules/alphamat/src/precomp.hpp @@ -5,13 +5,15 @@ #ifndef __OPENCV_PRECOMP_H__ #define __OPENCV_PRECOMP_H__ -#include #include #include #include #include #include +#include + +#include #include "3rdparty/nanoflann.hpp" #include "3rdparty/KDTreeVectorOfVectorsAdaptor.h" @@ -22,12 +24,6 @@ #include #endif -namespace cv{ -namespace alphamat{ -const int dim = 5; // dimension of feature vectors -} -} - #include "intraU.hpp" #include "cm.hpp" #include "local_info.hpp" From be12f320fbe0b3d7fed85445408b5afef2d1d6b5 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Fri, 20 Mar 2020 00:01:25 +0000 Subject: [PATCH 10/11] alphamat: apply clang-format --- .../samples/information_flow_matting.cpp | 7 +- modules/alphamat/src/cm.cpp | 269 +++++++++--------- modules/alphamat/src/infoflow.cpp | 45 +-- modules/alphamat/src/intraU.cpp | 203 +++++++------ modules/alphamat/src/local_info.cpp | 196 ++++++------- 5 files changed, 361 insertions(+), 359 deletions(-) diff --git a/modules/alphamat/samples/information_flow_matting.cpp b/modules/alphamat/samples/information_flow_matting.cpp index 1967c4c77b0..f4dbda1d002 100644 --- a/modules/alphamat/samples/information_flow_matting.cpp +++ b/modules/alphamat/samples/information_flow_matting.cpp @@ -19,7 +19,7 @@ const char* keys = "{help h || print help message}" ; -int main(int argc, char *argv[]) +int main(int argc, char* argv[]) { CommandLineParser parser(argc, argv, keys); parser.about("This sample demonstrates Information Flow Alpha Matting"); @@ -35,8 +35,7 @@ int main(int argc, char *argv[]) string result_path = parser.get("out"); if (!parser.check() - || img_path.empty() || trimap_path.empty() - ) + || img_path.empty() || trimap_path.empty()) { parser.printMessage(); parser.printErrors(); @@ -45,7 +44,7 @@ int main(int argc, char *argv[]) Mat image, tmap; - image = imread(img_path, IMREAD_COLOR); // Read the input image file + image = imread(img_path, IMREAD_COLOR); // Read the input image file if (image.empty()) { printf("Cannot read image file: '%s'\n", img_path.c_str()); diff --git a/modules/alphamat/src/cm.cpp b/modules/alphamat/src/cm.cpp index 9f8829ba41c..3d6b9922790 100644 --- a/modules/alphamat/src/cm.cpp +++ b/modules/alphamat/src/cm.cpp @@ -8,161 +8,160 @@ namespace cv { namespace alphamat { -static void generateFVectorCM(my_vector_of_vectors_t &samples, Mat &img) +static void generateFVectorCM(my_vector_of_vectors_t& samples, Mat& img) { - int nRows = img.rows; - int nCols = img.cols; - - samples.resize(nRows*nCols); - - int i, j; - - for (i = 0; i < nRows; ++i) - { - for (j = 0; j < nCols; ++j) - { - samples[i*nCols+j].resize(ALPHAMAT_DIM); - samples[i*nCols+j][0] = img.at(i, j)[0]/255.0; - samples[i*nCols+j][1] = img.at(i, j)[1]/255.0; - samples[i*nCols+j][2] = img.at(i, j)[2]/255.0; - samples[i*nCols+j][3] = double(i)/nRows; - samples[i*nCols+j][4] = double(j)/nCols; - } - } + int nRows = img.rows; + int nCols = img.cols; + + samples.resize(nRows * nCols); + + int i, j; + + for (i = 0; i < nRows; ++i) + { + for (j = 0; j < nCols; ++j) + { + samples[i * nCols + j].resize(ALPHAMAT_DIM); + samples[i * nCols + j][0] = img.at(i, j)[0] / 255.0; + samples[i * nCols + j][1] = img.at(i, j)[1] / 255.0; + samples[i * nCols + j][2] = img.at(i, j)[2] / 255.0; + samples[i * nCols + j][3] = double(i) / nRows; + samples[i * nCols + j][4] = double(j) / nCols; + } + } } -static void kdtree_CM(Mat &img, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, std::unordered_set& unk) +static void kdtree_CM(Mat& img, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, std::unordered_set& unk) { - // Generate feature vectors for intra U: - generateFVectorCM(samples, img); - - // Query point: same as samples from which KD tree is generated + // Generate feature vectors for intra U: + generateFVectorCM(samples, img); - // construct a kd-tree index: - // Dimensionality set at run-time (default: L2) - // ------------------------------------------------------------ - typedef KDTreeVectorOfVectorsAdaptor< my_vector_of_vectors_t, double > my_kd_tree_t; - my_kd_tree_t mat_index(ALPHAMAT_DIM /*dim*/, samples, 10 /* max leaf */ ); - mat_index.index->buildIndex(); + // Query point: same as samples from which KD tree is generated - // do a knn search with cm = 20 - const size_t num_results = 20+1; + // construct a kd-tree index: + // Dimensionality set at run-time (default: L2) + // ------------------------------------------------------------ + typedef KDTreeVectorOfVectorsAdaptor my_kd_tree_t; + my_kd_tree_t mat_index(ALPHAMAT_DIM /*dim*/, samples, 10 /* max leaf */); + mat_index.index->buildIndex(); - int N = unk.size(); + // do a knn search with cm = 20 + const size_t num_results = 20 + 1; - std::vector ret_indexes(num_results); - std::vector out_dists_sqr(num_results); - nanoflann::KNNResultSet resultSet(num_results); + int N = unk.size(); - indm.resize(N); - int i = 0; - for (std::unordered_set::iterator it = unk.begin(); it != unk.end(); it++) - { - resultSet.init(&ret_indexes[0], &out_dists_sqr[0]); - mat_index.index->findNeighbors(resultSet, &samples[*it][0], nanoflann::SearchParams(10)); + std::vector ret_indexes(num_results); + std::vector out_dists_sqr(num_results); + nanoflann::KNNResultSet resultSet(num_results); - indm[i].resize(num_results-1); - for (std::size_t j = 1; j < num_results; j++) + indm.resize(N); + int i = 0; + for (std::unordered_set::iterator it = unk.begin(); it != unk.end(); it++) { - indm[i][j-1] = ret_indexes[j]; + resultSet.init(&ret_indexes[0], &out_dists_sqr[0]); + mat_index.index->findNeighbors(resultSet, &samples[*it][0], nanoflann::SearchParams(10)); + + indm[i].resize(num_results - 1); + for (std::size_t j = 1; j < num_results; j++) + { + indm[i][j - 1] = ret_indexes[j]; + } + i++; } - i++; - } } -static void lle(my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, float eps, std::unordered_set& unk - , SparseMatrix& Wcm, SparseMatrix& Dcm, Mat &img) +static void lle(my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, float eps, std::unordered_set& unk, SparseMatrix& Wcm, SparseMatrix& Dcm, Mat& img) { - CV_LOG_INFO(NULL, "ALPHAMAT: In cm's lle function"); - int k = indm[0].size(); //number of neighbours that we are considering - int n = indm.size(); //number of unknown pixels - - typedef Triplet T; - std::vector triplets, td; - - my_vector_of_vectors_t wcm; - wcm.resize(n); - - Mat C(20, 20, DataType::type), rhs(20, 1, DataType::type), Z(3, 20, DataType::type), weights(20, 1, DataType::type), pt(3, 1, DataType::type); - Mat ptDotN(20, 1, DataType::type), imd(20, 1, DataType::type); - Mat Cones(20, 1, DataType::type), Cinv(20, 1, DataType::type); - float alpha, beta, lagrangeMult; - Cones += 1; - - C = 0; - rhs = 1; - - int i, ind = 0; - for(std::unordered_set::iterator it = unk.begin(); it != unk.end(); it++) - { - // filling values in Z - i = *it; - - int index_nbr; - for(int j = 0; j < k; j++) - { - index_nbr = indm[ind][j]; - for(int p = 0; p < ALPHAMAT_DIM-2; p++) - { - Z.at(p,j) = samples[index_nbr][p]; - } - } - pt.at(0,0) = samples[i][0]; - pt.at(1,0) = samples[i][1]; - pt.at(2,0) = samples[i][2]; - - C = Z.t()*Z; - for (int p=0; p(p,p) += eps; - } - - ptDotN = Z.t() * pt; - solve(C, ptDotN, imd); - alpha = 1 - cv::sum(imd)[0]; - solve(C, Cones, Cinv); - beta = cv::sum(Cinv)[0]; //% sum of elements of inv(corr) - lagrangeMult = alpha / beta; - solve(C, ptDotN + lagrangeMult * Cones, weights); - - float sum = cv::sum(weights)[0]; - weights = weights / sum; - - int cMaj_i = findColMajorInd(i, img.rows, img.cols); - - for(int j = 0; j < k; j++) - { - int cMaj_ind_j = findColMajorInd(indm[ind][j], img.rows, img.cols); - triplets.push_back(T(cMaj_i, cMaj_ind_j, weights.at(j,0))); - td.push_back(T(cMaj_i, cMaj_i, weights.at(j,0))); - - } - ind++; - } - - Wcm.setFromTriplets(triplets.begin(), triplets.end()); - Dcm.setFromTriplets(td.begin(), td.end()); + CV_LOG_INFO(NULL, "ALPHAMAT: In cm's lle function"); + int k = indm[0].size(); //number of neighbours that we are considering + int n = indm.size(); //number of unknown pixels + + typedef Triplet T; + std::vector triplets, td; + + my_vector_of_vectors_t wcm; + wcm.resize(n); + + Mat C(20, 20, DataType::type), rhs(20, 1, DataType::type), Z(3, 20, DataType::type), weights(20, 1, DataType::type), pt(3, 1, DataType::type); + Mat ptDotN(20, 1, DataType::type), imd(20, 1, DataType::type); + Mat Cones(20, 1, DataType::type), Cinv(20, 1, DataType::type); + float alpha, beta, lagrangeMult; + Cones += 1; + + C = 0; + rhs = 1; + + int i, ind = 0; + for (std::unordered_set::iterator it = unk.begin(); it != unk.end(); it++) + { + // filling values in Z + i = *it; + + int index_nbr; + for (int j = 0; j < k; j++) + { + index_nbr = indm[ind][j]; + for (int p = 0; p < ALPHAMAT_DIM - 2; p++) + { + Z.at(p, j) = samples[index_nbr][p]; + } + } + pt.at(0, 0) = samples[i][0]; + pt.at(1, 0) = samples[i][1]; + pt.at(2, 0) = samples[i][2]; + + C = Z.t() * Z; + for (int p = 0; p < k; p++) + { + C.at(p, p) += eps; + } + + ptDotN = Z.t() * pt; + solve(C, ptDotN, imd); + alpha = 1 - cv::sum(imd)[0]; + solve(C, Cones, Cinv); + beta = cv::sum(Cinv)[0]; //% sum of elements of inv(corr) + lagrangeMult = alpha / beta; + solve(C, ptDotN + lagrangeMult * Cones, weights); + + float sum = cv::sum(weights)[0]; + weights = weights / sum; + + int cMaj_i = findColMajorInd(i, img.rows, img.cols); + + for (int j = 0; j < k; j++) + { + int cMaj_ind_j = findColMajorInd(indm[ind][j], img.rows, img.cols); + triplets.push_back(T(cMaj_i, cMaj_ind_j, weights.at(j, 0))); + td.push_back(T(cMaj_i, cMaj_i, weights.at(j, 0))); + } + ind++; + } + + Wcm.setFromTriplets(triplets.begin(), triplets.end()); + Dcm.setFromTriplets(td.begin(), td.end()); } -void cm(Mat& image, Mat& tmap, SparseMatrix& Wcm, SparseMatrix& Dcm){ - my_vector_of_vectors_t samples, indm, Euu; +void cm(Mat& image, Mat& tmap, SparseMatrix& Wcm, SparseMatrix& Dcm) +{ + my_vector_of_vectors_t samples, indm, Euu; - int i, j; - std::unordered_set unk; - for (i = 0; i < tmap.rows; i++) - { - for (j = 0; j < tmap.cols; j++) + int i, j; + std::unordered_set unk; + for (i = 0; i < tmap.rows; i++) { - uchar pix = tmap.at(i, j); - if (pix == 128) - unk.insert(i*tmap.cols+j); + for (j = 0; j < tmap.cols; j++) + { + uchar pix = tmap.at(i, j); + if (pix == 128) + unk.insert(i * tmap.cols + j); + } } - } - kdtree_CM(image, indm, samples, unk); - float eps = 0.00001; - lle(indm, samples, eps, unk, Wcm, Dcm, image); - CV_LOG_INFO(NULL, "ALPHAMAT: cm DONE"); + kdtree_CM(image, indm, samples, unk); + float eps = 0.00001; + lle(indm, samples, eps, unk, Wcm, Dcm, image); + CV_LOG_INFO(NULL, "ALPHAMAT: cm DONE"); } -}} // namespace +}} // namespace cv::alphamat diff --git a/modules/alphamat/src/infoflow.cpp b/modules/alphamat/src/infoflow.cpp index 2d55cdd780c..a7738d913fa 100644 --- a/modules/alphamat/src/infoflow.cpp +++ b/modules/alphamat/src/infoflow.cpp @@ -10,14 +10,13 @@ using namespace Eigen; namespace cv { namespace alphamat { -static -void solve(SparseMatrix Wcm,SparseMatrix Wuu,SparseMatrix Wl,SparseMatrix Dcm, +static void solve(SparseMatrix Wcm, SparseMatrix Wuu, SparseMatrix Wl, SparseMatrix Dcm, SparseMatrix Duu, SparseMatrix Dl, SparseMatrix T, - Mat &wf, Mat &alpha) + Mat& wf, Mat& alpha) { float suu = 0.01, sl = 0.1, lamd = 100; - SparseMatrix Lifm = ((Dcm-Wcm).transpose())*(Dcm-Wcm) + sl*(Dl-Wl) + suu*(Duu-Wuu); + SparseMatrix Lifm = ((Dcm - Wcm).transpose()) * (Dcm - Wcm) + sl * (Dl - Wl) + suu * (Duu - Wuu); SparseMatrix A; int n = wf.rows; @@ -26,10 +25,10 @@ void solve(SparseMatrix Wcm,SparseMatrix Wuu,SparseMatrix, Lower|Upper> cg; + ConjugateGradient, Lower | Upper> cg; cg.setMaxIterations(500); cg.compute(A); @@ -44,10 +43,12 @@ void solve(SparseMatrix Wcm,SparseMatrix Wuu,SparseMatrix1) pix_alpha=1; - alpha.at(i, j) = uchar(pix_alpha*255); + pix_alpha = x(i + j * nRows); + if (pix_alpha < 0) + pix_alpha = 0; + if (pix_alpha > 1) + pix_alpha = 1; + alpha.at(i, j) = uchar(pix_alpha * 255); } } } @@ -61,7 +62,7 @@ void infoFlow(InputArray image_ia, InputArray tmap_ia, OutputArray result) int nRows = image.rows; int nCols = image.cols; - int N = nRows*nCols; + int N = nRows * nCols; SparseMatrix T(N, N); typedef Triplet Tr; @@ -70,15 +71,19 @@ void infoFlow(InputArray image_ia, InputArray tmap_ia, OutputArray result) //Pre-process trimap for (int i = 0; i < nRows; ++i) { - for (int j = 0; j < nCols; ++j){ + for (int j = 0; j < nCols; ++j) + { uchar& pix = tmap.at(i, j); - if (pix <= 0.2f * 255) pix = 0; - else if (pix >= 0.8f * 255) pix = 255; - else pix = 128; + if (pix <= 0.2f * 255) + pix = 0; + else if (pix >= 0.8f * 255) + pix = 255; + else + pix = 128; } } - Mat wf = Mat::zeros(nRows*nCols, 1, CV_8U); + Mat wf = Mat::zeros(nRows * nCols, 1, CV_8U); // Column Major Interpretation for working with SparseMatrix for (int i = 0; i < nRows; ++i) @@ -88,10 +93,10 @@ void infoFlow(InputArray image_ia, InputArray tmap_ia, OutputArray result) uchar pix = tmap.at(i, j); // collection of known pixels samples - triplets.push_back(Tr(i+j*nRows, i+j*nRows, (pix != 128) ? 1 : 0)); + triplets.push_back(Tr(i + j * nRows, i + j * nRows, (pix != 128) ? 1 : 0)); // foreground pixel - wf.at(i+j*nRows, 0) = (pix > 200) ? 1 : 0; + wf.at(i + j * nRows, 0) = (pix > 200) ? 1 : 0; } } @@ -121,4 +126,4 @@ void infoFlow(InputArray image_ia, InputArray tmap_ia, OutputArray result) CV_LOG_INFO(NULL, "ALPHAMAT: total time: " << elapsed_secs); } -}} // namespace +}} // namespace cv::alphamat diff --git a/modules/alphamat/src/intraU.cpp b/modules/alphamat/src/intraU.cpp index 881a659dbfd..6b801083c10 100644 --- a/modules/alphamat/src/intraU.cpp +++ b/modules/alphamat/src/intraU.cpp @@ -9,144 +9,141 @@ namespace cv { namespace alphamat { int findColMajorInd(int rowMajorInd, int nRows, int nCols) { - int iInd = rowMajorInd/nCols; - int jInd = rowMajorInd%nCols; - return (jInd*nRows+iInd); + int iInd = rowMajorInd / nCols; + int jInd = rowMajorInd % nCols; + return (jInd * nRows + iInd); } -static void generateFVectorIntraU(my_vector_of_vectors_t &samples, Mat &img, Mat& tmap, std::vector& orig_ind) +static void generateFVectorIntraU(my_vector_of_vectors_t& samples, Mat& img, Mat& tmap, std::vector& orig_ind) { - int nRows = img.rows; - int nCols = img.cols; - int unk_count = 0; - int i, j; - for (i = 0; i < nRows; ++i) - { - for (j = 0; j < nCols; ++j) + int nRows = img.rows; + int nCols = img.cols; + int unk_count = 0; + int i, j; + for (i = 0; i < nRows; ++i) { - uchar pix = tmap.at(i, j); - if (pix == 128) - unk_count++; + for (j = 0; j < nCols; ++j) + { + uchar pix = tmap.at(i, j); + if (pix == 128) + unk_count++; + } } - } - samples.resize(unk_count); - orig_ind.resize(unk_count); - - int c1 = 0; - for (i = 0; i < nRows; ++i) - { - for (j = 0; j < nCols; ++j) + samples.resize(unk_count); + orig_ind.resize(unk_count); + + int c1 = 0; + for (i = 0; i < nRows; ++i) { - uchar pix = tmap.at(i, j); - if (pix == 128) // collection of unknown pixels samples - { - samples[c1].resize(ALPHAMAT_DIM); - samples[c1][0] = img.at(i, j)[0]/255.0; - samples[c1][1] = img.at(i, j)[1]/255.0; - samples[c1][2] = img.at(i, j)[2]/255.0; - samples[c1][3] = (double(i+1)/nRows)/20; - samples[c1][4] = (double(j+1)/nCols)/20; - orig_ind[c1] = i*nCols+j; - c1++; - } + for (j = 0; j < nCols; ++j) + { + uchar pix = tmap.at(i, j); + if (pix == 128) // collection of unknown pixels samples + { + samples[c1].resize(ALPHAMAT_DIM); + samples[c1][0] = img.at(i, j)[0] / 255.0; + samples[c1][1] = img.at(i, j)[1] / 255.0; + samples[c1][2] = img.at(i, j)[2] / 255.0; + samples[c1][3] = (double(i + 1) / nRows) / 20; + samples[c1][4] = (double(j + 1) / nCols) / 20; + orig_ind[c1] = i * nCols + j; + c1++; + } + } } - } - CV_LOG_INFO(NULL, "ALPHAMAT: Total number of unknown pixels : " << c1); + CV_LOG_INFO(NULL, "ALPHAMAT: Total number of unknown pixels : " << c1); } -static void kdtree_intraU(Mat &img, Mat& tmap, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, std::vector& orig_ind) +static void kdtree_intraU(Mat& img, Mat& tmap, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, std::vector& orig_ind) { - // Generate feature vectors for intra U: - generateFVectorIntraU(samples, img, tmap, orig_ind); - - typedef KDTreeVectorOfVectorsAdaptor< my_vector_of_vectors_t, double > my_kd_tree_t; - my_kd_tree_t mat_index(ALPHAMAT_DIM /*dim*/, samples, 10 /* max leaf */ ); - mat_index.index->buildIndex(); - // do a knn search with ku = 5 - const size_t num_results = 5+1; + // Generate feature vectors for intra U: + generateFVectorIntraU(samples, img, tmap, orig_ind); - int N = samples.size(); // no. of unknown samples + typedef KDTreeVectorOfVectorsAdaptor my_kd_tree_t; + my_kd_tree_t mat_index(ALPHAMAT_DIM /*dim*/, samples, 10 /* max leaf */); + mat_index.index->buildIndex(); + // do a knn search with ku = 5 + const size_t num_results = 5 + 1; - std::vector ret_indexes(num_results); - std::vector out_dists_sqr(num_results); - nanoflann::KNNResultSet resultSet(num_results); + int N = samples.size(); // no. of unknown samples - indm.resize(N); - for (int i = 0; i < N; i++) - { - resultSet.init(&ret_indexes[0], &out_dists_sqr[0]); - mat_index.index->findNeighbors(resultSet, &samples[i][0], nanoflann::SearchParams(10)); + std::vector ret_indexes(num_results); + std::vector out_dists_sqr(num_results); + nanoflann::KNNResultSet resultSet(num_results); - indm[i].resize(num_results-1); - for (std::size_t j = 1; j < num_results; j++) + indm.resize(N); + for (int i = 0; i < N; i++) { - indm[i][j-1] = ret_indexes[j]; + resultSet.init(&ret_indexes[0], &out_dists_sqr[0]); + mat_index.index->findNeighbors(resultSet, &samples[i][0], nanoflann::SearchParams(10)); + + indm[i].resize(num_results - 1); + for (std::size_t j = 1; j < num_results; j++) + { + indm[i][j - 1] = ret_indexes[j]; + } } - } } static double l1norm(std::vector& x, std::vector& y) { - double sum = 0; - for (int i = 0; i < ALPHAMAT_DIM; i++) - sum += abs(x[i]-y[i]); - return sum/ALPHAMAT_DIM; + double sum = 0; + for (int i = 0; i < ALPHAMAT_DIM; i++) + sum += abs(x[i] - y[i]); + return sum / ALPHAMAT_DIM; } -static -void intraU(Mat& img, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, +static void intraU(Mat& img, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, std::vector& orig_ind, SparseMatrix& Wuu, SparseMatrix& Duu) { - // input: indm, samples - int n = indm.size(); // num of unknown samples - CV_LOG_INFO(NULL, "ALPHAMAT: num of unknown samples, n : " << n); - - int i, j, nbr_ind; - for (i = 0; i < n; i++) - { - samples[i][3] *= 1/100; - samples[i][4] *= 1/100; - } - - - my_vector_of_vectors_t weights; - typedef Triplet T; - std::vector triplets, td; - - double weight; - for (i = 0; i < n; i++) - { - int num_nbr = indm[i].size(); - int cMaj_i = findColMajorInd(orig_ind[i], img.rows, img.cols); - for (j = 0; j < num_nbr; j++) + // input: indm, samples + int n = indm.size(); // num of unknown samples + CV_LOG_INFO(NULL, "ALPHAMAT: num of unknown samples, n : " << n); + + int i, j, nbr_ind; + for (i = 0; i < n; i++) { - nbr_ind = indm[i][j]; - int cMaj_nbr_j = findColMajorInd(orig_ind[nbr_ind], img.rows, img.cols); - weight = max(1-l1norm(samples[i], samples[j]), 0.0); + samples[i][3] *= 1 / 100; + samples[i][4] *= 1 / 100; + } - triplets.push_back(T(cMaj_i, cMaj_nbr_j, weight/2)); - td.push_back(T(cMaj_i, cMaj_i, weight/2)); + my_vector_of_vectors_t weights; + typedef Triplet T; + std::vector triplets, td; - triplets.push_back(T(cMaj_nbr_j, cMaj_i, weight/2)); - td.push_back(T(cMaj_nbr_j, cMaj_nbr_j, weight/2)); + double weight; + for (i = 0; i < n; i++) + { + int num_nbr = indm[i].size(); + int cMaj_i = findColMajorInd(orig_ind[i], img.rows, img.cols); + for (j = 0; j < num_nbr; j++) + { + nbr_ind = indm[i][j]; + int cMaj_nbr_j = findColMajorInd(orig_ind[nbr_ind], img.rows, img.cols); + weight = max(1 - l1norm(samples[i], samples[j]), 0.0); + + triplets.push_back(T(cMaj_i, cMaj_nbr_j, weight / 2)); + td.push_back(T(cMaj_i, cMaj_i, weight / 2)); + + triplets.push_back(T(cMaj_nbr_j, cMaj_i, weight / 2)); + td.push_back(T(cMaj_nbr_j, cMaj_nbr_j, weight / 2)); + } } - } - - Wuu.setFromTriplets(triplets.begin(), triplets.end()); - Duu.setFromTriplets(td.begin(), td.end()); + Wuu.setFromTriplets(triplets.begin(), triplets.end()); + Duu.setFromTriplets(td.begin(), td.end()); } void UU(Mat& image, Mat& tmap, SparseMatrix& Wuu, SparseMatrix& Duu) { - my_vector_of_vectors_t samples, indm; - std::vector orig_ind; + my_vector_of_vectors_t samples, indm; + std::vector orig_ind; - kdtree_intraU(image, tmap, indm, samples, orig_ind); - intraU(image, indm, samples, orig_ind, Wuu, Duu); - CV_LOG_INFO(NULL, "ALPHAMAT: Intra U Done"); + kdtree_intraU(image, tmap, indm, samples, orig_ind); + intraU(image, indm, samples, orig_ind, Wuu, Duu); + CV_LOG_INFO(NULL, "ALPHAMAT: Intra U Done"); } -}} // namespace +}} // namespace cv::alphamat diff --git a/modules/alphamat/src/local_info.cpp b/modules/alphamat/src/local_info.cpp index 4033590de1d..5460e864351 100644 --- a/modules/alphamat/src/local_info.cpp +++ b/modules/alphamat/src/local_info.cpp @@ -12,132 +12,134 @@ namespace cv { namespace alphamat { void local_info(Mat& img, Mat& tmap, SparseMatrix& Wl, SparseMatrix& Dl) { - float eps = 0.000001; - int win_size = 1; + float eps = 0.000001; + int win_size = 1; - int nRows = img.rows; - int nCols = img.cols; - int N = img.rows*img.cols; - Mat unk_img = Mat::zeros(cv::Size(nCols, nRows), CV_32FC1); + int nRows = img.rows; + int nCols = img.cols; + int N = img.rows * img.cols; + Mat unk_img = Mat::zeros(cv::Size(nCols, nRows), CV_32FC1); - for (int i = 0; i < nRows; ++i) - { - for (int j = 0; j < nCols; ++j) + for (int i = 0; i < nRows; ++i) { - uchar pix = tmap.at(i, j); - if (pix == 128) // collection of unknown pixels samples - { - unk_img.at(i, j) = 255; - } + for (int j = 0; j < nCols; ++j) + { + uchar pix = tmap.at(i, j); + if (pix == 128) // collection of unknown pixels samples + { + unk_img.at(i, j) = 255; + } + } } - } - - Mat element = getStructuringElement(MORPH_RECT, Size(2*win_size + 1, 2*win_size+1)); - /// Apply the dilation operation - Mat dilation_dst = unk_img.clone(); - //dilate(unk_img, dilation_dst, element); - - int num_win = (win_size*2 + 1)*(win_size*2 + 1); // number of pixels in window - typedef Triplet T; - std::vector triplets, td, tl; - int neighInd[9]; - int i, j; - for (j = win_size; j < nCols-win_size; j++) - { - for (i = win_size; i < nRows-win_size; i++) + + Mat element = getStructuringElement(MORPH_RECT, Size(2 * win_size + 1, 2 * win_size + 1)); + /// Apply the dilation operation + Mat dilation_dst = unk_img.clone(); + //dilate(unk_img, dilation_dst, element); + + int num_win = (win_size * 2 + 1) * (win_size * 2 + 1); // number of pixels in window + typedef Triplet T; + std::vector triplets, td, tl; + int neighInd[9]; + int i, j; + for (j = win_size; j < nCols - win_size; j++) { - uchar pix = tmap.at(i, j); - //std::cout << i+j*nRows << " --> " << pix << std::endl; - if (pix != 128) - continue; - // extract the window out of image - Mat win = img.rowRange(i-win_size, i+win_size+1); - win = win.colRange(j-win_size, j+win_size+1); - Mat win_ravel = Mat::zeros(9, 3, CV_64F); // doubt ?? - double sum1 = 0; - double sum2 = 0; - double sum3 = 0; - - int c = 0; - for (int q = -1; q <= 1; q++) - { - for (int p = -1; p <= 1; p++) - { - neighInd[c] = (j+q)*nRows + (i+p); // column major - c++; - } - } - - c = 0; - //parsing column major way in the window - for (int q = 0; q < win_size*2+1; q++) - { - for (int p = 0; p < win_size*2+1; p++) + for (i = win_size; i < nRows - win_size; i++) { - win_ravel.at(c, 0) = win.at(p, q)[0]/255.0; - win_ravel.at(c, 1) = win.at(p, q)[1]/255.0; - win_ravel.at(c, 2) = win.at(p, q)[2]/255.0; - sum1 += win.at(p, q)[0]/255.0; - sum2 += win.at(p, q)[1]/255.0; - sum3 += win.at(p, q)[2]/255.0; - c++; + uchar pix = tmap.at(i, j); + //std::cout << i+j*nRows << " --> " << pix << std::endl; + if (pix != 128) + continue; + // extract the window out of image + Mat win = img.rowRange(i - win_size, i + win_size + 1); + win = win.colRange(j - win_size, j + win_size + 1); + Mat win_ravel = Mat::zeros(9, 3, CV_64F); // doubt ?? + double sum1 = 0; + double sum2 = 0; + double sum3 = 0; + + int c = 0; + for (int q = -1; q <= 1; q++) + { + for (int p = -1; p <= 1; p++) + { + neighInd[c] = (j + q) * nRows + (i + p); // column major + c++; + } + } + + c = 0; + //parsing column major way in the window + for (int q = 0; q < win_size * 2 + 1; q++) + { + for (int p = 0; p < win_size * 2 + 1; p++) + { + win_ravel.at(c, 0) = win.at(p, q)[0] / 255.0; + win_ravel.at(c, 1) = win.at(p, q)[1] / 255.0; + win_ravel.at(c, 2) = win.at(p, q)[2] / 255.0; + sum1 += win.at(p, q)[0] / 255.0; + sum2 += win.at(p, q)[1] / 255.0; + sum3 += win.at(p, q)[2] / 255.0; + c++; + } + } + win = win_ravel; + Mat win_mean = Mat::zeros(1, 3, CV_64F); + win_mean.at(0, 0) = sum1 / num_win; + win_mean.at(0, 1) = sum2 / num_win; + win_mean.at(0, 2) = sum3 / num_win; + + // calculate the covariance matrix + Mat covariance = (win.t() * win / num_win) - (win_mean.t() * win_mean); + + Mat I = Mat::eye(img.channels(), img.channels(), CV_64F); + Mat I1 = (covariance + (eps / num_win) * I); + Mat I1_inv = I1.inv(); + + Mat X = win - repeat(win_mean, num_win, 1); + Mat vals = (1 + X * I1_inv * X.t()) / num_win; + + for (int q = 0; q < num_win; q++) + { + for (int p = 0; p < num_win; p++) + { + triplets.push_back(T(neighInd[p], neighInd[q], vals.at(p, q))); + } + } } - } - win = win_ravel; - Mat win_mean = Mat::zeros(1, 3, CV_64F); - win_mean.at(0, 0) = sum1/num_win; - win_mean.at(0, 1) = sum2/num_win; - win_mean.at(0, 2) = sum3/num_win; - - // calculate the covariance matrix - Mat covariance = (win.t() * win / num_win) - (win_mean.t() * win_mean); - - Mat I = Mat::eye(img.channels(), img.channels(), CV_64F); - Mat I1 = (covariance + (eps/num_win)*I); - Mat I1_inv = I1.inv(); - - Mat X = win - repeat(win_mean, num_win, 1); - Mat vals = (1 + X * I1_inv * X.t()) / num_win; - - for (int q = 0; q < num_win; q++) - { - for (int p = 0; p < num_win; p++) - { - triplets.push_back(T(neighInd[p], neighInd[q], vals.at(p, q))); - } - } } - } std::vector tsp; - SparseMatrix W(N, N), Wsp(N,N); + SparseMatrix W(N, N), Wsp(N, N); W.setFromTriplets(triplets.begin(), triplets.end()); SparseMatrix Wt = W.transpose(); SparseMatrix Ws = Wt + W; W = Ws; - for (int k=0; k::InnerIterator it(W,k); it; ++it) + for (SparseMatrix::InnerIterator it(W, k); it; ++it) { sumCol += it.value(); } - if (sumCol<0.05) sumCol=1; - tsp.push_back(T(k, k, 1/sumCol)); + if (sumCol < 0.05) + sumCol = 1; + tsp.push_back(T(k, k, 1 / sumCol)); } Wsp.setFromTriplets(tsp.begin(), tsp.end()); - Wl = Wsp * W; // For normalization + Wl = Wsp * W; // For normalization //Wl = W; // No normalization SparseMatrix Wlt = Wl.transpose(); - for (int k=0; k::InnerIterator it(Wlt,k); it; ++it) sumarr += it.value(); + for (SparseMatrix::InnerIterator it(Wlt, k); it; ++it) + sumarr += it.value(); td.push_back(T(k, k, sumarr)); } @@ -146,6 +148,6 @@ void local_info(Mat& img, Mat& tmap, SparseMatrix& Wl, SparseMatrix Date: Fri, 20 Mar 2020 00:09:41 +0000 Subject: [PATCH 11/11] clang-format fixups --- modules/alphamat/src/cm.cpp | 10 +++++++--- modules/alphamat/src/infoflow.cpp | 3 ++- modules/alphamat/src/intraU.cpp | 9 ++++++--- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/modules/alphamat/src/cm.cpp b/modules/alphamat/src/cm.cpp index 3d6b9922790..19dcb961e4a 100644 --- a/modules/alphamat/src/cm.cpp +++ b/modules/alphamat/src/cm.cpp @@ -8,7 +8,8 @@ namespace cv { namespace alphamat { -static void generateFVectorCM(my_vector_of_vectors_t& samples, Mat& img) +static +void generateFVectorCM(my_vector_of_vectors_t& samples, Mat& img) { int nRows = img.rows; int nCols = img.cols; @@ -31,7 +32,8 @@ static void generateFVectorCM(my_vector_of_vectors_t& samples, Mat& img) } } -static void kdtree_CM(Mat& img, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, std::unordered_set& unk) +static +void kdtree_CM(Mat& img, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, std::unordered_set& unk) { // Generate feature vectors for intra U: generateFVectorCM(samples, img); @@ -70,7 +72,9 @@ static void kdtree_CM(Mat& img, my_vector_of_vectors_t& indm, my_vector_of_vecto } } -static void lle(my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, float eps, std::unordered_set& unk, SparseMatrix& Wcm, SparseMatrix& Dcm, Mat& img) +static +void lle(my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, float eps, std::unordered_set& unk, + SparseMatrix& Wcm, SparseMatrix& Dcm, Mat& img) { CV_LOG_INFO(NULL, "ALPHAMAT: In cm's lle function"); int k = indm[0].size(); //number of neighbours that we are considering diff --git a/modules/alphamat/src/infoflow.cpp b/modules/alphamat/src/infoflow.cpp index a7738d913fa..e85ed8db5d1 100644 --- a/modules/alphamat/src/infoflow.cpp +++ b/modules/alphamat/src/infoflow.cpp @@ -10,7 +10,8 @@ using namespace Eigen; namespace cv { namespace alphamat { -static void solve(SparseMatrix Wcm, SparseMatrix Wuu, SparseMatrix Wl, SparseMatrix Dcm, +static +void solve(SparseMatrix Wcm, SparseMatrix Wuu, SparseMatrix Wl, SparseMatrix Dcm, SparseMatrix Duu, SparseMatrix Dl, SparseMatrix T, Mat& wf, Mat& alpha) { diff --git a/modules/alphamat/src/intraU.cpp b/modules/alphamat/src/intraU.cpp index 6b801083c10..167458fcfc1 100644 --- a/modules/alphamat/src/intraU.cpp +++ b/modules/alphamat/src/intraU.cpp @@ -14,7 +14,8 @@ int findColMajorInd(int rowMajorInd, int nRows, int nCols) return (jInd * nRows + iInd); } -static void generateFVectorIntraU(my_vector_of_vectors_t& samples, Mat& img, Mat& tmap, std::vector& orig_ind) +static +void generateFVectorIntraU(my_vector_of_vectors_t& samples, Mat& img, Mat& tmap, std::vector& orig_ind) { int nRows = img.rows; int nCols = img.cols; @@ -55,7 +56,8 @@ static void generateFVectorIntraU(my_vector_of_vectors_t& samples, Mat& img, Mat CV_LOG_INFO(NULL, "ALPHAMAT: Total number of unknown pixels : " << c1); } -static void kdtree_intraU(Mat& img, Mat& tmap, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, std::vector& orig_ind) +static +void kdtree_intraU(Mat& img, Mat& tmap, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, std::vector& orig_ind) { // Generate feature vectors for intra U: generateFVectorIntraU(samples, img, tmap, orig_ind); @@ -95,7 +97,8 @@ double l1norm(std::vector& x, std::vector& y) return sum / ALPHAMAT_DIM; } -static void intraU(Mat& img, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, +static +void intraU(Mat& img, my_vector_of_vectors_t& indm, my_vector_of_vectors_t& samples, std::vector& orig_ind, SparseMatrix& Wuu, SparseMatrix& Duu) { // input: indm, samples