Commit 1554d7ab authored by Andrey Kamaev's avatar Andrey Kamaev

Removed countNonZero call from CirclesGridClusterFinder::hierarchicalClustering

parent 23636433
...@@ -53,6 +53,16 @@ using namespace std; ...@@ -53,6 +53,16 @@ using namespace std;
void CirclesGridClusterFinder::hierarchicalClustering(const vector<Point2f> points, const Size &patternSize, vector<Point2f> &patternPoints) void CirclesGridClusterFinder::hierarchicalClustering(const vector<Point2f> points, const Size &patternSize, vector<Point2f> &patternPoints)
{ {
int i, j, n = (int)points.size(); int i, j, n = (int)points.size();
size_t pn = static_cast<size_t>(patternSize.area());
patternPoints.clear();
if (pn >= points.size())
{
if (pn == points.size())
patternPoints = points;
return;
}
Mat dists(n, n, CV_32FC1, Scalar(0)); Mat dists(n, n, CV_32FC1, Scalar(0));
Mat distsMask(dists.size(), CV_8UC1, Scalar(0)); Mat distsMask(dists.size(), CV_8UC1, Scalar(0));
for(i = 0; i < n; i++) for(i = 0; i < n; i++)
...@@ -74,7 +84,7 @@ void CirclesGridClusterFinder::hierarchicalClustering(const vector<Point2f> poin ...@@ -74,7 +84,7 @@ void CirclesGridClusterFinder::hierarchicalClustering(const vector<Point2f> poin
} }
int patternClusterIdx = 0; int patternClusterIdx = 0;
while(clusters[patternClusterIdx].size() < static_cast<size_t>(patternSize.area()) && countNonZero(distsMask) > 0) while(clusters[patternClusterIdx].size() < pn)
{ {
Point minLoc; Point minLoc;
minMaxLoc(dists, 0, 0, &minLoc, 0, distsMask); minMaxLoc(dists, 0, 0, &minLoc, 0, distsMask);
...@@ -83,22 +93,15 @@ void CirclesGridClusterFinder::hierarchicalClustering(const vector<Point2f> poin ...@@ -83,22 +93,15 @@ void CirclesGridClusterFinder::hierarchicalClustering(const vector<Point2f> poin
distsMask.row(maxIdx).setTo(0); distsMask.row(maxIdx).setTo(0);
distsMask.col(maxIdx).setTo(0); distsMask.col(maxIdx).setTo(0);
Mat newDists = cv::min(dists.row(minLoc.x), dists.row(minLoc.y)); Mat tmpRow = dists.row(minIdx);
Mat tmpLine = dists.row(minIdx); Mat tmpCol = dists.col(minIdx);
newDists.copyTo(tmpLine); cv::min(dists.row(minLoc.x), dists.row(minLoc.y), tmpRow);
tmpLine = dists.col(minIdx); tmpRow.copyTo(tmpCol);
newDists.copyTo(tmpLine);
clusters[minIdx].splice(clusters[minIdx].end(), clusters[maxIdx]); clusters[minIdx].splice(clusters[minIdx].end(), clusters[maxIdx]);
patternClusterIdx = minIdx; patternClusterIdx = minIdx;
} }
patternPoints.clear();
if(clusters[patternClusterIdx].size() != static_cast<size_t>(patternSize.area()))
{
return;
}
patternPoints.reserve(clusters[patternClusterIdx].size()); patternPoints.reserve(clusters[patternClusterIdx].size());
for(std::list<size_t>::iterator it = clusters[patternClusterIdx].begin(); it != clusters[patternClusterIdx].end(); it++) for(std::list<size_t>::iterator it = clusters[patternClusterIdx].begin(); it != clusters[patternClusterIdx].end(); it++)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment