From 180e54d09d13e90df722f5e0b821323d726f1380 Mon Sep 17 00:00:00 2001 From: Takahiro Poly Horikawa Date: Fri, 28 Nov 2014 18:39:49 +0900 Subject: [PATCH] - Use cv::Mutex to safely update converged flag - Use cv::AutoBuffer rather than new allocation - Fix "assignment operator could not be generated" warning --- .../include/opencv2/flann/kmeans_index.h | 48 ++++++++----------- 1 file changed, 21 insertions(+), 27 deletions(-) diff --git a/modules/flann/include/opencv2/flann/kmeans_index.h b/modules/flann/include/opencv2/flann/kmeans_index.h index 1655ac6a11..e0ee9618bc 100644 --- a/modules/flann/include/opencv2/flann/kmeans_index.h +++ b/modules/flann/include/opencv2/flann/kmeans_index.h @@ -69,6 +69,7 @@ struct KMeansIndexParams : public IndexParams } }; + /** * Hierarchical kmeans index * @@ -275,7 +276,7 @@ public: public: KMeansDistanceComputer(Distance _distance, const Matrix& _dataset, const int _branching, const int* _indices, const Matrix& _dcenters, const int _veclen, - int* _count, int* _belongs_to, std::vector& _radiuses, bool* _updated) + int* _count, int* _belongs_to, std::vector& _radiuses, bool& _converged, cv::Mutex& _mtx) : distance(_distance) , dataset(_dataset) , branching(_branching) @@ -285,7 +286,8 @@ public: , count(_count) , belongs_to(_belongs_to) , radiuses(_radiuses) - , updated(_updated) + , converged(_converged) + , mtx(_mtx) { } @@ -312,9 +314,9 @@ public: count[belongs_to[i]]--; count[new_centroid]++; belongs_to[i] = new_centroid; - updated[i] = true; - } else { - updated[i] = false; + mtx.lock(); + converged = false; + mtx.unlock(); } } } @@ -322,14 +324,15 @@ public: private: Distance distance; const Matrix& dataset; - const int branching; + int branching; const int* indices; const Matrix& dcenters; int veclen; int* count; int* belongs_to; std::vector& radiuses; - bool* updated; + bool& converged; + cv::Mutex& mtx; }; /** @@ -719,7 +722,8 @@ private: return; } - int* centers_idx = new int[branching]; + cv::AutoBuffer centers_idx_buf(branching); + int* centers_idx = (int*)centers_idx_buf; int centers_length; (this->*chooseCenters)(branching, indices, indices_length, centers_idx, centers_length); @@ -727,29 +731,30 @@ private: node->indices = indices; std::sort(node->indices,node->indices+indices_length); node->childs = NULL; - delete [] centers_idx; return; } - Matrix dcenters(new double[branching*veclen_],branching,veclen_); + cv::AutoBuffer dcenters_buf(branching*veclen_); + Matrix dcenters((double*)dcenters_buf,branching,veclen_); for (int i=0; i radiuses(branching); - int* count = new int[branching]; + cv::AutoBuffer count_buf(branching); + int* count = (int*)count_buf; for (int i=0; i belongs_to_buf(indices_length); + int* belongs_to = (int*)belongs_to_buf; for (int i=0; ichilds[c],indices+start, end-start, branching, level+1); start=end; } - - delete[] dcenters.data; - delete[] centers; - delete[] count; - delete[] belongs_to; - delete[] updated; }