【发布时间】:2017-02-08 17:34:01
【问题描述】:
我有以下从相机拍摄的棋盘图像:
这是我的最小工作示例代码:
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)
这是输出,表明没有找到角点:
2.4.13.1
(1080, 1920)
None
我阅读了其他几个 StackOverflow 问题:
- This question 是关于 opencv2 在“看似简单的场景”中失败,但我相信我拥有的图像要简单得多,因为这个图像具有完全裁剪的棋盘版本。就我而言,我有一个棋盘,放在一些白色的打印纸上。
- This question 是关于高分辨率图像的失败。我不确定我使用的相机是否是高分辨率的,但我的图像与那个问题不同,因为这里的棋盘(大致)居中并且没有完全倾斜。
- This question 是关于“完美”棋盘上的失败。但是,那个是对称的,而我的图像不是对称的(它有 6 行和 7 列),我将 (5,6) 的输入用于我的棋盘。我还尝试了 (6,5),以防万一我倒退了,但没有运气。
- This question 是关于有人把尺寸弄错了。用户声称如果我们有一个 (10,7) 板,函数的输入应该是 (9,7) 其中 10 = 列数,7 = 原始板中的行数。但是,我认为我们必须从 both 维度中减去一个。在任何情况下,我都尝试使用 (7,5) 和其他一些变体来制作我的图像,但没有一种情况有效。
- This question 是关于 MATLAB 的,但代码与 Python 应该没有太大的不同,并且该用户在检测图像方面取得了一些成功,即使是在比我所拥有的复杂得多的情况下。
在这一点上,我对如何找到角落有点迷茫。有没有人想分享一些建议?如果您想测试它们,图像和代码就在这里。我还应该指出,我在拍摄图像时尝试增加原始相机的亮度但没有运气。
【问题讨论】:
-
试试
cv2.goodFeaturesToTrack()怎么样? -
这是最好的结果 (imgur.com/a/y2FyF) 我可以使用
5x5网格并将图像大小减小两倍。如果您可以拍摄新图像,我建议您使用官方 OpenCV 棋盘 (raw.githubusercontent.com/opencv/opencv/master/doc/pattern.png),因为您的对我来说似乎略有不同。另请记住,要获得良好的校准,校准图案必须尽可能平坦(校准方法依赖于平坦的校准图案)。