diff --git a/modules/features2d/src/blobdetector.cpp b/modules/features2d/src/blobdetector.cpp index d07e8bae83c6aee44cca9cd45e165a0f9e4eb031..c2215cd57c702658481a286856a13e54dc59bec7 100644 --- a/modules/features2d/src/blobdetector.cpp +++ b/modules/features2d/src/blobdetector.cpp @@ -325,13 +325,19 @@ void SimpleBlobDetectorImpl::detect(InputArray image, std::vector& std::vector < Center > curCenters; findBlobs(grayscaleImage, binarizedImage, curCenters); + if(params.maxThreshold - params.minThreshold <= params.thresholdStep) { + // if the difference between min and max threshold is less than the threshold step + // we're only going to enter the loop once, so we need to add curCenters + // to ensure we still use minDistBetweenBlobs + centers.push_back(curCenters); + } std::vector < std::vector
> newCenters; for (size_t i = 0; i < curCenters.size(); i++) { bool isNew = true; for (size_t j = 0; j < centers.size(); j++) { - double dist = norm(centers[j][ centers[j].size() / 2 ].location - curCenters[i].location); + double dist = norm(centers[j][centers[j].size() / 2 ].location - curCenters[i].location); isNew = dist >= params.minDistBetweenBlobs && dist >= centers[j][ centers[j].size() / 2 ].radius && dist >= curCenters[i].radius; if (!isNew) { diff --git a/modules/features2d/test/test_blobdetector.cpp b/modules/features2d/test/test_blobdetector.cpp new file mode 100644 index 0000000000000000000000000000000000000000..56b7145862052cfe6319f5672d6818d93607afcc --- /dev/null +++ b/modules/features2d/test/test_blobdetector.cpp @@ -0,0 +1,21 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#include "test_precomp.hpp" + +namespace opencv_test { namespace { +TEST(Features2d_BlobDetector, bug_6667) +{ + cv::Mat image = cv::Mat(cv::Size(100, 100), CV_8UC1, cv::Scalar(255, 255, 255)); + cv::circle(image, Point(50, 50), 20, cv::Scalar(0), -1); + SimpleBlobDetector::Params params; + params.minThreshold = 250; + params.maxThreshold = 260; + std::vector keypoints; + + Ptr detector = SimpleBlobDetector::create(params); + detector->detect(image, keypoints); + ASSERT_NE((int) keypoints.size(), 0); +} +}} // namespace