cv::findChessboardCornersSB算子
cv::findChessboardCornersSB
是 OpenCV 中一种基于 基于分割(Segment-Based) 的棋盘格角点检测算法,相比传统的 cv::findChessboardCorners
,它在复杂场景(如高畸变、遮挡、光照不均)下表现更鲁棒。以下是其核心算子和使用方法的详细说明:
bool cv::findChessboardCornersSB(
cv::InputArray image,
cv::Size patternSize,
cv::OutputArray corners,
int flags = 0
);
核心算法特点
参数:
image
:输入图像(8位灰度图或彩色图,彩色图会自动转换为灰度)。patternSize
:棋盘格内角点的行列数(如(9,6)
表示 9列×6行)。corners
:输出的角点坐标(std::vector<cv::Point2f>
)。flags
:控制检测行为的标志(见下文)。
返回值:布尔值,表示是否成功检测到所有角点。
基于分割的检测:
先通过边缘检测和连通区域分析分割棋盘格的黑白方格,再通过几何约束(如平行性、正交性)拟合角点位置,而非依赖传统的角点响应函数。优势:
对图像畸变(如鱼眼镜头)鲁棒性更强。
不需要初始的角点近似位置(传统方法依赖
findChessboardCorners
的初始猜测)。支持非对称棋盘格(通过
CALIB_CB_ASYMMETRIC_GRID
标志)
flags
参数选项-
标志 说明 CALIB_CB_NORMALIZE_IMAGE
预处理时对图像做直方图均衡化。 CALIB_CB_EXHAUSTIVE
启用更耗时的全局优化,提高检测精度。 CALIB_CB_ACCURACY
使用更高精度的角点细化方法(类似 cornerSubPix
的集成)。CALIB_CB_ASYMMETRIC_GRID
检测非对称棋盘格(如 (5,3)
的 ChArUco 板)。CALIB_CB_CLUSTERING
对遮挡或噪声场景使用聚类分析。
cv::findChessboardCorners()算子
功能:自动检测棋盘格角点的初始位置。
参数:
image
:输入图像(需为8位灰度图)。patternSize
:棋盘格内角点的行列数(如(9,6)
表示9列6行)。corners
:输出的角点坐标(std::vector<cv::Point2f>
)。flags
:控制检测方式的标志(见下文)。
返回值:布尔值,表示是否成功检测到所有角点。
cv::cornerSubPix()
功能:对初始角点坐标进行亚像素级精细化。
参数:
image
:输入灰度图。corners
:初始角点(输入输出参数)。winSize
:搜索窗口大小(如(11,11)
)。zeroZone
:忽略的死区大小。criteria
:迭代终止条件(如最大迭代次数/精度)。
检测标志(flags
参数)
通过 cv::findChessboardCorners
的 flags
参数可调整检测策略:
CALIB_CB_ADAPTIVE_THRESH
:使用自适应二值化(推荐)。CALIB_CB_NORMALIZE_IMAGE
:先对图像做直方图均衡化。CALIB_CB_FILTER_QUADS
:过滤错误四边形区域。CALIB_CB_FAST_CHECK
:快速检测(可能漏检,适合实时场景)。