Cv2 findChessboardCorners 找不到角点

Bir*_*der 8 python opencv calibration computer-vision

我正在使用 cv2 findChessBoardCorners 在视觉应用程序中进行相机校准。我对该函数的调用如下所示:

def auto_detect_checkerboard(self, image):
    retval, corners = cv2.findChessboardCorners(image, (7, 7), flags=cv2.CALIB_CB_ADAPTIVE_THRESH
                                                + cv2.CALIB_CB_EXHAUSTIVE)
    if(retval):
        return corners[0][0], corners[0][1]
    else:
        print("No Checkerboard Found")
        assert False
Run Code Online (Sandbox Code Playgroud)

但到目前为止,它似乎无法在我尝试过的所有图像上找到任何角落。我用过的最简单的例子是木桌上棋盘的 960 x 1280 照片

我使用该功能有问题吗?或者我需要在预处理中处理的图像有问题吗?

到目前为止,我已经尝试转换为灰度并应用高斯滤波器,这两种方法似乎都没有产生任何作用。

Ahm*_*vli 9

我解决这个问题的方法是执行颜色分割以获得二进制掩模。接下来,使用二元掩模去除背景,使板可见,从工件中去除。最终准确输出国际象棋边界特征。

    1. 执行颜色分割:我们将加载的图像转换为 HSV 格式,定义下限/上限范围,并使用它执行颜色分割cv2.inRange以获得二进制掩模。
    1. 提取棋盘:获得二进制掩码后,我们将使用它来删除背景并将国际象棋部分与图像的其余部分分开cv2.bitwise_and。算术运算对于定义 HSV 彩色图像中的 ROI 非常有用。
    1. 显示棋盘特征。从图像中提取棋盘后,我们将受源patternSize启发将 设为(7, 7) 并flags设为adaptive_thresh + fast_check + 标准化图像。

脚步:

  • 颜色分割以获得二值掩模。

  • 使用蒙版去除背景

  • 显示棋盘功能

代码:


res = np.uint8(res)
ret, corners = cv2.findChessboardCorners(res, (7, 7),
                                         flags=cv2.CALIB_CB_ADAPTIVE_THRESH +
                                               cv2.CALIB_CB_FAST_CHECK +
                                               cv2.CALIB_CB_NORMALIZE_IMAGE)
if ret:
    print(corners)
    fnl = cv2.drawChessboardCorners(img, (7, 7), corners, ret)
    cv2.imshow("fnl", fnl)
    cv2.waitKey(0)
else:
    print("No Checkerboard Found")
Run Code Online (Sandbox Code Playgroud)

要查找掩模的下边界和上边界,您可能会发现有用:HSV-Threshold-script

  • 这些指令本身并没有帮助我检测任何棋盘角点,但另外将 `cv2.findChessboardCorners(img, (7, 7), flags=...)` 更改为 `cv2.findChessboardCornersSB(img, (7, 7) , flags=cv2.CALIB_CB_EXHAUSTIVE)` 成功了。 (2认同)