From 76860933f0a31c0abd1b26c1f11b25972cda031e Mon Sep 17 00:00:00 2001 From: Danny <33044223+danielenricocahall@users.noreply.github.com> Date: Thu, 8 Apr 2021 06:39:26 -0400 Subject: [PATCH] Merge pull request #19859 from danielenricocahall:fix-blob-detector-single-thresh Fix Single ThresholdBug in Simple Blob Detector * address bug with using min dist between blobs in blob detector cast type in comparison and remove docs address bug with using min dist between blobs in blob detector use scalar instead of int address bug with using min dist between blobs in blob detector * fix namespace and formatting --- modules/features2d/src/blobdetector.cpp | 8 ++++++- modules/features2d/test/test_blobdetector.cpp | 21 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 modules/features2d/test/test_blobdetector.cpp diff --git a/modules/features2d/src/blobdetector.cpp b/modules/features2d/src/blobdetector.cpp index d07e8bae83..c2215cd57c 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 0000000000..56b7145862 --- /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