Removed countNonZero call from CirclesGridClusterFinder::hierarchicalClustering
This commit is contained in:
parent
23636433d7
commit
1554d7ab65
@ -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
|
|||||||
}
|
}
|
||||||
|
|
||||||
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
|
|||||||
|
|
||||||
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++)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user