OpenCV(cv2)Python findChessboardCorners在看似简单的棋盘上失败

Com*_*ist 2 python opencv

我有以下从相机拍摄的棋盘图像:

left_image

这是我的最小工作示例代码:

import cv2
print(cv2.__version__)
left_gray = cv2.imread('left_raw.jpg', cv2.CV_LOAD_IMAGE_GRAYSCALE)
print(left_gray.shape)
ret, left_corners  = cv2.findChessboardCorners(left_gray, (6,5))
print(left_corners)
Run Code Online (Sandbox Code Playgroud)

这是输出,指示未找到角点:

2.4.13.1
(1080, 1920)
None
Run Code Online (Sandbox Code Playgroud)

我阅读了其他一些StackOverflow问题:

  1. 这个问题是关于opencv2在“看似简单的场景”中失败的,但是我相信我拥有的图像要简单得多,因为该图像具有完全裁剪的棋盘版本。就我而言,我有一个棋chess,放在一些白色打印机纸上。
  2. 这个问题是关于高分辨率图像的故障。我不确定我使用的相机是否是高分辨率的,但我的图像与该问题有所不同,因为这里的棋盘(大致)居中且没有完全歪斜。
  3. 这个问题是关于“完美”棋盘的故障。但是,那是对称的,而我的图像却不是对称的(它有6行7列),我在棋盘上使用(5,6)的输入。我也尝试过(6,5)以防我倒退但没有运气。
  4. 这个问题是关于有人弄错了尺寸。用户声称,如果我们有(10,7)板,则该函数的输入应为(9,7),其中10 =列数,7 =原始板上的行数。但是,我认为我们必须从两个维度中减去一个。无论如何,我都尝试对图像使用(7,5)和其他一些变体,但是没有一种情况有效。
  5. 这个问题是关于MATLAB的,但是代码与Python并没有太大区别,即使在比我复杂得多的情况下,该用户也能成功检测到图像。

在这一点上,我对如何找到角点有些迷茫。有没有人想分享一些建议?图像和代码就在这里,以备您测试。我还应该指出,在拍摄图像时我尝试增加原始相机的亮度,但是没有运气。

Jer*_*uke 5

使用,我可以获得满意的结果cv2.goodFeaturesToTrack()

码:

corners = cv2.goodFeaturesToTrack(gray_img,25,0.01,10)
corners = np.int0(corners)

for i in corners:
    x,y = i.ravel()
    cv2.circle(img,(x,y),3,(0,0,255),-1)

cv2.imshow('Corners',img)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我知道它不准确,但是通过一些预处理,您应该可以获得更好的结果。

:D