OpenCV(cv::findChessboardCorners())



cv::findChessboardCorners() 是 OpenCV 提供的一个函数,常用于计算机视觉中的棋盘图像角点检测,特别是相机标定(calibration)和三维重建相关的任务中。



1. 函数原型

bool cv::findChessboardCorners(
    InputArray image, 
    Size patternSize, 
    OutputArray corners, 
    int flags = 0
);

参数:

  1. image:输入图像,通常是灰度图(单通道)。如果是彩色图像,需要先将其转换为灰度图才能传递给该函数。

  2. patternSize:棋盘的内角点数目,表示为 Size(columns, rows),其中:

    • columns 是棋盘图像中角点的列数(即内部方格数量 - 1)。
    • rows 是棋盘图像中角点的行数(即内部方格数量 - 1)。
  3. corners:检测到的棋盘内角点的亚像素级坐标。该输出参数是一个 OutputArray,其内容是一个 vector<Point2f> 类型的角点坐标列表。

  4. 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. 注意事项

  1. 棋盘的设计findChessboardCorners() 假设棋盘是由交替的黑白方块组成,因此必须保证棋盘图案规则、清晰且光照均匀。
  2. 图像预处理:在某些情况下,可能需要对输入图像进行一些预处理(如平滑、锐化、直方图均衡化)以提高角点检测的精度。
  3. 标定图像质量:对于相机标定任务,输入图像中的棋盘角点越多,拍摄的角度越丰富(不同的视角),标定精度会越高。

通过上述介绍可以看出,cv::findChessboardCorners() 是一个功能强大且重要的函数,特别适用于相机标定和立体视觉中的角点检测。



posted @   做梦当财神  阅读(896)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
历史上的今天:
2021-08-30 Python 子类继承父类构造函数说明
2021-08-30 Python 二分查找
2021-08-30 Python 面向对象
2021-08-30 Python __str__()
点击右上角即可分享
微信分享提示