我正在校准我的相机,结果很糟糕 . 截至目前,我责怪我的相机坏了或我做错了什么 . 我使用的主要功能是: findChessboardCornerscornerSubPixfindCirclesGridcalibrateCamerasolvePnP (在相机校准的opencv文档中有很好的描述)

所以我开始评估如果我添加“完美”数据,相机校准算法的工作原理 . 我使用3D CAD建模软件(Rhinoceros3D)并以绝对精度建模我的网格,即方形尺寸和之间的距离恰好为10毫米 . 我的校准模式位于OXY平面上 . 由于3D cad软件具有透视图,因此我可以轻松地在屏幕上呈现结果,就像它在现实中一样 . 所以我生成了图像,因为我会在现实世界中捕获它们 . 这种情况是完美的情况 - 模式绝对精确,没有失真,世界上没有相机可以产生如此好的效果 .

棋盘8x10 https://www.dropbox.com/sh/9zbzk6bqekih8il/AADUZvxwd5PdmGXauCJSHFMwa?dl=0

不对称网格4 x 11 https://www.dropbox.com/sh/9abr79py4z9hf3x/AABj0ez5_bxL4rsFLjxKwjsma?dl=0

我的下一步是校准相机 . 我传递了图像并从calibrateCamera函数中获得了棋盘的0.115208像素误差和非对称网格的0.030177像素误差 .

那么我需要做的是评估校准的好坏程度 . 对于同一组图像,我使用solvePnP(使用具有相同结果的solvePnPRansac)来定位相机的位置 . 我明确解决了 - 没有初始猜测摄像机位置(因为这是摄像机空间的新位置) . 使用结果的rot和trans,我构造了一个笛卡尔坐标系,从相机原点传递光线,通过UNDISTORTED点并与平面OXY相交 . 理想情况下,我希望这些线非常精确地与平面相交(在点(0,0),(0,10),(10,0)等) .

问题是我得到了大约0.15毫米的显着偏移,这意味着将我的相机放在3D中是错误的 . 我想用这个作为“相机 - 投影机校准”的基础,但是如果我在“完美”场景中遇到如此大的错误,那么真正的相机/投影机将无法获得良好的效果 .

我做的另一项测试是:1 . 对于每个具有calibrationMatrix和偏差系数的图像,使用solvePnP找到摄像机位置 . 2.仅交叉图案中检测到的角的第一个点 . (它应该与(0,0)中的0XY相交)3 . 评估所有这些点到原点的距离的标准偏差(0,0) - 位置精度4.评估所有这些点到它们的距离的标准偏差平均点 - 系统精度

问题是,对于LOCATION精度,我得到误差0.165423 mm,对于SYSTEMATIC精度,我得到误差0.035441 mm .

这些错误很高 . 我希望LOCATION和SYSTEMATIC的精度能够为所提供的数据集提供0.0001 mm的精度 .

我的问题是 - 有人可以在实施中测试链接中的图像,让我知道结果是什么?可能是我在实施中遗漏了一些内容,但我确信在提供“完美”数据时我们应该得到“完美”的结果 .

我将非常感谢你的帮助 .

附: - 我正在使用opencv 2.4.10 . 这些算法在3.0中有什么改进吗?

非常感谢