cv2.findChessboardCornersSB无法完整检测棋盘格角点问题求助
棋盘格角点检测异常问题
我有若干棋盘格图片,无论输入何种棋盘格尺寸,cv2.findChessboardCornersSB()或cv2.findChessboardCorners()都无法检测全部角点,仅能检测部分角点或完全检测不到。我通常处理fits格式文件,此次已将其导出为png格式,相关代码如下:
img = cv2.imread(filename, cv2.IMREAD_GRAYSCALE) # 尝试检测棋盘格 chessboard_size = (6, 7) # 也试过(7,6), (6,9), (9,6) flags = cv2.CALIB_CB_EXHAUSTIVE + cv2.CALIB_CB_ACCURACY flags_std = cv2.CALIB_CB_FAST_CHECK + cv2.CALIB_CB_ADAPTIVE_THRESH # flags_std = cv2.CALIB_USE_INTRINSIC_GUESS ret_sb, corners_sb = cv2.findChessboardCornersSB(img, chessboard_size, flags=flags) ret_std, corners_std = cv2.findChessboardCorners(img, chessboard_size, flags=cv2.CALIB_CB_FAST_CHECK | cv2.CALIB_CB_ADAPTIVE_THRESH) # 标准检测方法
排查与解决建议
- 核对棋盘格内角点尺寸:
chessboard_size指的是棋盘格的内角点行列数(不是黑白方块的数量),比如7×8的方块棋盘对应(6,7)的内角点。先确认图片实际内角点数量,同时注意行列顺序是否搞反。 - 图像预处理优化:
- 做直方图均衡化增强对比度:
img = cv2.equalizeHist(img) - 高斯模糊降噪:
img = cv2.GaussianBlur(img, (3,3), 0) - 手动二值化调整:根据图片明暗,尝试
_, img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV),调整阈值和反转参数让黑白边界更清晰。
- 做直方图均衡化增强对比度:
- 调整检测标志位:
- 对标准检测方法,移除
CALIB_CB_FAST_CHECK(该标志会快速跳过疑似无棋盘格的图像,可能误判),保留CALIB_CB_ADAPTIVE_THRESH并添加CALIB_CB_NORMALIZE_IMAGE做图像归一化。 - 对
findChessboardCornersSB(),可单独使用CALIB_CB_EXHAUSTIVE,避免同时叠加多个高消耗标志导致冲突,也可搭配CALIB_CB_NORMALIZE_IMAGE。
- 对标准检测方法,移除
- 检查图像导出质量:确认从fits转png的过程中没有出现对比度丢失、压缩失真或颜色映射错误。用图像查看器检查棋盘格的黑白块边界是否清晰,有无过曝、欠曝或模糊区域。
- 分区域检测尝试:如果棋盘格存在局部遮挡或模糊,先裁剪出完整的棋盘格区域再检测;也可先用
cv2.cornerHarris()检测角点,再筛选匹配棋盘格的排列模式。
内容的提问来源于stack exchange,提问作者Falco Peregrinus
相关产品推荐
相关产品推荐

