如何验证网络摄像头校准的正确性?

Posted

技术标签:

【中文标题】如何验证网络摄像头校准的正确性?【英文标题】:How to verify the correctness of calibration of a webcam? 【发布时间】:2012-09-29 11:31:15 【问题描述】:

我对相机校准技术完全陌生...我正在使用 OpenCV 棋盘技术...我正在使用 Quantum 的网络摄像头...

这是我的观察和步骤..

    我已将每个国际象棋的正方形边 = 3.5 厘米。它是一个 7 x 5 的棋盘,内有 6 x 4 个角。我在距网络摄像头 1 到 1.5 m 的距离内拍摄了 10 张不同视图/姿势的图像。

    我正在按照 BradskiLearning OpenCV 中的 C 代码进行校准。 我的校准代码是

    cvCalibrateCamera2(object_points,image_points,point_counts,cvSize(640,480),intrinsic_matrix,distortion_coeffs,NULL,NULL,CV_CALIB_FIX_ASPECT_RATIO);
    

    在调用此函数之前,我将沿固有矩阵的对角线的第一个和第二个元素设为一个,以保持焦距比不变并使用CV_CALIB_FIX_ASPECT_RATIO

    1234563 . 当我改变距离时,fxfy 的顺序是 300 - 700。

    目前我已将所有失真系数归零,因为我没有得到包括失真系数在内的良好结果。我的原始图像看起来比未失真的图像帅!!

我的校准是否正确?我应该使用CV_CALIB_FIX_ASPECT_RATIO以外的任何其他选项吗?如果有,是哪一个?

【问题讨论】:

【参考方案1】:

嗯,你要的是“帅”还是“准”?

相机校准是计算机视觉中为数不多的可以直接用物理术语量化精度并通过物理实验验证的主题之一。通常的教训是(a)您的数字与您投入的努力(和金钱)一样好,并且(b)真正的准确性(与想象的相反)是昂贵的,因此您应该提前弄清楚您的应用程序确实需要精确度。

如果您查看即使是非常便宜的镜头/传感器组合(百万像素及以上)的几何规格,很明显,在桌面空间内理论上可以实现亚亚毫米级的校准精度.只需计算(从相机传感器的规格表中)跨越一个像素的立体角 - 你会被你钱包里的空间分辨率所迷惑。然而,实际上要达到接近理论精度的可重复性需要工作。

以下是一些建议(来自个人经验),以帮助您获得良好的国产设备校准体验。

    如果您的方法使用平面目标(“棋盘”或类似物),请制造一个好的目标。选择一个非常平坦的背衬(对于您提到的 5 毫米厚或更大的窗户玻璃尺寸非常好,尽管显然很脆弱)。验证其对另一个边缘(或者,更好的是激光束)的平整度。在不易拉伸的厚纸上打印图案。在胶合前将其打印在背衬上,并验证方形边确实非常接近正交。廉价的喷墨或激光打印机并非专为严格的几何精度而设计,不要盲目相信它们。最佳做法是使用专业的打印店(即使是 Kinko 的打印机也会比大多数家用打印机做得更好)。然后非常小心地将图案贴在背衬上,使用喷胶并用软布慢慢擦拭,以避免气泡和拉伸。等待一天或更长时间,让胶水固化,胶纸应力达到长期稳定状态。最后测量用一个好的卡尺和放大镜的角位置。您可能会得到一个“平均”平方大小的数字,但它必须是实际测量的平均值,而不是希望与祈祷的平均值。最佳做法是实际使用测量位置表。

    注意您的温度和湿度变化:纸张从空气中吸收水分,背衬会膨胀和收缩。令人惊讶的是,您可以找到许多文章报告亚毫米校准精度而不引用环境条件(或目标对它们的响应)。不用说,他们大多是垃圾。与普通金属板相比,玻璃的较低温度膨胀系数是首选前者作为背衬的另一个原因。

    不用说,您必须禁用相机的自动对焦功能(如果有):对焦会物理移动镜头内的一块或多块玻璃,从而(稍微)改变视野和(通常很多)镜头畸变和主要点。

    将相机放置在不易振动的稳固支架上。根据应用程序的需要(而不是校准 - 校准程序和目标必须针对应用程序的需求进行设计,而不是相反),对焦(和 f-stop 镜头,如果它有光圈的话)。之后甚至不要考虑触摸相机或镜头。如果可能的话,避免使用“复杂”的镜头——例如变焦镜头或超广角镜头。例如,变形镜头需要的模型比现有的 OpenCV 提供的模型要复杂得多。

    进行大量测量和拍照。每个图像需要数百个测量值(角)和数十个图像。在数据方面,越多越好。 10x10 棋盘是我会考虑的绝对最小值。我通常在 20x20 工作。

    拍照时跨越校准体积。理想情况下,您希望您的测量值均匀分布在您将使用的空间体积中。最重要的是,请确保在某些图片中相对于焦轴显着倾斜目标 - 校准您需要“看到”一些真实透视缩短的焦距。为获得最佳效果,请使用可重复的机械夹具来移动目标。一个好的是单轴转盘,它可以为您提供一个很好的目标运动先验模型。

    在拍照时尽量减少振动和相关的运动模糊。

    使用良好的照明。真的。令人惊讶的是,我经常看到人们在游戏后期意识到您需要大量的光子来校准相机 :-) 使用漫反射环境照明,并将其从视野两侧的白卡上反射回来。

    观察您的角点提取代码在做什么。在图像顶部绘制检测到的角位置(例如在 Matlab 或 Octave 中),并判断它们的质量。使用严格的阈值及早去除异常值比信任捆绑调整代码中的鲁棒性更好。

    如果可以,请限制您的模型。例如,如果您没有充分的理由相信您的镜头明显偏离图像中心,请不要尝试估计主要点,只需在第一次尝试时将其固定在图像中心即可。主点位置通常很难观察到,因为它本质上会混淆非线性失真的中心以及平行于目标图像平面的分量。相机的翻译。要做到这一点,需要一个精心设计的程序,该程序产生三个或更多独立的场景消失点一个非常好的非线性失真包围。同样,除非您有理由怀疑镜头焦轴确实倾斜 w.r.t。传感器平面,将相机矩阵的 (1,2) 分量固定为零。一般来说,请使用满足您的测量您的应用程序需求的最简单模型(这就是 Ockam 的剃须刀)。

    当您从优化器获得具有足够低 RMS 误差(通常为十分之几像素,另请参见下面 Josh 的回答)的校准解决方案时,绘制残差的 XY 模式(predicted_xy - measure_xy 中每个角所有图像)并看看它是否是一个以 (0, 0) 为中心的圆形云。异常值的“团块”或残差云的非圆度正在发出警报,表明存在严重问题 - 可能是由于角检测或匹配不良或镜头畸变模型不当造成的异常值。

    获取额外的图像以验证解决方案的准确性 - 使用它们来验证镜头畸变是否实际被消除,并且校准模型预测的平面单应性实际上与从测量角恢复的平面单应性相匹配。

