Removed countNonZero call from CirclesGridClusterFinder::hierarchicalClustering

pull/13383/head
Andrey Kamaev 14 years ago
parent 23636433d7
commit 1554d7ab65
  1. 95
      modules/calib3d/src/circlesgrid.cpp

@ -52,58 +52,61 @@ 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();
Mat dists(n, n, CV_32FC1, Scalar(0)); size_t pn = static_cast<size_t>(patternSize.area());
Mat distsMask(dists.size(), CV_8UC1, Scalar(0));
for(i = 0; i < n; i++) patternPoints.clear();
{ if (pn >= points.size())
for(j = i+1; j < n; j++)
{ {
dists.at<float>(i, j) = (float)norm(points[i] - points[j]); if (pn == points.size())
distsMask.at<uchar>(i, j) = 255; patternPoints = points;
//TODO: use symmetry return;
distsMask.at<uchar>(j, i) = 255;//distsMask.at<uchar>(i, j);
dists.at<float>(j, i) = dists.at<float>(i, j);
} }
}
vector<std::list<size_t> > clusters(points.size()); Mat dists(n, n, CV_32FC1, Scalar(0));
for(size_t i=0; i<points.size(); i++) Mat distsMask(dists.size(), CV_8UC1, Scalar(0));
{ for(i = 0; i < n; i++)
clusters[i].push_back(i); {
} for(j = i+1; j < n; j++)
{
dists.at<float>(i, j) = (float)norm(points[i] - points[j]);
distsMask.at<uchar>(i, j) = 255;
//TODO: use symmetry
distsMask.at<uchar>(j, i) = 255;//distsMask.at<uchar>(i, j);
dists.at<float>(j, i) = dists.at<float>(i, j);
}
}
int patternClusterIdx = 0; vector<std::list<size_t> > clusters(points.size());
while(clusters[patternClusterIdx].size() < static_cast<size_t>(patternSize.area()) && countNonZero(distsMask) > 0) for(size_t i=0; i<points.size(); i++)
{ {
Point minLoc; clusters[i].push_back(i);
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;
}
patternPoints.clear(); int patternClusterIdx = 0;
while(clusters[patternClusterIdx].size() < pn)
{
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 tmpRow = dists.row(minIdx);
Mat tmpCol = dists.col(minIdx);
cv::min(dists.row(minLoc.x), dists.row(minLoc.y), tmpRow);
tmpRow.copyTo(tmpCol);
clusters[minIdx].splice(clusters[minIdx].end(), clusters[maxIdx]);
patternClusterIdx = minIdx;
}
if(clusters[patternClusterIdx].size() != static_cast<size_t>(patternSize.area())) patternPoints.reserve(clusters[patternClusterIdx].size());
{ for(std::list<size_t>::iterator it = clusters[patternClusterIdx].begin(); it != clusters[patternClusterIdx].end(); it++)
return; {
} patternPoints.push_back(points[*it]);
patternPoints.reserve(clusters[patternClusterIdx].size()); }
for(std::list<size_t>::iterator it = clusters[patternClusterIdx].begin(); it != clusters[patternClusterIdx].end(); it++)
{
patternPoints.push_back(points[*it]);
}
} }
void CirclesGridClusterFinder::findGrid(const std::vector<cv::Point2f> points, cv::Size _patternSize, vector<Point2f>& centers) void CirclesGridClusterFinder::findGrid(const std::vector<cv::Point2f> points, cv::Size _patternSize, vector<Point2f>& centers)

Loading…
Cancel
Save