您的位置:

CV2.findChessboardCorners的详细讲解

一、概述

cv2.findChessboardCorners()函数是OpenCV中的一个函数,用于找到棋盘格的所有内角点,返回所有检测到的内角点的2D坐标。通常用于摄像机校准和3D重建。

二、使用方法

1.函数定义

cv2.findChessboardCorners(image, patternSize[, corners[, flags]])
  • image:输入的单通道8位或32位浮点数图像。
  • patternSize:内角点的规模(x方向内角点数,y方向内角点数)。
  • corners:如果opencv能够找到内角点,则返回内角点坐标数组。
  • flags:用于指示应用哪些变换。通常使用DEFAULTS,这意味着使用适当的变换来提高查找结果的抗噪性。

2.示例代码

import cv2
import numpy as np

img = cv2.imread('chessboard.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# 确定棋盘格内部角点的数量
patternSize = (9,6)

# 在图像中寻找棋盘格角点
ret, corners = cv2.findChessboardCorners(gray, patternSize)

# 如果找到了角点则绘制它们
if ret == True:
    corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),(cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER,30,0.001))
    img = cv2.drawChessboardCorners(img, patternSize, corners2,ret)
    cv2.imshow('img',img)
    cv2.waitKey(0)

cv2.destroyAllWindows()

三、函数详解

1.获取棋盘格

在使用cv2.findChessboardCorners()函数之前,需要先获取输入图像中的棋盘格标准图像。具体步骤如下:

import cv2
import numpy as np

img = cv2.imread('chessboard.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
patternSize=(9,6)

# 使用findChessboardCorners()函数来找到内部角落
ret, corners = cv2.findChessboardCorners(gray, patternSize)

if ret == True:
    corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),(cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER,30,0.001))
    img = cv2.drawChessboardCorners(img, patternSize, corners2,ret)
    cv2.imshow('img',img)
    cv2.waitKey(0)

cv2.destroyAllWindows()

上述代码使用cv2.findChessboardCorners()函数查找棋盘格的内角点,并将其绘制在输入图像上。注意:在绘制之前,使用cv2.cornerSubPix()函数对内角点进行了修正,以提高精度。

2.寻找内角点

cv2.findChessboardCorners()函数的第一个参数是输入图像,第二个参数是棋盘格内部角点的数量。返回值是一个布尔值和一个坐标数组。

如果cv2.findChessboardCorners()能够找到所有的内部角点,则返回的布尔值为True,角点坐标存储在corners数组中。否则返回False。

例如,在我们的示例中,棋盘格有9个内角点是横向的,6个内角点是纵向的。

# 确定棋盘格内部角点的数量
patternSize = (9,6)

# 在图像中寻找棋盘格角点
ret, corners = cv2.findChessboardCorners(gray, patternSize)

3.细化检测结果

为了提高检测结果的精度,通常需要对cv2.findChessboardCorners()返回的角点坐标进行细化。可以使用cv2.cornerSubPix()函数进行修正,修正后的坐标存储在corners2数组中。以下是代码示例:

corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),(cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER,30,0.001))

其中,cv2.cornerSubPix()函数包含以下参数:

  • image:输入图像
  • corners:输入的角点
  • windownSize:搜索窗口大小
  • zeroZone:死区;在窗口中心和窗口边缘之间,要排除的区域。
  • criteria:找到每个角点的最大迭代次数和迭代停止条件的精度。这是一个元组,具有以下格式:(type, max_iter, epsilon),其中type是终止的类型(cv2.TERM_CRITERIA_EPS或cv2.TERM_CRITERIA_MAX_ITER)。

4.绘制棋盘格内角点

一旦所有内角点被找到并细化了,便可以使用cv2.drawChessboardCorners()函数将它们绘制在输入图像上。

img = cv2.drawChessboardCorners(img, patternSize, corners2,ret)
cv2.imshow('img',img)
cv2.waitKey(0)

四、注意事项

使用cv2.findChessboardCorners()函数时,请注意以下几点:

  • 人工制作的棋盘格必须保持完美的水平/垂直状态。
  • 找到的角点必须按照预期的方式排序
  • 如果内部角点不能被精确地识别,那么结果将不准确

五、总结

本文对OpenCV中的cv2.findChessboardCorners()函数进行了详细解释。这是一个有效的函数,可用于校准相机、在线重建等应用。只要按照正确的步骤进行操作,你就可以轻松地找到棋盘格中的内角点。