我正在使用OpenCV 3.4版本中提供的calibration.cpp示例进行相机校准。我正在使用一个简单的9x6棋盘,方形长度= 3.45毫米。
运行代码的命令:
Calib.exe -w=9 -h=6 -s=3.45 -o=camera.yml -oe imgList.xml
我正在使用一批28张图片here
camera.yml(输出)
来自drawChessboardCorners的图像输出:here
有4幅图像没有绘制棋盘覆盖图,findChessboardCorners已经失败了。
结果看起来很奇怪(如果我理解正确的话)。我认为焦距值是理所当然的,但主要观点似乎偏离 c =(834,1513)。我期待在(1280,960)处靠近图像中心的点,因为相机朝向所观察的表面的方向非常接近90度。
此外,如果我将一个物体放在主点并在Z轴上移动,我不应该看到它在图像中沿着x和y移动,这是正确的吗?
我怀疑我应该添加相对于相机更大的棋盘倾斜度的图像,以获得更好的效果(z角度)。但是相机具有非常窄的景深,这可以防止检测到棋盘角落。
答案 0 :(得分:0)
您遇到的主要问题是您没有为相机软件提供足够的信息来正确估算不同的参数。
在所有28张图像中,您只更改了棋盘围绕z轴在同一平面中的方向。你不需要拍那么多照片,对我来说15岁左右是可以的。您需要为图像添加更多ddl
:更改棋盘与相机的距离,并使棋盘围绕其X轴和Y轴倾斜。重新校准相机,你应该得到正确的参数。
答案 1 :(得分:0)
这取决于您使用的相机和镜头。 更具体地说,例如:
一些带有小芯片的廉价网络摄像头甚至可能具有图像尺寸的主要点(意味着它也可能是负数)。因此,在您的情况下, C 可以是 - (834,1513)或(1513,834)。 如果您使用工业凸轮或类似物, C 应在图像中心附近的百分之几十的范围内 - 例如。 (1280,960)+ - 25%。
关于窄自由度的问题(简言之) - 为了使其更宽,您需要尽可能小的光圈,延长曝光并在相机后面添加一些额外的光来补偿光圈。 此外,您可以重新对焦以从不同距离拍摄清晰的镜头,只有您的精度会降低,因为重新对焦会略微改变焦距。但在大多数情况下,你不需要这种超级超精确度,所以这不应该是问题。