FindCirclesGrid c ++ 11 не работает, хотя детектор находит все точки - PullRequest
1 голос
/ 31 января 2020

Сетка в

image

не найдена, хотя simpleBlobDetector обнаруживает каждый BLOB-объект.

Я использую следующий код с изображением, являющимся inputimage:

    vector<Point2f> pointBuf;
    Size gridSize(4, 11);

    cv::SimpleBlobDetector::Params params;
    params.maxArea = (image.rows * image.cols) / (gridSize.height * gridSize.width * 1.5);
    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);
    }
    imwrite("./debug/" + "debugImage.png", image);
    imwrite("./debug/" + "debugImage2.png", debugImage);

    findCirclesGrid(image, gridSize, pointBuf, cv::CALIB_CB_ASYMMETRIC_GRID, detector);

Код работает для других изображений. Так почему же код не работает на этом изображении?

1 Ответ

0 голосов
/ 05 февраля 2020

Нет проблем с вашим кодом и работает нормально. Единственная проблема с изображением, которым вы поделились, о параметре фильтра 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;

}

Результат:

enter image description here

Примечание: Вы можете проверить эту документацию , чтобы узнать больше о параметрах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...