opencv中findCirclesGrid在标定时使用,blobDetector 参数怎么定义?

在 OpenCV 中,findCirclesGrid 是一个用于检测图像中的圆形格点(通常用于相机标定或校正的检测目标)的函数。它可以用于查找在特定模式下排列的圆形图案,如棋盘格或圆形网格。该函数是相机标定和立体视觉的重要工具。

函数原型

bool cv::findCirclesGrid(
    InputArray image,
    Size patternSize,
    std::vector<Point2f>& centers,
    int flags = CALIB_CB_SYMMETRIC_GRID,
    InputArray blobDetector = noArray()
);

参数说明

  • image: 输入图像,通常为灰度图像。
  • patternSize: 目标圆的排列大小,表示图案的行数和列数,例如 Size(4, 11) 表示 4 列 11 行。
  • centers: 输出参数,检测到的圆心坐标将被存储在这个向量中。
  • flags: 可选参数,用于指定检测选项。例如:
    • CALIB_CB_SYMMETRIC_GRID:用于检测对称网格。
    • CALIB_CB_ASYMMETRIC_GRID:用于检测非对称网格。
  • blobDetector: 可选参数,指定自定义的 blob 检测器。

返回值

  • 返回 true 表示成功检测到圆形网格,返回 false 则表示未检测到。

示例代码

以下是一个简单的示例,展示如何使用 findCirclesGrid

#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    // 加载图像
    cv::Mat image = cv::imread("circles_grid.jpg", cv::IMREAD_GRAYSCALE);

    if (image.empty()) {
        std::cerr << "Could not open or find the image!" << std::endl;
        return -1;
    }

    // 定义圆形网格的大小
    cv::Size patternSize(4, 11); // 4 列 11 行

    // 存储检测到的圆心
    std::vector<cv::Point2f> centers;

    // 检测圆形网格
    bool found = cv::findCirclesGrid(image, patternSize, centers, cv::CALIB_CB_SYMMETRIC_GRID);

    if (found) {
        std::cout << "Found circles grid!" << std::endl;
        // 在图像上绘制检测到的圆心
        cv::drawChessboardCorners(image, patternSize, centers, found);
        cv::imshow("Detected Circles Grid", image);
        cv::waitKey(0);
    } else {
        std::cout << "Circles grid not found." << std::endl;
    }

    return 0;
}

注意事项

  • 确保输入图像是清晰的,并且光照条件适宜,以便提高检测的准确性。
  • 调整 patternSize 以匹配实际的圆形格点布局。
  • 可以尝试不同的标志以优化检测结果,具体取决于使用的圆形网格类型。

findCirclesGrid 是进行相机标定和其他计算机视觉任务时非常有用的工具,能够帮助提取图像中的几何信息。

在 OpenCV 中,blobDetector 参数用于在 findCirclesGrid 函数中指定自定义的 blob 检测器。这个参数允许你在检测圆形网格时使用特定的 blob 检测算法,以提高检测的准确性和灵活性。

定义 Blob 检测器

要定义一个自定义的 blob 检测器,通常使用 SimpleBlobDetector。下面是如何创建和配置一个 SimpleBlobDetector 的示例:

1. 导入必要的头文件

#include <opencv2/opencv.hpp>
#include <opencv2/features2d.hpp>
#include <iostream>

2. 配置 Blob 检测器参数

cv::SimpleBlobDetector::Params params;

// 设置阈值
params.minThreshold = 10; // 最小阈值
params.maxThreshold = 200; // 最大阈值

// 设置面积
params.filterByArea = true;
params.minArea = 100; // 最小面积
params.maxArea = 5000; // 最大面积

// 设置圆度
params.filterByCircularity = true;
params.minCircularity = 0.8f;

// 设置凸度
params.filterByConvexity = true;
params.minConvexity = 0.8f;

// 设置 inertia
params.filterByInertia = true;
params.minInertiaRatio = 0.1f;

// 创建检测器
cv::Ptr<cv::SimpleBlobDetector> blobDetector = cv::SimpleBlobDetector::create(params);

3. 在 findCirclesGrid 中使用 Blob 检测器

使用定义好的 blob 检测器作为参数传递给 findCirclesGrid

std::vector<cv::Point2f> centers;
bool found = cv::findCirclesGrid(image, patternSize, centers, cv::CALIB_CB_SYMMETRIC_GRID, blobDetector);

完整示例

以下是一个完整示例,展示如何使用 SimpleBlobDetectorfindCirclesGrid 结合:

#include <opencv2/opencv.hpp>
#include <opencv2/features2d.hpp>
#include <iostream>

int main() {
    // 加载图像
    cv::Mat image = cv::imread("circles_grid.jpg", cv::IMREAD_GRAYSCALE);
    
    if (image.empty()) {
        std::cerr << "Could not open or find the image!" << std::endl;
        return -1;
    }

    // 定义圆形网格的大小
    cv::Size patternSize(4, 11); // 4 列 11 行

    // 配置 Blob 检测器参数
    cv::SimpleBlobDetector::Params params;
    params.minThreshold = 10;
    params.maxThreshold = 200;
    params.filterByArea = true;
    params.minArea = 100;
    params.maxArea = 5000;
    params.filterByCircularity = true;
    params.minCircularity = 0.8f;
    params.filterByConvexity = true;
    params.minConvexity = 0.8f;

    // 创建 Blob 检测器
    cv::Ptr<cv::SimpleBlobDetector> blobDetector = cv::SimpleBlobDetector::create(params);

    // 存储检测到的圆心
    std::vector<cv::Point2f> centers;

    // 检测圆形网格
    bool found = cv::findCirclesGrid(image, patternSize, centers, cv::CALIB_CB_SYMMETRIC_GRID, blobDetector);

    if (found) {
        std::cout << "Found circles grid!" << std::endl;
        // 在图像上绘制检测到的圆心
        cv::drawChessboardCorners(image, patternSize, centers, found);
        cv::imshow("Detected Circles Grid", image);
        cv::waitKey(0);
    } else {
        std::cout << "Circles grid not found." << std::endl;
    }

    return 0;
}

总结

  • blobDetector 参数允许使用自定义的 blob 检测器,增强圆形网格的检测能力。
  • SimpleBlobDetector 提供了多种参数设置,可以根据实际需求调整,以提高检测的精度和灵活性。
posted @   aisuanfa  阅读(102)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
点击右上角即可分享
微信分享提示