以下图片传递给cv.findChessboardCorners,由于我无法理解的原因,它只是没有给我角落位置。棋盘非常明显,白线厚度也很突出。
你知道为什么这不起作用吗?
图像尺寸为960X1280,网眼尺寸为[15,11],即每行15个内角和每列11个内角。
输出始终为空矩阵。我尝试更改参数和使用直方图均衡的函数,所以我假设像素分布不会有问题。
答案 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()
输出图像(略微裁剪)看起来像:
答案 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)
答案 2 :(得分:2)
如果您有计算机视觉系统工具箱,则可以使用detectCheckerboardPoints
功能。它无需任何预处理即可工作,它可以为您提供亚像素精度。