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<Center> > 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)
{
--- /dev/null
+// 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<KeyPoint> keypoints;
+
+ Ptr<SimpleBlobDetector> detector = SimpleBlobDetector::create(params);
+ detector->detect(image, keypoints);
+ ASSERT_NE((int) keypoints.size(), 0);
+}
+}} // namespace