Added checks for incorrect results in the circles grid pattern detection.
authorIlya Lysenkov <no@email>
Fri, 15 Apr 2011 17:24:07 +0000 (17:24 +0000)
committerIlya Lysenkov <no@email>
Fri, 15 Apr 2011 17:24:07 +0000 (17:24 +0000)
modules/calib3d/src/circlesgrid.cpp

index 2ad00b4..40e174b 100644 (file)
@@ -107,6 +107,10 @@ void CirclesGridClusterFinder::hierarchicalClustering(const vector<Point2f> poin
 void CirclesGridClusterFinder::findGrid(const std::vector<cv::Point2f> points, cv::Size patternSize, vector<Point2f>& centers)
 {
   centers.clear();
+  if(points.empty())
+  {
+    return;
+  }
 
   vector<Point2f> patternPoints;
   hierarchicalClustering(points, patternSize, patternPoints);
@@ -117,18 +121,30 @@ void CirclesGridClusterFinder::findGrid(const std::vector<cv::Point2f> points, c
 
   vector<Point2f> hull2f;
   convexHull(Mat(patternPoints), hull2f, false);
+  const size_t cornersCount = 6;
+  if(hull2f.size() < cornersCount)
+    return;
 
   vector<Point2f> corners;
   findCorners(hull2f, corners);
+  if(corners.size() != cornersCount)
+    return;
 
   vector<Point2f> outsideCorners;
   findOutsideCorners(corners, outsideCorners);
+  const size_t outsideCornersCount = 2;
+  if(outsideCorners.size() != outsideCornersCount)
+    return;
 
   vector<Point2f> sortedCorners;
   getSortedCorners(hull2f, corners, outsideCorners, sortedCorners);
+  if(sortedCorners.size() != cornersCount)
+    return;
 
   vector<Point2f> rectifiedPatternPoints;
   rectifyPatternPoints(patternSize, patternPoints, sortedCorners, rectifiedPatternPoints);
+  if(patternPoints.size() != rectifiedPatternPoints.size())
+    return;
 
   parsePatternPoints(patternSize, patternPoints, rectifiedPatternPoints, centers);
 }