引出:
2D-2D的对极几何需要8个以上点对,且存在初始化、纯旋转和尺度问题。
特征点3D位置可以由三角化或RGB-D相机深度图确定。
因此,双目或RGB-D相机直接使用PnP估计相机运动。单目视觉里程计,首先初始化,然后才能PnP。
PnP为( Perspective-n-Point)
的简称,即给出n个3D空间点及其投影位置时,如何求解相机的位姿R t。
PnP优点:不需要对极约束,3个的匹配点对就可以运动估计。
内容:
直接线性变换(DLT)
P3P及实现
BA(Bundle Adjustment)及实现
一、DLT
- 每个特征点对提供两个关于t的线性约束,t 一共12维,至少需要6个特征点对实现T的线性求解。
- 匹配点数大于6,SVD最小二乘解。
- 缺点:T矩阵看成12个未知数,忽略了他们之间的联系。
二、P3P
1、原理:利用了三角形相似,求解投影点abc在相机坐标系下的3D坐标,然后将问题转为3D-3D问题。
在SLAM实用:先P3P估计相机位姿R t, 之后构建最小二乘优化问题对估计值进行调整。
2、代码实现
调用solvePnP函数
bool cv::solvePnP(objectPoints,imagePoints,cameraMatrix,distCoeffs,
OutputArray r, OutputArray t,
bool useExtrinsicGuess = false,int flags = SOLVEPNP_ITERATIVE )
objectPoints | Array of object points in the 世界坐标系, Nx3 1-channel or 1xN/Nx1 3-channel, where N is the number of points. vector<Point3f> pts_3d |
imagePoints | Array of corresponding 第二张图的像素坐标, Nx2 1-channel or 1xN/Nx1 2-channel, where N is the number of points. vector<Point2f> pts_2d |
cameraMatrix | Input camera matrix K |
distCoeffs | Input vector of distortion coefficients (k1,k2,p1,p2[,k3[,k4,k5,k6[,s1,s2,s3,s4[,τx,τy]]]]) of 4, 5, 8, 12 or 14 elements. If the vector is NULL/empty, the zero distortion coefficients are assumed. |
rvec | Output 旋转向量 (see Rodrigues ) that, together with tvec , brings points from the model coordinate system to the camera coordinate system.需要罗德里格斯公式化为旋转矩阵 |