赞
踩
目录
寻找棋盘格角点(Checkerboard Corners)是计算机视觉中相机标定(Camera Calibration)过程的重要步骤。
OpenCV 提供了函数 cv2.findChessboardCorners 来检测棋盘格图像中的角点,该函数会从图像的左上角开始扫描,以一定的步长(步长由棋盘格的大小和图像分辨率决定)逐行或逐列地寻找具有棋盘格特征的区域。在找到棋盘格特征后,函数会进一步处理这些区域,确定精确的角点位置,并按照从左到右、从上到下的顺序排列这些角点。这些角点用于标定相机内参和畸变系数。
1.图像预处理:
- 将图像转换为灰度图像,因为角点检测在灰度图像上更有效。
- 如果图像有噪声,可以使用滤波器进行平滑处理。
2.角点检测:
- 使用 Harris 角点检测或其他基于梯度的检测方法,找到图像中的所有角点。
- 通过几何约束(如角点之间的固定间距)筛选出棋盘格的角点。
3.亚像素级精度优化:
- 使用 cv2.cornerSubPix 对检测到的角点进行优化,提高角点位置的精度。
- import cv2
- import numpy as np
- import glob
-
- # 定义棋盘格的大小(内角点的个数)
- chessboard_size = (11, 8) # 11x8的棋盘格
-
- # 图像文件路径
- image_files = glob.glob('file_path/*.png') # 替换为实际图像文件路径模式
-
- # 检测并绘制棋盘格角点
- for image_file in image_files:
- # 读取图像
- image = cv2.imread(image_file)
- if image is None:
- print(f"Image at {image_file} not found or failed to read")
- continue
-
- # 将图像转换为灰度图像
- gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
-
- # 寻找棋盘格的角点
- ret, corners = cv2.findChessboardCorners(gray_image, chessboard_size, None)
-
- # 如果找到角点,则绘制它们
- if ret:
- # 优化角点位置
- criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
- corners2 = cv2.cornerSubPix(gray_image, corners, (11, 11), (-1, -1), criteria)
-
- # 绘制角点
- cv2.drawChessboardCorners(image, chessboard_size, corners2, ret)
-
- # 为每个角点添加数字标签
- for i, corner in enumerate(corners2):
- corner = tuple(map(int, corner.ravel())) # 确保corner是一个包含两个整数值的元组
- cv2.putText(image, str(i+1), corner, cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1, cv2.LINE_AA)
- # 显示结果
- cv2.imshow('Chessboard Corners', image)
- # 等待用户按下 ESC 键(ASCII 码 27)关闭窗口
- while True:
- if cv2.waitKey(100) == 27: # 每 0.1 秒检查一次
- break
- # cv2.waitKey(500) # 等待500毫秒,显示下一张图像
- else:
- print(f"Chessboard corners not found in image {image_file}")
-
- cv2.destroyAllWindows()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。