From: Andrey Kamaev Date: Fri, 16 Sep 2011 12:38:41 +0000 (+0000) Subject: Removed countNonZero call from CirclesGridClusterFinder::hierarchicalClustering X-Git-Tag: accepted/tizen/6.0/unified/20201030.111113~6058 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1554d7ab65d7f6743fb7783935152b1429844391;p=platform%2Fupstream%2Fopencv.git Removed countNonZero call from CirclesGridClusterFinder::hierarchicalClustering --- diff --git a/modules/calib3d/src/circlesgrid.cpp b/modules/calib3d/src/circlesgrid.cpp index 3f4c3ce..8829468 100644 --- a/modules/calib3d/src/circlesgrid.cpp +++ b/modules/calib3d/src/circlesgrid.cpp @@ -52,58 +52,61 @@ using namespace std; void CirclesGridClusterFinder::hierarchicalClustering(const vector points, const Size &patternSize, vector &patternPoints) { - int i, j, n = (int)points.size(); - Mat dists(n, n, CV_32FC1, Scalar(0)); - Mat distsMask(dists.size(), CV_8UC1, Scalar(0)); - for(i = 0; i < n; i++) - { - for(j = i+1; j < n; j++) + int i, j, n = (int)points.size(); + size_t pn = static_cast(patternSize.area()); + + patternPoints.clear(); + if (pn >= points.size()) { - dists.at(i, j) = (float)norm(points[i] - points[j]); - distsMask.at(i, j) = 255; - //TODO: use symmetry - distsMask.at(j, i) = 255;//distsMask.at(i, j); - dists.at(j, i) = dists.at(i, j); + if (pn == points.size()) + patternPoints = points; + return; } - } - vector > clusters(points.size()); - for(size_t i=0; i(i, j) = (float)norm(points[i] - points[j]); + distsMask.at(i, j) = 255; + //TODO: use symmetry + distsMask.at(j, i) = 255;//distsMask.at(i, j); + dists.at(j, i) = dists.at(i, j); + } + } - int patternClusterIdx = 0; - while(clusters[patternClusterIdx].size() < static_cast(patternSize.area()) && countNonZero(distsMask) > 0) - { - Point minLoc; - minMaxLoc(dists, 0, 0, &minLoc, 0, distsMask); - int minIdx = std::min(minLoc.x, minLoc.y); - int maxIdx = std::max(minLoc.x, minLoc.y); - - distsMask.row(maxIdx).setTo(0); - distsMask.col(maxIdx).setTo(0); - Mat newDists = cv::min(dists.row(minLoc.x), dists.row(minLoc.y)); - Mat tmpLine = dists.row(minIdx); - newDists.copyTo(tmpLine); - tmpLine = dists.col(minIdx); - newDists.copyTo(tmpLine); - - clusters[minIdx].splice(clusters[minIdx].end(), clusters[maxIdx]); - patternClusterIdx = minIdx; - } + vector > clusters(points.size()); + for(size_t i=0; i(patternSize.area())) - { - return; - } - patternPoints.reserve(clusters[patternClusterIdx].size()); - for(std::list::iterator it = clusters[patternClusterIdx].begin(); it != clusters[patternClusterIdx].end(); it++) - { - patternPoints.push_back(points[*it]); - } + patternPoints.reserve(clusters[patternClusterIdx].size()); + for(std::list::iterator it = clusters[patternClusterIdx].begin(); it != clusters[patternClusterIdx].end(); it++) + { + patternPoints.push_back(points[*it]); + } } void CirclesGridClusterFinder::findGrid(const std::vector points, cv::Size _patternSize, vector& centers)