目录
cv::findChessboardCorners()
是 OpenCV 提供的一个函数,常用于计算机视觉中的棋盘图像角点检测,特别是相机标定(calibration)和三维重建相关的任务中。
1. 函数原型
bool cv::findChessboardCorners(
InputArray image,
Size patternSize,
OutputArray corners,
int flags = 0
);
参数:
-
image
:输入图像,通常是灰度图(单通道)。如果是彩色图像,需要先将其转换为灰度图才能传递给该函数。 -
patternSize
:棋盘的内角点数目,表示为Size(columns, rows)
,其中:columns
是棋盘图像中角点的列数(即内部方格数量 - 1)。rows
是棋盘图像中角点的行数(即内部方格数量 - 1)。
-
corners
:检测到的棋盘内角点的亚像素级坐标。该输出参数是一个OutputArray
,其内容是一个vector<Point2f>
类型的角点坐标列表。 -
flags
(可选):用于调整检测过程的附加参数(标志位)。一些可选的标志如下:cv::CALIB_CB_ADAPTIVE_THRESH
:自适应阈值化。cv::CALIB_CB_NORMALIZE_IMAGE
:归一化图像亮度,通常和ADAPTIVE_THRESH
一起使用。cv::CALIB_CB_FILTER_QUADS
:筛选出只有四个顶点的四边形。cv::CALIB_CB_FAST_CHECK
:快速检查模式,不做角点精确检测,用于减少计算时间。适合用于初步筛选。
返回值:
- 返回值为
bool
类型。如果成功检测到角点,返回true
;否则返回false
。这个值表明函数是否成功找到了指定数量的棋盘角点。
2. 使用场景
cv::findChessboardCorners()
主要用于:
- 相机标定:检测棋盘的角点,用于后续标定过程中计算相机的内参、外参和畸变系数。
- 立体视觉中的校正:在左右两个摄像头图像中找到匹配的棋盘角点,进行立体校正。
- 3D 重建:通过多视角的角点信息,推断棋盘相对于相机的 3D 位姿。
3. 工作原理
cv::findChessboardCorners()
使用图像处理和模式识别的方法来检测棋盘图像中的角点。这些角点是棋盘中黑白格子交界的内角点,因此角点的数量是基于指定的 patternSize
,即棋盘中内部的格子数。
4. 示例
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
Mat image = imread("chessboard.jpg", IMREAD_GRAYSCALE);
Size patternSize(7, 7); // 假设棋盘有 7x7 个内角点
std::vector<Point2f> corners;
bool found = findChessboardCorners(image, patternSize, corners, CALIB_CB_ADAPTIVE_THRESH | CALIB_CB_NORMALIZE_IMAGE);
if (found) {
// 角点精细化
cornerSubPix(image, corners, Size(11, 11), Size(-1, -1), TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 30, 0.1));
// 绘制检测到的角点
drawChessboardCorners(image, patternSize, Mat(corners), found);
imshow("Corners", image);
waitKey(0);
}
return 0;
}
在这个示例中,程序加载棋盘图像并调用 findChessboardCorners()
查找 7x7 个内角点,然后绘制这些角点。还调用了 cornerSubPix()
进行角点的亚像素级精度优化。
4.1 角点精细化
角点检测完成后,通常会对角点位置进行精细化(sub-pixel refinement),这可以进一步提高角点位置的准确性。cornerSubPix()
函数用于这个目的,它基于图像的灰度级别对角点进行二次调整,提供亚像素级的精度。
4.2 附加标志
CALIB_CB_ADAPTIVE_THRESH
:自适应阈值化可以更好地处理光照不均匀的情况,特别是在高对比度条件下。CALIB_CB_NORMALIZE_IMAGE
:归一化图像亮度可以消除光照差异的影响,通常和自适应阈值化结合使用。
5. 注意事项
- 棋盘的设计:
findChessboardCorners()
假设棋盘是由交替的黑白方块组成,因此必须保证棋盘图案规则、清晰且光照均匀。 - 图像预处理:在某些情况下,可能需要对输入图像进行一些预处理(如平滑、锐化、直方图均衡化)以提高角点检测的精度。
- 标定图像质量:对于相机标定任务,输入图像中的棋盘角点越多,拍摄的角度越丰富(不同的视角),标定精度会越高。
通过上述介绍可以看出,cv::findChessboardCorners()
是一个功能强大且重要的函数,特别适用于相机标定和立体视觉中的角点检测。
标签:CB,角点,OpenCV,图像,棋盘,findChessboardCorners,cv From: https://www.cnblogs.com/keye/p/18387904