Cv2 findChessboardCorners 无法找到角点

问题描述

我在视觉应用程序中使用 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

但到目前为止我尝试过的所有图像似乎都没有找到任何角落。我用过的最简单的例子是

960 x 1280 photograph of a checkerboard on a wooden table

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

到目前为止,我已尝试转换为灰度,并应用高斯滤波器,但两者似乎都没有效果

解决方法

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

    1. 执行颜色分割:我们将加载的图像转换为 HSV 格式,定义下/上范围,并使用 cv2.inRange 执行颜色分割以获得二值掩码。
    1. 提取棋盘:在获得二值掩码后,我们将使用它去除背景,并使用 cv2.bitwise_and 将棋盘与图像的其余部分分开。算术运算,对于在 hsv 彩色图像中定义 roi 非常有用。
    1. 显示棋盘特征。从图像中提取棋盘后,我们将 patternSize 设置为 (7,7) 并将 flags 设置为基于 source 启发的adaptive_thresh + fast_check + normalize 图像。

步骤:

  • 颜色分割以获得二进制掩码。

    • enter image description here

    • lwr = np.array([0,143])
      upr = np.array([179,61,252])
      hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
      msk = cv2.inRange(hsv,lwr,upr)
      
  • 使用遮罩去除背景

    • enter image description here

    • krn = cv2.getStructuringElement(cv2.MORPH_RECT,(50,30))
      dlt = cv2.dilate(msk,krn,iterations=5)
      res = 255 - cv2.bitwise_and(dlt,msk)
      
  • 显示棋盘特征

    • enter image description here

    • 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,corners,ret)
          cv2.imshow("fnl",fnl)
          cv2.waitKey(0)
      else:
          print("No Checkerboard Found")
      

代码:


import cv2
import numpy as np

# Load the image
img = cv2.imread("kFM1C.jpg")

# Color-segmentation to get binary mask
lwr = np.array([0,upr)

# Extract chess-board
krn = cv2.getStructuringElement(cv2.MORPH_RECT,msk)

# Displaying chess-board features
res = np.uint8(res)
ret,fnl)
    cv2.waitKey(0)
else:
    print("No Checkerboard Found")

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