Нет проблем с вашим кодом и работает нормально. Единственная проблема с изображением, которым вы поделились, о параметре фильтра params.maxArea
Это ограничение не позволяет программе обнаруживать ваши сетки. Вот код, который я пробовал, и результат:
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/features2d.hpp>
#include <vector>
#include "opencv2/opencv.hpp"
using namespace cv;
using namespace std;
int main( int argc, char** argv )
{
Mat image = imread("/your/image/directory/blob.jpg");
vector<Point2f> pointBuf;
Size gridSize(4, 11);
cv::SimpleBlobDetector::Params params;
params.maxArea = 10000;
params.minArea = 70;
params.minConvexity = 0.85;
params.minThreshold = 80;
params.maxThreshold = 230;
params.thresholdStep = 20;
params.minInertiaRatio = 0.05;
auto detector = cv::SimpleBlobDetector::create(params);
vector<KeyPoint> keypoints;
detector->detect(image, keypoints);
Mat debugImage = Mat::zeros(image.size(), CV_8U);
for (auto keypoint : keypoints) {
drawKeypoints(debugImage, keypoints, debugImage, 255);
}
findCirclesGrid(image, gridSize, pointBuf, cv::CALIB_CB_ASYMMETRIC_GRID, detector);
imshow("Result",debugImage);
imshow("Before",image);
waitKey(0);
return 0;
}
Результат:
Примечание: Вы можете проверить эту документацию , чтобы узнать больше о параметрах.