【讨论】:

我已经在这里***.com/questions/18052337/… 重新提出了问题,欢迎您贡献。 虽然您的回答很好,但它并没有完全回答原始问题(嗯,确实如此,但似乎您有足够的知识可以更具体地回答这个问题:)给定一台相机及其校准,如何知道这种校准是正确的? 嗯,最基本的测试,通常就足够了,是比较视觉失真和未失真的图像。如果校准不正确,应用 cv::undistort() 将产生具有明显且非常严重的失真的图像。检查aishack.in/2010/07/…,并通过示例注意错误校准部分。 LOL - 是的,这是最基本的测试,不,通常还不够。例如,当您的智能手机摄像头查看桌面场景时,半像素错位很容易映射到桌子上几英寸的误差。如果你能目测半个像素,你的眼镜比我的好:-) @FrancescoCallari +1 非常详细的列表!【参考方案2】:

这是一个相当晚的答案,但对于来自 Google 的人来说:

检查校准精度的正确方法是使用 OpenCV 提供的重投影误差。我不确定为什么在答案或 cmets 的任何地方都没有提到这一点,你不需要手动计算 - 它是 calibrateCamera 的返回值。在 Python 中,它是第一个返回值(后面是相机矩阵等)。

重投影误差是使用固有系数投影点的位置与它们在真实图像中的位置之间的 RMS 误差。 通常情况下,RMS 误差应该小于 0.5 像素 - 我通常可以使用机器视觉相机获得大约 0.1 像素。许多计算机视觉论文中都使用了重投影误差,没有一种更容易或更准确的方法来确定您的校准效果如何。

除非您有立体系统,否则您只能计算出物体在 3D 空间中的位置,直到一条射线,而不是一个点。然而,由于可以计算出每个平面校准图像的姿态,因此可以计算出每个棋盘角应该落在图像传感器上的位置。校准过程(或多或少)试图找出这些光线落在哪里,并将所有不同校准图像的误差最小化。在 Zhang 的原始论文和随后的评估中,大约 10-15 张图像似乎就足够了;此时误差不会随着添加更多图像而显着降低。

Matlab 等其他软件包将为您提供每个内在函数的误差估计,例如焦距,投影中心。我一直无法让 OpenCV 吐出这些信息,但也许它就在某个地方。相机校准现在是 Matlab 2014a 中的原生功能,但您仍然可以使用非常受计算机视觉用户欢迎的相机校准工具箱。

http://www.vision.caltech.edu/bouguetj/calib_doc/

目视检查是必要的,但在处理结果时还不够。要寻找的最简单的事情是世界上的直线在您未失真的图像中变成直线。除此之外,仅通过查看输出图像无法真正确定您的相机是否校准良好。

Francesco提供的套路很好,照着做。我使用架板作为我的飞机,图案印在海报纸上。确保图像曝光良好 - 避免镜面反射!我使用标准的 8x6 模式,我尝试过更密集的模式,但我还没有看到准确度有如此大的提高,以至于它有所作为。

我认为对于大多数想要校准相机的人来说,这个答案应该足够了 - 实际上,除非您尝试校准像鱼眼这样的异国情调的东西,或者出于教育原因,OpenCV/Matlab 就是您所需要的。 Zhang 的方法被认为足够好,几乎所有计算机视觉研究人员都在使用它,其中大多数人要么使用 Bouguet 的工具箱,要么使用 OpenCV。

【讨论】:

低 RMS 误差是良好校准精度的必要条件,但不是充分条件,因为它可以隐藏偏差。这就是为什么我还建议查看残差的 XY 图。感谢您的认可! 这是否也适用于通过其他搜索引擎来到这里的人? :-)

以上是关于如何验证网络摄像头校准的正确性?的主要内容,如果未能解决你的问题,请参考以下文章

用于 OpenCV 的 Iphone 6 相机校准

如何正确向 Chrome 提供模拟网络摄像头视频?

校准摄像机和stereoCalibrate的正确“objpoints”应该是什么?

是否必须校准相机才能与 StereoBM 一起使用?

译如何使用Vue捕获网络摄像头视频

如何把摄像头接到西门子触摸屏