【问题标题】:Cv2 findChessboardCorners fails to find cornersCv2 findChessboardCorners 找不到角点
【发布时间】:2021-05-19 08:59:14
【问题描述】:

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

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

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

到目前为止,我已经尝试转换为灰度,并应用了高斯滤镜,但似乎都没有产生任何影响。

【问题讨论】:

  • 当您尝试使用 cv.findChessboardCorners(image, (7,7), None) 时?此外,当您将 (7,7) 更改为 3,6 或 6,7 时,结果仍然没有变化?
  • 尝试使用return corners[0][0], corners[1][0]corners[0][1] 给我一个错误。但是代码检测到 49 个角。问题可能出在您未发布的代码中。
  • @YunusTemurlenk 我已经尝试不使用额外的标志,它没有什么不同,在寻找更小的棋盘格时它更成功,但实际上我的应用程序需要我能够检测到整个事情。
  • @Rotem 你是对的,我访问角落的方式有误,但这似乎不是全部问题。由于没有检测到板子,它仍然经常根本没有碰到那个代码块。

标签: python opencv computer-vision calibration


【解决方案1】:

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

    1. 执行颜色分割:我们将加载的图像转换为 HSV 格式,定义下限/上限范围,并使用cv2.inRange 执行颜色分割以获得二进制掩码。
    1. 提取棋盘:获得二进制掩码后,我们将使用它来移除背景,并使用cv2.bitwise_and 将棋盘部分与图像的其余部分分开。算术运算,对于在 hsv 彩色图像中定义 roi 非常有用。
    1. 显示棋盘特征。从图像中提取棋盘后,我们将 patternSize 设置为 (7, 7) 和 flags 为自适应阈值 + 快速检查 + 归一化图像,灵感来自 source

步骤:

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

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

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

    • 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")
      

代码:


import cv2
import numpy as np

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

# Color-segmentation to get binary mask
lwr = np.array([0, 0, 143])
upr = np.array([179, 61, 252])
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
msk = cv2.inRange(hsv, lwr, upr)

# Extract chess-board
krn = cv2.getStructuringElement(cv2.MORPH_RECT, (50, 30))
dlt = cv2.dilate(msk, krn, iterations=5)
res = 255 - cv2.bitwise_and(dlt, msk)

# Displaying chess-board features
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")

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

【讨论】:

    猜你喜欢
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多