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);
完整示例
以下是一个完整示例,展示如何使用 SimpleBlobDetector
与 findCirclesGrid
结合:
#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
提供了多种参数设置,可以根据实际需求调整,以提高检测的精度和灵活性。
分类:
相机标定
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