首页 > 其他分享 >OpenCV(cv::findChessboardCorners())

OpenCV(cv::findChessboardCorners())

时间:2024-08-30 08:54:26浏览次数:10  
标签:CB 角点 OpenCV 图像 棋盘 findChessboardCorners cv

目录



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() 是一个功能强大且重要的函数,特别适用于相机标定和立体视觉中的角点检测。



标签:CB,角点,OpenCV,图像,棋盘,findChessboardCorners,cv
From: https://www.cnblogs.com/keye/p/18387904

相关文章

  • 【Datawhale AI 夏令营2024--CV】Task2 阅读小结与尝试
    一、阅读小结        yolo不仅要识别物体的种类还要识别物体的位置1.1、物体检测介绍:1.输入:照片可以利用opencv来提取照片的每一帧,在循环下对视频中每一帧的照片进行处理cap=cv2.VideoCapture(video_path)whileTrue:ret,frame=cap.read()......
  • Datawhale AI 夏令营 第五期 CV方向 02进阶
    上次的baseline方案,训练的模型,获得分数并不高,DataWhale提供了两个上分的思路增加训练数据集切换不同模型预训练权重增加训练集的大小通常可以提高模型的泛化能力,因为更多的数据可以帮助模型学习到更多的特征和模式。但是,越大的数据集,就意味着需要更多的计算资源和时间来训......
  • Versal Prime 系列 VM2202 自适应 SoC平台,XCVM2202-1LSINSVH1369、XCVM2202-1MLINSVH1
    VersalPrime系列是一款高度集成、多核、异构计算平台,适用于数据中心网络、存储和有线通信等多种应用。它通过在优化了连接性的设备中实现低延迟的内联加速,为这些应用提供突破性的性能。VersalPrime系列VM2202自适应SoC相关型号:XCVM2202-1LSINSVH1369XCVM2202-2LSENSVH13......
  • Datawhale AI 夏令营-CV 方向-Task 2
    一、baseline上分思路1.数据集划分1.1原划分代码pyimportosimportcv2importpandasaspdimportglobdefsetup_directories():base_dir="yolo-dataset"subdirs=["train","val"]forsubdirinsubdirs:dir_path=os.pa......
  • OpenCV(cv::normalize())
    目录1.函数原型:2.使用场景:3.示例:cv::normalize()是OpenCV中用于将数据值缩放到指定范围或对数据进行归一化处理。1.函数原型:voidcv::normalize(InputArraysrc,OutputArraydst,doublealpha=1,doublebeta=0,intnorm_type=NORM_L2,intdtype=-1,I......
  • ECCV24|全局式SfM最新SOTA,GLOMAP重新定义SfM!
    前言 ETH&微软最新开源-全局式GLOMAP,它与以前的全局SfM系统相比,其核心区别在于全局定位步骤。不是先执行不适定的平移平均然后进行全局三角测量,而是进行联合相机和点位置估计。GLOMAP不仅在鲁棒性和准确性方面达到增量式COLMAP系统相当或更优的水平,同时还比COLMAP快几个数量级。......
  • OpenCV(cv::dft())
    目录1.函数定义2.示例3.使用场景4.注意事项5.总结cv::dft()是OpenCV中用于计算离散傅里叶变换(DFT)的函数。傅里叶变换是一种重要的数学工具,用于将信号从时域转换到频域。这在图像处理和信号处理领域非常有用,例如滤波、卷积、图像频率分析等。1.函数定义voidcv::......
  • OpenCV(cv::mulSpectrums())
    目录1.函数定义2.工作原理3.示例4.典型应用5.总结cv::mulSpectrums()是OpenCV中用于频域信号处理的一个函数,它可以将两个频域的傅里叶变换结果相乘。通常用于频域滤波、卷积、相关性计算等任务。1.函数定义voidcv::mulSpectrums(InputArraya,InputArrayb,Out......
  • OpenCV(cv::idft())
    目录1.函数2.示例3.应用场景4.注意事项5.总结cv::idft()是OpenCV中用于计算逆离散傅里叶变换(IDFT)的函数,它将频域的数据转换回时域。它常与cv::dft()配合使用,例如在进行频域滤波后,需要使用cv::idft()将处理后的数据转换回图像的空间域。1.函数voidcv::idft(......
  • OpenSSH 存在输入验证错误漏洞(CVE-2019-16905) 解决
    1、下载文件:zlib-1.2.11.tar.gzopenssh-8.3p1.tar.gzopenssl-1.1.1g.tar.gz 2、解压升级包tar--no-same-owner-zxvfzlib-1.2.11.tar.gztar--no-same-owner-zxvfopenssh-8.3p1.tar.gztar--no-same-owner-zxvfopenssl-1.1.1g.tar.gz 3、编译安装zlibcdzli......