在python中,cv2.findChessboardCorners包含哪些输入参数和输出参数

本文详细介绍了OpenCV函数cv2.findChessboardCorners在检测棋盘格图像角点时的使用方法,包括输入参数如图像、棋盘格尺寸、初始角点估计和标志位的选择,以及如何通过标志位如自适应阈值和图像归一化来优化检测效果。
摘要由CSDN通过智能技术生成

cv2.findChessboardCorners 是 OpenCV 中用于在棋盘格图像中检测角点的函数。其常见的输入参数和输出参数如下:

ret, corners = cv2.findChessboardCorners(image, patternSize, corners, flags)
 

输入参数:

  1. image: 输入的灰度图像,通常是通过将彩色图像转换为灰度图像得到的。
  2. patternSize: 期望的棋盘格内角点的行数和列数,通常为一个二元组 (rows, cols),表示期望在一个 rows x cols 的棋盘格上检测角点。
  3. corners: 这是一个输入参数,用于指定一个初始的角点估计。通常,你可以将其设置为 None,表示没有初始估计,由函数自动检测。如果你有先验的角点估计,你可以将其传递给这个参数。例如:ret, corners = cv2.findChessboardCorners(image, patternSize, None, flags)
  4. flags: 可选参数,用于指定一些标志。常见的标志包括:
    • cv2.CALIB_CB_ADAPTIVE_THRESH: 使用自适应阈值。
    • cv2.CALIB_CB_NORMALIZE_IMAGE: 标定前对图像进行归一化。
    • 其他标志可根据需要添加。

输出参数:

  1. ret: 返回值,表示是否成功找到角点。如果找到了,ret 的值将为 True,否则为 False
  2. 函数输出参数中的 corners这是一个输出参数,用于存储函数检测到的棋盘格角点的坐标。函数执行完毕后,corners 中将包含检测到的角点的坐标信息。

flags 参数是在调用 cv2.findChessboardCorners 函数时用于指定一些标志位的可选参数。这些标志位允许你对角点检测进行一些定制,以适应不同的场景或需求。以下是其中两个常见的标志位:

  1. cv2.CALIB_CB_ADAPTIVE_THRESH

    • 使用自适应阈值。这意味着算法在进行角点检测时会根据图像的局部特性自适应地调整阈值,而不是使用固定的阈值。
  2. cv2.CALIB_CB_NORMALIZE_IMAGE

    • 标定前对图像进行归一化。在标定之前对图像进行归一化可以提高标定的稳定性,因为归一化可以使图像的亮度和对比度更加一致。

你可以根据实际需要组合这些标志,例如:

flags = cv2.CALIB_CB_ADAPTIVE_THRESH | cv2.CALIB_CB_NORMALIZE_IMAGE
ret, corners = cv2.findChessboardCorners(image, patternSize, None, flags)

通过使用这些标志,你可以调整角点检测的行为,以便更好地适应不同图像的特性。如果在实际应用中发现角点检测不准确,可以尝试调整这些标志来获得更好的效果。

  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
获得摄像机内参数矩阵的过程通常称为相机标定。相机标定的目的是确定相机的内部参数和外部参数,以便在三维世界坐标系和二维图像坐标系之间进行转换。 在Python,可以使用OpenCV库进行相机标定。具体步骤如下: 1. 准备标定板:从网上下载一个标定板,并打印出来,在标定板上标出一些特征点(例如,黑白相间的方格)。 2. 拍摄照片:使用相机拍摄多张包含标定板的照片,尽量覆盖不同的角度和位置。 3. 提取角点:使用OpenCV的函数`cv2.findChessboardCorners()`提取标定板上的角点。 4. 对角点进行精确化:使用OpenCV的函数`cv2.cornerSubPix()`对角点进行精确化,提高标定精度。 5. 计算相机内参数矩阵:使用OpenCV的函数`cv2.calibrateCamera()`计算相机内参数矩阵。 计算完成后,可以使用`cv2.getOptimalNewCameraMatrix()`函数得到一个更好的相机内参数矩阵(去除畸变效果)。最终得到的相机内参数矩阵可以用于三维世界坐标系和二维图像坐标系之间的转换。 下面是一个简单的示例代码: ``` import cv2 # 准备标定板 pattern_size = (6, 9) square_size = 1 # 标定板方格大小 obj_points = [] for i in range(pattern_size[0]*pattern_size[1]): obj_points.append((i//pattern_size[0]*square_size, i%pattern_size[0]*square_size, 0)) obj_points = [obj_points] # 由于只有一个标定板,因此只有一个obj_points # 拍摄照片 img_paths = ['img1.jpg', 'img2.jpg', 'img3.jpg'] img_points = [] for img_path in img_paths: img = cv2.imread(img_path) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, corners = cv2.findChessboardCorners(gray, pattern_size, None) if ret: # 对角点进行精确化 corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)) img_points.append(corners2) # 计算相机内参数矩阵 img_size = gray.shape[::-1] ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, img_size, None, None) # 去除畸变效果 newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, img_size, 1, img_size) print('Camera intrinsic matrix:') print(mtx) print('Distortion coefficients:') print(dist) ``` 执行上述代码后,将输出相机内参数矩阵和畸变系数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值