diff --git a/modules/calib3d/include/opencv2/calib3d.hpp b/modules/calib3d/include/opencv2/calib3d.hpp index 5a0e020d31..ae2c7b0a1c 100644 --- a/modules/calib3d/include/opencv2/calib3d.hpp +++ b/modules/calib3d/include/opencv2/calib3d.hpp @@ -714,6 +714,30 @@ found, or as colored corners connected with lines if the board was found. CV_EXPORTS_W void drawChessboardCorners( InputOutputArray image, Size patternSize, InputArray corners, bool patternWasFound ); +struct CV_EXPORTS_W_SIMPLE CirclesGridFinderParameters +{ + CV_WRAP CirclesGridFinderParameters(); + CV_PROP_RW cv::Size2f densityNeighborhoodSize; + CV_PROP_RW float minDensity; + CV_PROP_RW int kmeansAttempts; + CV_PROP_RW int minDistanceToAddKeypoint; + CV_PROP_RW int keypointScale; + CV_PROP_RW float minGraphConfidence; + CV_PROP_RW float vertexGain; + CV_PROP_RW float vertexPenalty; + CV_PROP_RW float existingVertexGain; + CV_PROP_RW float edgeGain; + CV_PROP_RW float edgePenalty; + CV_PROP_RW float convexHullFactor; + CV_PROP_RW float minRNGEdgeSwitchDist; + + enum GridType + { + SYMMETRIC_GRID, ASYMMETRIC_GRID + }; + GridType gridType; +}; + /** @brief Finds centers in the grid of circles. @param image grid view of input circles; it must be an 8-bit grayscale or color image. @@ -726,6 +750,7 @@ CV_EXPORTS_W void drawChessboardCorners( InputOutputArray image, Size patternSiz - **CALIB_CB_CLUSTERING** uses a special algorithm for grid detection. It is more robust to perspective distortions but much more sensitive to background clutter. @param blobDetector feature detector that finds blobs like dark circles on light background. +@param parameters struct for finding circles in a grid pattern. The function attempts to determine whether the input image contains a grid of circles. If it is, the function locates centers of the circles. The function returns a non-zero value if all of the centers @@ -745,6 +770,12 @@ Sample usage of detecting and drawing the centers of circles: : @note The function requires white space (like a square-thick border, the wider the better) around the board to make the detection more robust in various environments. */ +CV_EXPORTS_W bool findCirclesGrid( InputArray image, Size patternSize, + OutputArray centers, int flags, + const Ptr &blobDetector, + CirclesGridFinderParameters parameters); + +/** @overload */ CV_EXPORTS_W bool findCirclesGrid( InputArray image, Size patternSize, OutputArray centers, int flags = CALIB_CB_SYMMETRIC_GRID, const Ptr &blobDetector = SimpleBlobDetector::create()); diff --git a/modules/calib3d/src/calibinit.cpp b/modules/calib3d/src/calibinit.cpp index 2e9f07a274..d66be74128 100644 --- a/modules/calib3d/src/calibinit.cpp +++ b/modules/calib3d/src/calibinit.cpp @@ -2093,7 +2093,8 @@ void cv::drawChessboardCorners( InputOutputArray _image, Size patternSize, } bool cv::findCirclesGrid( InputArray _image, Size patternSize, - OutputArray _centers, int flags, const Ptr &blobDetector ) + OutputArray _centers, int flags, const Ptr &blobDetector, + CirclesGridFinderParameters parameters) { CV_INSTRUMENT_REGION() @@ -2120,13 +2121,6 @@ bool cv::findCirclesGrid( InputArray _image, Size patternSize, return !centers.empty(); } - CirclesGridFinderParameters parameters; - parameters.vertexPenalty = -0.6f; - parameters.vertexGain = 1; - parameters.existingVertexGain = 10000; - parameters.edgeGain = 1; - parameters.edgePenalty = -0.6f; - if(flags & CALIB_CB_ASYMMETRIC_GRID) parameters.gridType = CirclesGridFinderParameters::ASYMMETRIC_GRID; if(flags & CALIB_CB_SYMMETRIC_GRID) @@ -2192,4 +2186,10 @@ bool cv::findCirclesGrid( InputArray _image, Size patternSize, return false; } +bool cv::findCirclesGrid( InputArray _image, Size patternSize, + OutputArray _centers, int flags, const Ptr &blobDetector) +{ + return cv::findCirclesGrid(_image, patternSize, _centers, flags, blobDetector, CirclesGridFinderParameters()); +} + /* End of file. */ diff --git a/modules/calib3d/src/circlesgrid.cpp b/modules/calib3d/src/circlesgrid.cpp index 2038e520a4..df85809d41 100644 --- a/modules/calib3d/src/circlesgrid.cpp +++ b/modules/calib3d/src/circlesgrid.cpp @@ -551,11 +551,11 @@ CirclesGridFinderParameters::CirclesGridFinderParameters() keypointScale = 1; minGraphConfidence = 9; - vertexGain = 2; - vertexPenalty = -5; + vertexGain = 1; + vertexPenalty = -0.6f; edgeGain = 1; - edgePenalty = -5; - existingVertexGain = 0; + edgePenalty = -0.6f; + existingVertexGain = 10000; minRNGEdgeSwitchDist = 5.f; gridType = SYMMETRIC_GRID; diff --git a/modules/calib3d/src/circlesgrid.hpp b/modules/calib3d/src/circlesgrid.hpp index fd1389298c..8f55f6c5ef 100644 --- a/modules/calib3d/src/circlesgrid.hpp +++ b/modules/calib3d/src/circlesgrid.hpp @@ -119,35 +119,11 @@ struct Path } }; -struct CirclesGridFinderParameters -{ - CirclesGridFinderParameters(); - cv::Size2f densityNeighborhoodSize; - float minDensity; - int kmeansAttempts; - int minDistanceToAddKeypoint; - int keypointScale; - float minGraphConfidence; - float vertexGain; - float vertexPenalty; - float existingVertexGain; - float edgeGain; - float edgePenalty; - float convexHullFactor; - float minRNGEdgeSwitchDist; - - enum GridType - { - SYMMETRIC_GRID, ASYMMETRIC_GRID - }; - GridType gridType; -}; - class CirclesGridFinder { public: CirclesGridFinder(cv::Size patternSize, const std::vector &testKeypoints, - const CirclesGridFinderParameters ¶meters = CirclesGridFinderParameters()); + const cv::CirclesGridFinderParameters ¶meters = cv::CirclesGridFinderParameters()); bool findHoles(); static cv::Mat rectifyGrid(cv::Size detectedGridSize, const std::vector& centers, const std::vector< cv::Point2f> &keypoint, std::vector &warpedKeypoints); @@ -211,7 +187,7 @@ private: std::vector > *smallHoles; const cv::Size_ patternSize; - CirclesGridFinderParameters parameters; + cv::CirclesGridFinderParameters parameters; CirclesGridFinder& operator=(const CirclesGridFinder&); CirclesGridFinder(const CirclesGridFinder&); diff --git a/modules/java/generator/gen_java.py b/modules/java/generator/gen_java.py index 3c8da0b450..88bfff0ec3 100755 --- a/modules/java/generator/gen_java.py +++ b/modules/java/generator/gen_java.py @@ -14,7 +14,8 @@ class_ignore_list = ( #core "FileNode", "FileStorage", "KDTree", "KeyPoint", "DMatch", #features2d - "SimpleBlobDetector" + "SimpleBlobDetector", + "CirclesGridFinderParameters" ) const_ignore_list = ( diff --git a/modules/python/src2/cv2.cpp b/modules/python/src2/cv2.cpp index cfaf01efc7..9c28c7070f 100644 --- a/modules/python/src2/cv2.cpp +++ b/modules/python/src2/cv2.cpp @@ -798,6 +798,21 @@ PyObject* pyopencv_from(const Size& sz) return Py_BuildValue("(ii)", sz.width, sz.height); } +template<> +bool pyopencv_to(PyObject* obj, Size_& sz, const char* name) +{ + (void)name; + if(!obj || obj == Py_None) + return true; + return PyArg_ParseTuple(obj, "ff", &sz.width, &sz.height) > 0; +} + +template<> +PyObject* pyopencv_from(const Size_& sz) +{ + return Py_BuildValue("(ff)", sz.width, sz.height); +} + template<> bool pyopencv_to(PyObject* obj, Rect& r, const char* name) {