使用Python和OpenCV时Camera2无法检测棋盘角点求助
棋盘角点检测异常问题
检测代码实现
def find_corners(images, camera_name): imgpoints = [] for idx, img in enumerate(images): criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 0.001) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 查找棋盘角点 ret, corners = cv2.findChessboardCorners(gray, grid_size, cv2.CALIB_CB_ADAPTIVE_THRESH + cv2.CALIB_CB_FAST_CHECK + cv2.CALIB_CB_NORMALIZE_IMAGE) if ret: objpoints.append(objp) # 亚像素级精度细化角点位置 corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria) imgpoints.append(corners2) # 绘制并显示角点 cv2.drawChessboardCorners(img, grid_size, corners2, ret) cv2.imshow(f'{camera_name} Image {idx + 1}', img) # 等待按键切换到下一张图像 print(f"正在显示 {camera_name} 第 {idx + 1} 张图像。按任意键继续...") cv2.waitKey(0) # 等待按键输入 cv2.destroyAllWindows() else: print(f"{camera_name} 第 {idx + 1} 张图像未检测到棋盘") return imgpoints
棋盘参数设置
grid_size = (14, 14) # 棋盘内角点尺寸
问题详情
- 两台相机中,Camera3可正常检测到棋盘角点,但Camera2始终无法检测
- 两张检测图像均由Solidworks生成,仅视角存在差异
- 重新渲染保存图像后问题依旧,检测顺序不影响结果
示例图像
可正常检测的图像

无法检测的图像

排查建议
- 调整角点检测参数:移除
cv2.CALIB_CB_FAST_CHECK参数,该参数会快速跳过疑似无棋盘的图像,可能误判视角特殊的图像;同时可尝试替换自适应阈值方法为cv2.CALIB_CB_ADAPTIVE_THRESH_GAUSSIAN_C - 预处理图像:对无法检测的图像做对比度增强(如
cv2.equalizeHist(gray))或高斯模糊(cv2.GaussianBlur(gray, (3,3), 0)),减少细节干扰 - 验证grid_size准确性:确认无法检测的图像中棋盘内角点数量确实为(14,14),视角倾斜可能导致视觉上的行/列数判断误差
- 调整亚像素参数:若初步检测成功但亚像素细化失败,可尝试缩小
cornerSubPix的搜索窗口(如(5,5))或放宽终止条件
内容的提问来源于stack exchange,提问作者Eric Snyder
相关产品推荐
相关产品推荐

