为什么cv.findChessboardCorners不适合我?

时间:2013-12-15 23:29:08

标签: matlab opencv image-processing computer-vision

以下图片传递给cv.findChessboardCorners,由于我无法理解的原因,它只是没有给我角落位置。棋盘非常明显,白线厚度也很突出。

你知道为什么这不起作用吗?

图像尺寸为960X1280,网眼尺寸为[15,11],即每行15个内角和每列11个内角。

输出始终为空矩阵。我尝试更改参数和使用直方图均衡的函数,所以我假设像素分布不会有问题。

Checkerboard image projected on a Wall

3 个答案:

答案 0 :(得分:2)

我希望你不介意Python中的答案,而不是matlab。 (他们使用相同的openCV库,我希望命令之间的对应关系清晰。)

你的图像不变对我来说很好用,下面的代码可以找到角落并在窗口中用彩色点显示它们:

#!/usr/bin/python
import cv2.cv as cv
import sys

filename = sys.argv[1]
im = cv.LoadImage(filename, cv.CV_LOAD_IMAGE_GRAYSCALE)
im3 = cv.LoadImage(filename, cv.CV_LOAD_IMAGE_COLOR)
chessboard_dim = (15, 11)
found_all, corners = cv.FindChessboardCorners( im, chessboard_dim )
cv.DrawChessboardCorners( im3, chessboard_dim, corners, found_all )
cv.ShowImage("Chessboard with corners", im3)
cv.WaitKey()

输出图像(略微裁剪)看起来像:

Checkerboard with corners highlighted

答案 1 :(得分:2)

我在MATLAB中使用mexopencv(针对最新的OpenCV 2.4.7进行编译)尝试了它,并且我遇到了没有检测到角落的相同问题。

当然,通过稍微裁剪图像以便更多地关注电路板,可以轻松解决问题。您必须对所有图像序列应用一致的处理,并确保所有图像序列都包含在其中。

% read grayscale image
img = imread('http://i.stack.imgur.com/5VsOP.jpg');

% crop image to the area of the chessboard
img2 = img(100:600, 200:1000);

% detect corners
c = cv.findChessboardCorners(img2, [15,11]);
if isempty(c), error('no corners found'); end

% show result
out = cv.drawChessboardCorners(repmat(img2,[1 1 3]), [15,11], c);
imshow(out)

corners_detected

答案 2 :(得分:2)

如果您有计算机视觉系统工具箱,则可以使用detectCheckerboardPoints功能。它无需任何预处理即可工作,它可以为您提供亚像素精度。detected checkerboard