From a685be3ea9cd5e1d1a6ee9fcc635960666645bd5 Mon Sep 17 00:00:00 2001
From: Ilya Lysenkov <no@email>
Date: Fri, 6 May 2011 14:02:07 +0000
Subject: [PATCH] Added extra argument for BlobDetector in findCirclesGrid

---
 modules/calib3d/include/opencv2/calib3d/calib3d.hpp |  8 +++++---
 modules/calib3d/src/calibinit.cpp                   | 13 +++----------
 modules/python/src2/opencv_extra_api.hpp            |  8 ++++++++
 3 files changed, 16 insertions(+), 13 deletions(-)

diff --git a/modules/calib3d/include/opencv2/calib3d/calib3d.hpp b/modules/calib3d/include/opencv2/calib3d/calib3d.hpp
index dcd9832d38..da4d5b009c 100644
--- a/modules/calib3d/include/opencv2/calib3d/calib3d.hpp
+++ b/modules/calib3d/include/opencv2/calib3d/calib3d.hpp
@@ -44,6 +44,7 @@
 #define __OPENCV_CALIB3D_HPP__
 
 #include "opencv2/core/core.hpp"
+#include "opencv2/features2d/features2d.hpp"
 
 #ifdef __cplusplus
 extern "C" {
@@ -527,11 +528,12 @@ CV_EXPORTS_W void drawChessboardCorners( InputOutputArray image, Size patternSiz
                                          const InputArray& corners, bool patternWasFound );
 
 enum { CALIB_CB_SYMMETRIC_GRID = 1, CALIB_CB_ASYMMETRIC_GRID = 2,
-       CALIB_CB_CLUSTERING = 4, CALIB_CB_WHITE_CIRCLES = 8 };
+       CALIB_CB_CLUSTERING = 4 };
 
 //! finds circles' grid pattern of the specified size in the image
-CV_EXPORTS_W bool findCirclesGrid( const InputArray& image, Size patternSize,
-                                   OutputArray centers, int flags=CALIB_CB_SYMMETRIC_GRID );
+CV_EXPORTS bool findCirclesGrid( const InputArray& image, Size patternSize,
+                                 OutputArray centers, int flags=CALIB_CB_SYMMETRIC_GRID,
+                                 const Ptr<FeatureDetector> &blobDetector = new SimpleBlobDetector());
 
 enum
 {
diff --git a/modules/calib3d/src/calibinit.cpp b/modules/calib3d/src/calibinit.cpp
index 7200b126b2..ec09afeb96 100644
--- a/modules/calib3d/src/calibinit.cpp
+++ b/modules/calib3d/src/calibinit.cpp
@@ -1927,7 +1927,7 @@ void cv::drawChessboardCorners( InputOutputArray _image, Size patternSize,
 }
 
 bool cv::findCirclesGrid( const InputArray& _image, Size patternSize,
-                          OutputArray _centers, int flags )
+                          OutputArray _centers, int flags, const Ptr<FeatureDetector> &blobDetector )
 {
     bool isAsymmetricGrid = (flags & CALIB_CB_ASYMMETRIC_GRID);
     bool isSymmetricGrid = (flags & CALIB_CB_SYMMETRIC_GRID);
@@ -1935,16 +1935,9 @@ bool cv::findCirclesGrid( const InputArray& _image, Size patternSize,
 
     Mat image = _image.getMat();
     vector<Point2f> centers;
-    SimpleBlobDetector::Params params;
-    if(flags & CALIB_CB_WHITE_CIRCLES)
-    {
-      params.filterByColor = true;
-      params.blobColor = 255;
-    }
-    Ptr<SimpleBlobDetector> detector = new SimpleBlobDetector(params);
-    //Ptr<FeatureDetector> detector = new MserFeatureDetector();
+
     vector<KeyPoint> keypoints;
-    detector->detect(image, keypoints);
+    blobDetector->detect(image, keypoints);
     vector<Point2f> points;
     for (size_t i = 0; i < keypoints.size(); i++)
     {
diff --git a/modules/python/src2/opencv_extra_api.hpp b/modules/python/src2/opencv_extra_api.hpp
index 62f5efc98e..671ae71b3c 100644
--- a/modules/python/src2/opencv_extra_api.hpp
+++ b/modules/python/src2/opencv_extra_api.hpp
@@ -406,6 +406,14 @@ CV_WRAP static inline void convertPointsHomogeneous( const Mat& src, CV_OUT Mat&
     cvConvertPointsHomogeneous(&_src, &_dst);
 }
 
+//! finds circles' grid pattern of the specified size in the image
+CV_WRAP static inline void findCirclesGridDefault( const InputArray& image, Size patternSize,
+                                                   OutputArray centers, int flags=CALIB_CB_SYMMETRIC_GRID )
+{
+    findCirclesGrid(image, patternSize, centers, flags);
+}
+
+
 /*
 //! initializes camera matrix from a few 3D points and the corresponding projections.
 CV_WRAP static inline Mat initCameraMatrix2D( const vector<Mat>& objectPoints,
-- 
2.18.0