Python Cv2 findChessboardCorners无法找到角点

Python Cv2 findChessboardCorners无法找到角点,python,opencv,computer-vision,calibration,Python,Opencv,Computer Vision,Calibration,我正在使用cv2 findChessBoardCorners在视觉应用程序中进行摄像机校准。我对函数的调用如下所示: def auto_detect_checkerboard(self, image): retval, corners = cv2.findChessboardCorners(image, (7, 7), flags=cv2.CALIB_CB_ADAPTIVE_THRESH +

我正在使用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
但到目前为止,我用它试过的所有图像似乎都找不到任何角落。我用过的最简单的例子是

我使用这个函数有问题吗?或者我需要在预处理中处理的图像是否存在问题


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

我解决这个问题的方法是执行颜色分割以获得二值遮罩。接下来,使用二进制掩码移除背景,使电路板可见,从工件中移除。最后以精确的方式输出棋盘边界特征

  • 执行颜色分割:我们将加载的图像转换为HSV格式,定义下限/上限范围,并使用来执行颜色分割以获得二进制掩码
  • 提取棋盘:获得二进制掩码后,我们将使用它来移除背景,并使用将棋盘部分与图像的其余部分分离。算术运算,对于定义hsv彩色图像中的roi非常有用
  • 显示棋盘功能。从图像中提取棋盘后,我们将
    patternSize
    设置为(7,7),并将
    标志设置为adaptive_thresh+fast_check+规范化从图像中提取的图像

步骤:

  • 颜色分割得到二值遮罩

  • 使用遮罩移除背景

    • krn=cv2.getStructuringElement(cv2.MORPH_RECT,(50,30))
      dlt=cv2.扩张(msk,krn,迭代次数=5)
      res=255-cv2.按位_和(dlt,msk)
      
  • 显示棋盘特征

    • res=np.uint8(res)
      ret,拐角=cv2。findChessboardCorners(res,(7,7),
      标志=cv2.CALIB\u CB\u自适应\u阈值+
      cv2.CALIB\u CB\u快速检查+
      cv2.CALIB_CB_标准化_图像)
      如果ret:
      印刷品(角落)
      fnl=cv2.图纸棋盘转角(img,(7,7),转角,ret)
      cv2.imshow(“fnl”,fnl)
      cv2.等待键(0)
      其他:
      打印(“未找到棋盘格”)
      
代码:


导入cv2
将numpy作为np导入
#加载图像
img=cv2.imread(“kFM1C.jpg”)
#彩色分割得到二值掩模
lwr=np.数组([0,0143])
upr=np.数组([179,61,252])
hsv=cv2.CVT颜色(img,cv2.COLOR\U BGR2HSV)
msk=cv2.inRange(高速列车、轻轨列车、不间断电源)
#棋盘
krn=cv2.getStructuringElement(cv2.morp_RECT,(50,30))
dlt=cv2.扩张(msk,krn,迭代次数=5)
res=255-cv2.按位_和(dlt,msk)
#显示棋盘特征
res=np.uint8(res)
ret,拐角=cv2。findChessboardCorners(res,(7,7),
标志=cv2.CALIB\u CB\u自适应\u阈值+
cv2.CALIB\u CB\u快速检查+
cv2.CALIB_CB_标准化_图像)
如果ret:
印刷品(角落)
fnl=cv2.图纸棋盘转角(img,(7,7),转角,ret)
cv2.imshow(“fnl”,fnl)
cv2.等待键(0)
其他:
打印(“未找到棋盘格”)

要查找遮罩的上下边界,您可能会发现有用的:

当您尝试使用
cv.findChessboardCorners(image,(7,7),None)
?另外,当您使用3,6或6,7更改(7,7)时,结果仍然不变?请尝试使用
返回角点[0][0],角点[1][0]
<代码>转角[0][1]
给我一个错误。但是代码可以检测49个角。问题可能出在您没有发布的代码中。@YunusTemurlenk我在没有附加标志的情况下尝试过,这也没什么不同,在寻找较小的棋盘时会更成功,但实际上我的应用程序要求我能够检测到整个问题。@Rotem您是对的,我在访问角点时出错,但这似乎不是问题的全部。由于没有检测到电路板,它仍然经常根本没有命中代码块。
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)