我正在使用 calibration.cpp 进行相机校准OpenCV 3.4 版本中提供的示例。我使用的是一个简单的 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 角)。但是相机的景深真的很窄,这使得棋盘角无法被检测到。
最佳答案
您遇到的主要问题是您没有向相机软件提供足够的信息来正确估计不同的参数。
在所有 28 张图像中,您仅更改了棋盘在同一平面内围绕 z 轴的方向。你不需要拍那么多照片,对我来说15张左右就可以了。您需要向图像添加更多 ddl
:更改棋盘与相机的距离并围绕其 X 轴和 Y 轴倾斜棋盘。重新校准相机,您应该得到正确的参数。
关于c++ - OpenCV 3.4 相机校准产生奇怪的主点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48629474/