我对相机校准技术完全不了解......我正在使用OpenCV棋盘技术...我正在使用Quantum的网络摄像头......
这是我的观察和步骤..
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
fx
和fy
正在变化,fx:fy
几乎等于1. cx
和cy
值按200到400的顺序。当我改变时,fx
和fy
的数量级为300-700。距离。我正确地进行了校准吗?我应该使用除CV_CALIB_FIX_ASPECT_RATIO
之外的任何其他选项吗?如果是的话,哪一个?
嗯,你在寻找“帅气”还是“准确”?
相机校准是计算机视觉中极少数主题之一,其中精确度可以直接量化为物理术语,并通过物理实验进行验证。通常的教训是:(a)你的数字与你投入的努力(和金钱)一样好,而且(b)真正的准确性(与想象相反)是昂贵的,所以你应该提前弄清楚什么您的应用程序确实需要精确的方式。
如果您查看甚至非常便宜的镜头/传感器组合(百万像素范围及以上)的几何规格,很明显亚小时毫米校准精度在理论上可以在桌面空间体积内实现。只需计算出(从相机传感器的规格表中)一个像素跨越的立体角 - 你的钱包可以达到的空间分辨率让你眼花缭乱。然而,实际上实现可接受的理论精确度的东西需要工作。
以下是一些建议(根据个人经验),以获得本土设备的良好校准体验。
这是一个相当晚的答案,但对于那些来自谷歌的人来说:
检查校准精度的正确方法是使用OpenCV提供的重投影错误。我不确定为什么在答案或评论中没有提到这个,你不需要手工计算 - 这是calibrateCamera
的返回值。在Python中,它是第一个返回值(后跟相机矩阵等)。
重投影误差是使用固有系数投影点的位置与实际图像中的点之间的RMS误差。通常你应该期望RMS误差小于0.5px - 我可以通过机器视觉相机常规地获得0.1px左右。重投影错误用于许多计算机视觉文件中,没有一种更容易或更准确的方法来确定您的校准有多好。
除非你有一个立体声系统,否则你只能在三维空间中的某个位置找到射线而不是一个点。然而,由于可以计算出每个平面校准图像的姿势,因此可以计算每个棋盘角应落在图像传感器上的位置。校准过程(或多或少)尝试计算出这些光线下落的位置,并使所有不同校准图像上的误差最小化。在Zhang的原始论文和随后的评估中,大约10-15个图像似乎就足够了;此时,随着添加更多图像,错误不会显着减少。
其他软件包如Matlab将为您提供每个内在函数的误差估计,例如:焦距,投影中心。我一直无法让OpenCV吐出那些信息,但也许它就在某处。相机校准现在已经在Matlab 2014a中得到了解决,但你仍然可以掌握相机校准工具箱,它非常受计算机视觉用户的欢迎。
http://www.vision.caltech.edu/bouguetj/calib_doc/
视觉检查是必要的,但在处理结果时是不够的。最简单的事情就是世界上的直线在你未失真的图像中变得笔直。除此之外,仅通过查看输出图像,无法确定您的相机是否经过良好校准。
弗朗西斯科提供的例程很好,遵循这一点。我用架子板作为我的飞机,图案印在海报纸上。确保图像曝光良好 - 避免镜面反射!我使用的是标准的8x6模式,我尝试过更密集的模式但是我没有看到这种精确度的提高,因为它有所不同。
我认为这个答案对于大多数想要校准相机的人来说已经足够了 - 除非你试图校准像Fisheye这样的异国情调,或者你出于教育原因这样做,否则OpenCV / Matlab就是你所需要的。 Zhang的方法被认为足够好,几乎所有计算机视觉研究都使用它,而且大多数都使用Bouguet的工具箱或OpenCV。