一、概述
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()函数进行了详细解释。这是一个有效的函数,可用于校准相机、在线重建等应用。只要按照正确的步骤进行操作,你就可以轻松地找到棋盘格中的内角点。