基于之前所做的特征匹配来实现摄像头姿态估计,即通过移动摄像头拍摄同一物体(如一本书)在不同姿态下的图片而计算出两次或者多次摄像头拍摄的位置。
要实现这一点,首先要对摄像头进行标定,获得摄像头的内参数,建立起摄像头的成像模型,才能够将图像物理坐标系(即照片中)中的点的信息与世界坐标系中的信息(即摄像头拍摄的位置)联系起来。
摄像头标定opencv已经提供了例程。
代码见。
https://github.com/opencv/opencv/blob/master/samples/cpp/tutorial_code/calib3d/camera_calibration/camera_calibration.cpp
代码比较长,你们不需要具体弄懂这个代码。只需要会使用它。
官方文档的解释如下
http://docs.opencv.org/3.1.0/d4/d94/tutorial_camera_calibration.html
http://wiki.opencv.org.cn/index.php/%E6%91%84%E5%83%8F%E5%A4%B4%E6%A0%87%E5%AE%9A
基本原理的参考
http://www.xuebuyuan.com/1497516.html
标定的概念可以顺带了解一下,但对数学细节也不用太在意。
标定需要摄像头和棋盘格,可以自行打印。
对于用过Matlab的同学更推荐Caltech的标定工具箱,见
http://www.vision.caltech.edu/bouguetj/calib_doc/
在完成摄像机标定后可以获得摄像机内参数矩阵K,我们就可以与之前的特征检测结合起来,从摄像头不同角度位置拍摄同一本书的图像中获取摄像头的位置(即旋转平移矩阵)。
方法可以见下述博客一直到重构场景上面的内容。
http://blog.csdn.net/zkl99999/article/details/46467277
重点看找到相机矩阵小结。
方法是通过特征匹配的点,求出摄像机之间的基础矩阵,再与摄像机内参数矩阵K进行运算,算出本征矩阵。
通过对本征矩阵奇异值分解,可以求解出两张图对应的摄像机的旋转和平移矩阵,这也就代表了两张图拍摄间摄像机的相对运动。
大家也可以看到特征提取和匹配,摄像机运动估计确实用途特别广泛,是很多算法的先行步骤,包括进行三维重建也要先进行这些步骤。
大家首先要理解三个基本概念,即基础矩阵,本征矩阵以及奇异值分解。
基础矩阵(Fundamental Matrix)
是双视图几何中的一个概念,指的是当存在两个摄像头的情况,描述空间中某一点在两个摄像机像平面中成像点的位置关系,简单说是两张照片中对应特征点的图像坐标的关系,这种关系也被称为对极线约束。
两摄像机光心分别是C和C’,图像平面是两白色的平面,空间中某一个点X在两张图的投影点分别是x和x’。
(x’)T*F*x=0
假设已知像x和光心位置,我们通过连线可以得到空间点X可能在的一条射线位置,假设已知X在射线上某点,与另一个摄像头光心相连,在另一个像平面上可以得到一个