c++ - OpenCV 3.4 相机校准产生奇怪的主点

标签 c++ opencv camera-calibration calibration

我正在使用 calibration.cpp 进行相机校准OpenCV 3.4 版本中提供的示例。我使用的是一个简单的 9x6 棋盘,方格长度 = 3.45 毫米。

运行代码的命令:

Calib.exe -w=9 -h=6 -s=3.45 -o=camera.yml -oe imgList.xml

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/

相关文章:

c++ - Scala 可变数量的参数是 F-Bounded 类型的子类

c++ - C++中的循环继承

opencv - 如何消除内部轮廓? Python

opencv - 如何将帧数据从 FFmpegSource2 (FFMS2) FFMS_Frame 结构复制到 OpenCV Mat?

matlab - 相机到校准图案的距离会影响校准参数吗?

math - 视场中的 Kinect 内在参数

opencv - cvundistortpoints 中的新相机矩阵是什么?

C++ 错误:没有匹配函数来调用‘simplex615<arbitraryFunc>::amoeba

c++ - 括号之间的两个字符串在 C++ 中用逗号分隔

java - 如何修复android studio中的以下错误 "Please specify environmental variable OPENCV_ANDROID_SDK to OpenCV Android SDK directory."?