You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用OpenCV的findChessboardCorners无法检测红外图像棋盘角点

问题描述

我使用分辨率为640x480的红外相机拍摄棋盘图像,无法通过cv2.findChessboardCorners函数检测棋盘角点。想请教:我的图像对比度是否足够?另外因条件限制无法使用更大尺寸的棋盘,问题可能出在哪里?

附上我的代码:

import cv2
import numpy as np
import glob

CHECKERBOARD = (4, 4)
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)

objpoints = []
imgpoints = []

objp = np.zeros((1, CHECKERBOARD[0] * CHECKERBOARD[1], 3), np.float32)
objp[0, :, :2] = np.mgrid[0 : CHECKERBOARD[0], 0 : CHECKERBOARD[1]].T.reshape(-1, 2)
prev_img_shape = None

images = glob.glob("./images2/*.jpg")
for fname in images:
    img = cv2.imread(fname)

    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 寻找棋盘角点
    # 如果找到指定数量的角点,ret为True
    ret, corners = cv2.findChessboardCorners(
        gray,
        CHECKERBOARD,
        cv2.CALIB_CB_ADAPTIVE_THRESH
        + cv2.CALIB_CB_FAST_CHECK
        + cv2.CALIB_CB_NORMALIZE_IMAGE,
    )
    print(ret)
    if ret == True:
        objpoints.append(objp)
        # 细化二维角点的像素坐标
        corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
        imgpoints.append(corners2)

        # 绘制并显示角点
        img = cv2.drawChessboardCorners(img, CHECKERBOARD, corners2, ret)

    cv2.imshow("img", gray)
    cv2.waitKey(0)

附拍摄的红外棋盘图像:
红外棋盘图像


问题分析与解决建议

1. 对比度确实不足

从你提供的红外图像来看,棋盘格子间的灰度(温差)差异非常小,边缘模糊不清,这直接导致角点特征无法被算法识别。红外成像依赖温差,你的棋盘黑白格在红外下的温差不足以形成清晰的边界,这是检测失败的核心原因。

2. 检测参数与预处理需调整

(1)修改检测标志位

当前代码里的CALIB_CB_FAST_CHECK会快速跳过特征不明显的图像,直接放弃了你的低对比度红外图,建议去掉这个标志,换成CALIB_CB_FILTER_QUADS,过滤掉不符合四边形特征的候选点,优化检测逻辑:

ret, corners = cv2.findChessboardCorners(
    gray,
    CHECKERBOARD,
    cv2.CALIB_CB_ADAPTIVE_THRESH
    + cv2.CALIB_CB_NORMALIZE_IMAGE
    + cv2.CALIB_CB_FILTER_QUADS,  # 替换原有的FAST_CHECK
)

(2)增强图像对比度

转灰度后先做预处理,强化格子间的差异:

  • 用自适应直方图均衡(CLAHE)效果比普通均衡更好,适合红外这种局部对比度低的图像:
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
gray = clahe.apply(gray)

3. 棋盘与算法细节优化

  • 角点细化窗口缩小:cornerSubPix的(11,11)窗口对于640x480分辨率的小棋盘来说太大,改成(5,5)更贴合角点尺寸:
corners2 = cv2.cornerSubPix(gray, corners, (5,5), (-1, -1), criteria)
  • 棋盘摆放尽量正:避免大角度倾斜,红外相机的畸变可能更明显,倾斜会进一步弱化原本就不清晰的角点特征;
  • 多拍不同场景:虽然棋盘尺寸不能变大,但多拍几张不同角度、不同环境温度下的图像,提升检测到有效角点的概率。

内容的提问来源于stack exchange,提问作者thangmechanical

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 08:19:52