转载自:
http://blog.njuaplusplus.com/camera-calibration/官方教程地址:
http://docs.opencv.org/doc/tutorials/calib3d/camera_calibration/camera_calibration.html利用OpenCV校正摄像机
摄像机流行了很久了。随着20世纪末的便宜的针孔摄像机的引入,摄像机融入到了人们日常生活中。不幸的是,这种便宜是需要代价的:显著的畸变。幸运的是,这些变形都是常数,可以利用校正和重映射来修正畸变。甚至我们可以确定摄像机的自然单元(像素)和真实世界单元(例如毫米)之间的关系。
观点
对于畸变,OpenCV考虑的径向和切向因素。对于径向因素,我们使用如下公式:
对于一个输入图像中位于的原像素点,他在正确的输出图像中应位于。径向变形主要表现为桶形和鱼眼效果。
切向畸变由于摄像镜头不是和图像平面完全平行导致的。修正这个畸变是通过如下公式:
因此我们有5个畸变参数。OpenCV将它们组织成5列1行的行矩阵:
对于单位换算,我们使用如下公式:
这里有是因为我们使用的单应性坐标系统(homography coordinate system 且)。位置的参数是和(摄像头焦距)以及表示像素坐标中的光学中心。如果对于两个轴,有基于纵横比的通用的焦距,那么有,并且在上述公式中,我们将仅有一个焦距。包含上述四个参数的矩阵被称为,摄像机矩阵(camera matrix)。由于畸变系数和摄像头分辨率无关,所以可以根据校正分辨率和当前分辨率进行缩放。
确定上述两个方程的过程就是校正。计算这些参数是通过一些基本的几何等式完成的。等式和所用校正物体相关。当前OpenCV支持三种校正物体:
- 经典的黑白棋盘格
- 对称圆形图案
- 不对称圆形图案
你需要用摄像机拍去好友这些图案的照片,让OpenCV找到它们。每个找到的图案与新等式相同。纬二路解决等式,你至少需要一个预先确定的图案照片数目来组成一个适定的的等式系统。通常棋盘格的数量较少。
目标
该示例将:
- 确定畸变矩阵
- 确定摄像机矩阵
- 允许从摄像机,录像和图片文件列表
- 从XML/YAML中配置
- 保存结果到XML/YAML文件
- 计算重投射误差
源代码
http://docs.opencv.org/_downloads/camera_calibration.cpp http://docs.opencv.org/_downloads/in_VID5.xml http://docs.opencv.org/_downloads/VID5.xml说明
读入设置:
自定义了Settings类
不懂:cornerSubPix中的winSize什么意思。。
http://docs.opencv.org/trunk/modules/imgproc/doc/feature_detection.html#void cornerSubPix(InputArray image, InputOutputArray corners, Size winSize, Size zeroZone, TermCriteria criteria)校正和保存
每个摄像机只需校正一次,所以我们可以将参数保存下来,便于以后使用。
转载自:
http://blog.njuaplusplus.com/camera-calibration/