Skip to main content
 首页 » 编程设计

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

2024年04月17日10小虾米

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

这是我的观察和步骤..

  • 我一直保持每个国际象棋的正方形边长 = 3.5 厘米。这是一个 7 x 5 棋盘,带有 6 x 4 内角。我在距离网络摄像头 1 到 1.5 m 的地方拍摄了总共 10 张不同 View /姿势的图像。
  • 我正在关注 中的 C 代码学习OpenCV 来自 布拉德斯基 用于校准。
    我的校准代码是
    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
  • 随着棋盘距离的变化fxfy正在改变 fx:fy几乎等于 1。有 cxcy值按 200 到 400 的顺序排列。fxfy当我改变距离时,大约是 300 - 700。
  • 目前我已经把所有的失真系数都设置为零,因为我没有得到好的结果,包括失真系数。我的原图比没变形的还帅!!

  • 我是否正确进行了校准?我应该使用除 CV_CALIB_FIX_ASPECT_RATIO 之外的任何其他选项吗? ?.如果是,是哪一个?

    请您参考如下方法:

    嗯,你是在找“帅”还是“准”?
    相机校准是计算机视觉中为数不多的可以直接用物理术语量化精度并通过物理实验验证的主题之一。通常的教训是 (a) 你的数字和你投入的精力(和金钱)一样好,并且 (b) 真正的准确性(与想象相反)是昂贵的,所以你应该提前弄清楚什么您的应用程序确实需要精度。
    如果您查看甚至非常便宜的镜头/传感器组合(百万像素及以上)的几何规范,就会很明显地发现,理论上可以在桌面空间内实现亚亚毫米校准精度。只需计算出(从相机传感器的规范表中)一个像素跨越的立体角 - 您会为钱包触手可及的空间分辨率而眼花缭乱。然而,实际达到可重复的接近理论精度的东西需要工作。
    以下是一些建议(来自个人经验),可帮助您获得使用国产设备的良好校准体验。

  • 如果您的方法使用平面目标(“棋盘”或类似的),请制造一个好的目标。选择非常平坦的背衬(对于您提到的尺寸,5 毫米厚或更厚的窗玻璃是极好的,但显然易碎)。验证其相对于另一个边缘(或更好的激光束)的平整度。在不会太容易拉伸(stretch)的厚纸上打印图案。在粘合之前将其打印在背衬上并确认方形边确实非常接近正交。廉价的喷墨或激光打印机不是为严格的几何精度而设计的,不要盲目相信它们。最佳做法是使用专业的打印店(即使是 Kinko 打印机也会比大多数家用打印机做得更好)。然后非常小心地将图案贴在背衬上,使用喷胶并用软布慢慢删除以避免气泡和拉伸(stretch)。等待一天或更长时间,让胶水固化,胶纸应力达到长期稳定状态。最后用好的卡尺和放大镜测量角位置。对于“平均”平方大小,您可能会得到一个单一的数字,但它必须是实际测量值的平均值,而不是希望与祈祷的平均值。最佳做法是实际使用测量位置表。
  • 注意您的温度和湿度变化:纸从空气中吸收水分,背衬膨胀和收缩。令人惊讶的是,您可以找到多少篇报告亚毫米校准精度的文章,而无需引用环境条件(或对它们的目标响应)。不用说,他们大多是废话。与普通金属板相比,玻璃的温度膨胀系数较低是选择前者作为背衬的另一个原因。
  • 不用说,您必须禁用相机的自动对焦功能(如果有):对焦会物理移动镜头内的一块或多块玻璃,从而(略微)改变视野和(通常会改变很多)镜头畸变和主点。
  • 将相机放在不易振动的稳定支架上。根据应用程序的需要(不是校准 - 校准程序和目标必须根据应用程序的需要设计,而不是相反)。事后甚至不要考虑触摸相机或镜头。如果可能,请避免使用“复杂”镜片 - 例如变焦镜头或广角镜头。例如,变形镜头需要比 OpenCV 提供的库存复杂得多的模型。
  • 进行大量测量和图片。您希望每张图像有数百个测量值(角)和数十个图像。就数据而言,越多越好。 10x10 棋盘格是我考虑的绝对最小值。我通常在 20x20 下工作。
  • 拍照时跨度校准体积 .理想情况下,您希望您的测量结果均匀分布在您将使用的空间体积中。最重要的是,确保相对于焦轴显着倾斜目标 在某些图片中 - 要校准焦距,您需要“看到”一些真实的透视缩短。为获得最佳效果,请使用可重复的机械夹具移动目标。一个好的是单轴转台,它会给你一个很好的目标运动的先验模型。
  • 拍照时尽量减少振动和相关的运动模糊。
  • 使用良好的照明。真的。令人惊讶的是,我经常看到人们在游戏后期意识到你需要大量的光子来校准相机:-) 使用漫射环境照明,并将其从视野两侧的白卡上反射。
  • 观察您的角点提取代码在做什么。在图像上绘制检测到的角位置(例如在 Matlab 或 Octave 中),并判断它们的质量。使用严格的阈值及早去除异常值比信任捆绑调整代码中的稳健器要好。
  • 如果可以,请约束您的模型。例如,如果您没有充分的理由相信您的镜头明显偏离图像中心,请不要尝试估计主要点,只需在第一次尝试时将其固定在图像中心即可。主要点位置通常很难观察到,因为它本质上与非线性失真的中心以及平行于目标到相机平移的图像平面的分量混淆。正确处理需要精心设计的程序,该程序可以产生三个或更多场景的独立消失点,并很好地包围非线性失真。同样,除非您有理由怀疑镜头焦轴确实倾斜了 w.r.t.传感器平面,将相机矩阵的 (1,2) 分量固定为零。一般来说,使用满足您的测量和应用需求的最简单的模型(这是您的奥卡姆 Razor )。
  • 当您从优化器获得具有足够低 RMS 误差的校准解决方案(通常为十分之几像素,另请参见下面乔希的回答)时,绘制残差的 XY 模式(所有图像中每个角的预测_xy - 测量_xy)和 看看它是否是一个以 (0, 0) 为中心的圆形云 .异常值的“团块”或残差云的非圆度是尖叫的警钟,表明某些事情非常错误 - 可能是由于角落检测或匹配不良或镜头失真模型不合适而导致的异常值。
  • 拍摄额外的图像来验证解决方案的准确性 - 使用它们来验证镜头畸变实际上已消除,并且校准模型预测的平面单应性实际上与从测量角恢复的平面单应性相匹配。