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

2024-04-29 05:43:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一张从相机上拍摄的棋盘图像:

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)

以下是输出,表明没有找到拐角:

^{pr2}$

我读了另外几个StackOverflow问题:

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

在这一点上,我对如何找到拐角有点迷茫。有人有什么建议可以分享吗?图像和代码就在这里,以防您想测试它们。我还应该指出的是,在拍摄图像时,我曾尝试增加原相机的亮度,但没有成功。在


Tags: 代码图像棋盘场景情况图片thiscv2
2条回答

这是我在以下环境中可以获得的最佳结果:

  • OpenCV 3.2版
  • 棋盘大小:5x5
  • 图像在每个维度上减少两个
  • CLAHE算法对图像进行预处理

Chessboard corners detection

C++代码:

cv::Mat img = cv::imread("klpVW.jpg", cv::IMREAD_GRAYSCALE);
cv::resize(img, img, cv::Size(), 0.5, 0.5);
cv::Ptr<cv::CLAHE> clahe = cv::createCLAHE();
clahe->apply(img, img);

std::vector<cv::Point2f> corners;
cv::Size boardSize(5, 5);
bool found = cv::findChessboardCorners(img, boardSize, corners);
std::cout << "found=" << found << std::endl;
cv::Mat display(img.size(), CV_8UC3);
cv::cvtColor(img, display, cv::COLOR_GRAY2BGR);
cv::drawChessboardCorners(display, boardSize, cv::Mat(corners), found);

cv::imshow("Chessboard corners", display);
cv::imwrite("test_chessboard_corners.png", display);
cv::waitKey(0);

由于您的OpenCV版本不同,您可能不会得到相同的结果。无论如何,您应该使用OpenCVpattern(你的方法对我来说似乎稍有不同),并记住校准模式必须尽可能平坦才能获得良好的校准结果。在

我使用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)

enter image description here

我知道这是不准确的,但经过一些预处理,你应该能得到更好的结果。在

:天

相关问题 更多 >