双目视觉标定-2.单目视觉标定opencv代码实战

本篇文章会通过代码来进一步解释如何进行双目视觉标定,需要配合上一篇理论一起食用,还没有看过理论篇的宝子,链接在这里:双目视觉标定-1视觉成像理论知识-优快云博客

目录

1. 什么是相机标定 Camera Calibration

2. 用Opencv进行相机标定

3. 相机标定的三种方法

4. 相机标定具体步骤及实现

       a. 用已知大小棋盘格进行真实世界3D坐标的定义 

       b. 从不同的角度获取棋盘格照片

       c. 用findChessboardCorners寻找在不同照片中3D坐标对应的2d图像坐标

        c.1 寻找棋盘格的corner

        c.2 找到更精确棋盘格corner

       d. 用calibrateCamera寻找相机参数

       e. 细化相机矩阵

       f. 让图像返璞归真(取消失真)

5. 单目视觉标定代码展示

6总结


1. 什么是相机标定 Camera Calibration

估计相机参数的过程称为相机标定。

看过上一篇的小伙伴应该对于从3d世界坐标转换到2d图像坐标用到的相机参数有些印象,但可能不多,毕竟刚开始掌握知识。我们的目标就是用一系列已知的3d现实世界坐标以及对应的图像坐标,寻找内参矩阵K,旋转矩阵R,平移向量t

相机参数一共有两种:

1. 内参 Internal Parameters

        a.光学中心optical center

        b焦距focal length

        c还没提到的镜头的转盘畸变系数radial distortion coefficient

2. 外参 External Parameters

        a.旋转矩阵

        b.平移向量

下面就是经过参数标定的畸变图像结果:

2. 用Opencv进行相机标定

上一篇我们是分布进行每个步骤的表示,现在我们直接把从现实世界的3d坐标(Xw,Yw,Zw,1)转换为图像世界的2d pixel坐标(u, v)一步表示为下方的方程:

P Projection Matrix 3×4的矩阵包含两个大矩阵的乘法,3×3内参矩阵 Intrinsic Matrix K和3×4 Extrinsic Matrix(由3×3旋转矩阵和3×1平移向量组成)

3. 相机标定的三种方法

1. 校准图案:从不同的角度捕获已知尺寸的物体或图案的多个图像。我们将在这篇文章中学习的基于棋盘chess board的方法就属于这一类。我们还可以使用已知尺寸的圆形图案来代替棋盘图案。(重点掌握)
2. 几何线索:利用场景中其他几何线索,例如直线和消失点,可用于校准。
3. 基于深度学习:当我们对成像设置的控制很少时(例如,我们只有场景的单个图像),仍然可以使用基于深度学习的方法获得相机的校准信息。

4. 相机标定具体步骤及实现

       a. 用已知大小棋盘格进行真实世界3D坐标的定义 

棋盘格图案在图像中清晰且易于检测。还有棋盘上正方形的角非常适合定位它们,在两个方向上都有急剧变化的梯度。此外,这些角还由于它们位于棋盘线的交叉点而相互连接。所有这些事实都用于可靠地定位棋盘图案中正方形的角点。
真实世界的坐标被固定在这个贴在墙上的棋盘格,我们选择的3d点是角点,任意交点都可以被选择为原点,Xw,Yw沿着墙,Zw轴垂直于墙。为了简单起见,我们可以说棋盘在 XY 平面上保持静止(因此 Z=0 ),并且相机相应地移动。这种考虑有助于我们仅找到 X,Y 值。

现在,对于 X,Y 值,我们可以简单地将点写为 (0,0)、(1,0)、(2,0)...,这表示点的位置。在这种情况下,我们得到的结果将以棋盘正方形的大小为单位。但如果我们知道正方形的尺寸(例如 30 毫米),我们可以将值传递为 (0,0)、(30,0)、(60,0)、...。因此,我们得到的结果以毫米为单位。

实现效果:http://v.youku.com/v_show/id_XMTU2Mzk0NjU3Ng==.html 如何在你的电脑上运行这个程序? 1,它需要cvblobslib这一个opencv的扩展库来实现检测物体与给物体画框的功能,具体安装信息请见: http://dsynflo.blogspot.com/2010/02/cvblobskib-with-opencv-installation.html,当你配置好cvblobslib之后,你可以用这一的程序进行测试:http://dl.dropbox.com/u/110310945/Blobs%20test.rar 2,视频中两个摄像头之间的距离是6cm,你可以根据你摄像头的型号,来选择合适的距离来达到最好的效果。 3,在进行测距之前,首先需要对摄像头进行标定,那么如何标定呢? 在stdafx.h中把"#define CALIBRATION 0"改成 “#define CALIBRATION 1”表示进行标定标定之后,你就可以在工程目录下的"CalibFile" 文件夹中得到标定信息的文件。如果标定效果还不错,你就可以吧"#define CALIBRATION " 改成0,以后就不需要再标定,直接使用上一次的标定信息。你还需要把"#define ANALYSIS_MODE 1"这行代码放到stdafx.h中。 4,视频中使用的是10*7的棋牌格,共摄录40帧来计算摄像头的各种参数,如果你像使用其他棋盘格,可以在 "StereoFunctions.cpp"文件中修改相应参数。 5,如果你无法打开摄像头,可以在 "StereoGrabber.cpp"文件中修改代码“cvCaptureFromCAM(index)”中index的值。 6,About computing distance: it interpolates the relationship between depth-value and real-distance to third degree polynomial. So i used excel file "interpolation" for interpolation to find k1 to k4, you should find your own value of these parameters. 7,你可以通过调整控制窗口中各个参数的滑块,从而来得到更好的视差图。 8,在目录下的”distance“文件夹中,有计算距离信息的matlab代码。 9,如果你想了解基本的理论,可以看一下这个文档:http://scholar.lib.vt.edu/theses/available/etd-12232009-222118/unrestricted/Short_NJ_T_2009.pdf 视频中环境:vs2008,opencv2.1
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值