相机标定+鸟瞰图生成(VS2017+OpenCV)

一、要求:

1.用自己的手机采集棋盘板定标数据;

2.实现或调用 角点检测、局部特征提取、局部特征匹配算法,标定自己手机的内参;

3.改变外参,生成不同视角的新图像。

二、实验过程:

1.实验前准备:

  1. 棋盘准备。
  2. 拍摄图片。用自己的手机多角度拍摄已经准备好的棋盘,共12张图片。放入pic文件夹,按序号命名:testxx.jpg。
  3. 测量数据。

A.标定板上每个棋盘格的大小:30mmx30mm

B.棋盘角点的行数和列数:9x6

  1. 安装好OpenCV,在VS2017中建立一个新的VC++空项目。

2.实验原理(查资料得):

(1)角点检测:

  • 角点就是极值点,即在某方面属性特别突出的点。角点可以是两条线的交叉处,也可以是位于相邻的两个主要方向不同的事物上的点。
  • 角点是图像很重要的特征,对图像图形的理解和分析有很重要的作用。角点在保留图像图形重要特征的同时,可以有效地减少信息的数据量,有利于图像的可靠匹配。
  • 目前的角点检测算法可归纳为3类:基于灰度图像的角点检测、基于二值图像的角点检测、基于轮廓曲线的角点检测。
  • 本次实验中使用的是OpenCV提供的专用于棋盘相机标定的提取棋盘角点的API。但是角点检测函数返回的值是像素整数坐标,为了使得到的角点坐标更精确,还用到了基于灰度图像的亚像素化角点的API,可以得到浮点型坐标。

(2)相机标定:

  • 为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数的过程就称之为相机标定(或摄像机标定)。
  • 传统相机标定法需要使用尺寸已知的标定物,通过建立标定物上坐标已知的点与其图像点之间的对应,利用一定的算法获得相机模型的内外参数。平面型标定物比三维标定物制作简单,精度易保证,但标定时必须采用两幅或两幅以上的图像。本次实验选择棋盘,并采集2张以上图像。
  • 空间物体表面某点的三维几何位置与其在图像中对应点之间的关系:关于坐标系转换更详细的解释

3)透镜畸变:

透镜由于制造精度以及组装工艺的偏差会引入畸变,导致原始图像的失真。镜头的畸变分为径向畸变和切向畸变两类。

  • https://img-blog.csdn.net/20161027212922016
    径向畸变就是沿着透镜半径方向分布的畸变,产生原因是光线在原理透镜中心的地方比靠近中心的地方更加弯曲。 成像仪光轴中心的畸变为0,沿着镜头半径方向向边缘移动,畸变越来越严重。畸变的数学模型可以用主点(principle point)周围的泰勒级数展开式的前几项进行描述,通常使用前两项,即k1和k2,对于畸变很大的镜头,可以增加使用第三项k3。https://img-blog.csdn.net/20161027215101234

  • 切向畸变是由于透镜本身与相机传感器平面(成像平面)或图像平面不平行而产生的,这种情况多是由于透镜被粘贴到镜头模组上的安装偏差导致。畸变模型可以用两个额外的参数p1和p2来描述:
  • https://img-blog.csdn.net/20161027215549759

4)透视变换:

透视变换矩阵变换公式为:

https://img-blog.csdn.net/20180510164306335

这是一个从二维空间变换到三维空间的转换,因为图像在二维平面,故除以Z,  (X';Y';Z')表示图像上的点:

https://img-blog.csdn.net/20180510165331808

令a33=1, 展开上面公式,得到一个点的情况:4个点可以得到8个方程,即可解出透视变换矩阵A。

(5)鸟瞰图生成原理:

  • 摄像机斜视拍摄一物体后,形成的图像会发生变形,如果将图像映射到拍摄物体平面上,相当于将相机垂直于拍摄平面,这样就会得到图像的真实形状。由于这种映射相当于将原图重新透视到另一个平面,这种称之为“重投影”。
  • 鸟瞰图的本质就是将图像平面中的信息“重投影”到地平面上,所以,首先要获取两个平面间的投影变换关系H。在程序中,是通过在地平面上放置标定板图像,然后获得地平面上棋盘格图像上四个顶点的坐标(0,0),(widht-1,0),(0,height -1),(wdith-1,height-1);同时,在拍摄的图像平面提取角点,并获得与地平面上四个点对应的角点在图像空间中的坐标值,通过四个坐标点间的对应关系,基于getPerspectiveTransform()函数,获得地平面到图像平面间的投影变换关系H;最后,通过warpPerspective()函数对图像进行逆向映射到地平面空间中。

3.代码实现:点这里下载demo

(1)读取图片

Mat imageInput = imread (addInexToName (image_index, "pic", ".jpg"));

(2)准备相机标定参数

(1)图像的亚像素角点

  A.提取角点

Size board_size = Size (9, 6);    //棋盘标定板上每行、列的角点数

vector<Point2f> image_corners;  // 每幅图像上检测到的角点数组

vector<vector<Point2f>> all_corners; //所有图像角点数组

//提取角点

               i

  • 4
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值