3D-2D:PnP
PnP(Perspective-n-Point):当知道n个3D空间点及其投影位置时,估计相机位姿。
2D-2D的对极几何方法需要八个或八个以上的点对(以八点法为例),且存在着初始化、纯旋转和尺度的问题。然而,如果两张图像中,其中一张特征点的 3D 位置已知(特征点的 3D 位置可以由三角化,或者由 RGB-D 相机的深度图确定)。那么最少只需三个点对(需要至少一个额外点验证结果)就可以估计相机运动。
因此,在双目或 RGB-D 的视觉里程计中,我们可以直接使用 PnP 估计相机运动。
而在单目视觉里程计中,必须先进行初始化,然后才能使用 PnP。
3D-2D 方法不需要使用对极约束,又可以在很少的匹配点中获得较好的运动估计,是最重要的一种姿态估计方法。
PnP有多种方法求解:直线线性变换(DLT)、P3P还有非线性方法,构建最小二乘问题并迭代求解(Bundle Adjustment)。
直线线性变换(DLT)
空间点P,齐次坐标为$P=\left(X,Y,Z,1\right)^{T}$
在图像$I_1$中,投影到特征点$x_1=\left(u_1,v_1,1\right)^{T}$(归一化平面齐次坐标表示),并没有用到相机内参K,所以是归一化坐标而不是像素坐标。
定义增广矩阵$\left[R|t\right]$为一个3X4的矩阵,包含旋转与平移信息。
$s\begin{bmatrix} u_1 \\ v_1 \\ 1 \end{bmatrix} = \begin{bmatrix} t_1 & t_2 & t_3 & t_4 \\ t_5 & t_6 & t_7 & t_8 \\ t_9 & t_{10} & t_{11} & t_{12} \end{bmatrix}\begin{bmatrix} X \\ Y \\ Z \\1 \end{bmatrix}$
$su_1 = t_1X + t_2Y + t_3Z + t_4$
$sv_1 = t_5X + t_6Y + t_7Z + t_8$
$s = t_9X + t_{10}Y + t_{11}Z + t_{12}$
把s消去:
$u_1 = \frac{t_1X + t_2Y + t_3Z + t_4}{t_9X + t_{10}Y + t_{11}Z + t_{12}}$,$v_1 = \frac{t_5X + t_6Y + t_7Z + t_8}{t_9X + t_{10}Y + t_{11}Z + t_{12}}$

$u_1 =\frac{\textbf{t}_{1}^{T}P}{\textbf{t}_{3}^{T}P}$,$v_1 =\frac{\textbf{t}_{2}^{T}P}{\textbf{t}_{3}^{T}P}$

一个特征点提供了两个关于t的约束。
t有12维,最少需要6对匹配点求$\left[R|t\right]$,为直接线性变换。
可由QR分解完成。
P3P
见书
Bundle Adjustment
除了以上DLT线性方法外,还可以构建非线性最小二乘问题。
线性方法先求相机位姿,再求空间点位置。
非线性优化则把相机位姿和空间点位置都当做优化变量,一起优化。
最小化重投影误差(Reprojection error)
n个三维空间点P及其投影p,位姿为R,t。李代数表示为$\zeta$。
考虑n个三维空间点P及其投影p。
假设某空间点坐标为$P_i = \left[X_i,Y_i,Z_i\right]^{T}$,投影坐标为$u_i=\left[u_i,v_i\right]^{T}$

$exp\left(\zeta^{\wedge}\right)P_i$结果是 4 × 1 的,而它左侧的 K 是 3 × 3 的,所以必须把$exp\left(\zeta^{\wedge}\right)P_i$的前三维取出来,变成三维的非齐次坐标。
将像素坐标(观测到的投影位置)与3D点按照当前估计的位姿进行投影得到的位置相比较得到的误差,即重投影误差。
使用牛顿高斯法需要知道每个误差关于优化变量的导数,也是线性化:
$e\left(x+\Delta\right) \thickapprox e\left(x\right) + J\Delta{x}$,其中e为像素坐标误差。
优化相机位姿$\zeta$
相机坐标系下的空间点坐标$P^{'}$

其中$\delta{\zeta}$是位姿增量相当于牛顿法中的$\Delta{x}$,$e\left(\delta\zeta\oplus\zeta\right)$相于与$f\left(x+\Delta{x}\right)$,f为误差函数,$\oplus$为李代数上的左扰动。
设观测值$\left[u^{'},v^{'}\right]^{T}$。
$e = \left[u^{'}-\left(f_x\frac{X^{'}}{Z^{'}}+c_x\right), v^{'}-\left(f_y\frac{Y^{'}}{Z^{'}}+c_y\right)\right]^{T}$
$P^{'}=\left[X^{'},Y^{'},Z^{'}\right]^{T}$

$\frac{\partial{P}^{'}}{\partial\delta\zeta}=\frac{\partial\left({TP}\right)}{\partial\delta\zeta}$
以下推导过程$p$表示$P$,即空间点。

其中$\delta\zeta = \left[\delta\rho,\delta\phi\right]^{T}$,$a^{\wedge}b = -b^{\wedge}a$


优化空间点$P$

其中$\frac{\partial{P{'}}}{\partial{\delta\zeta}}$雅克比的推导方法也可参考:https://blog.csdn.net/zhubaohua_bupt/article/details/74011005
$\delta{\zeta}=\left[\delta\rho,\delta\phi\right]$,$P^{'}=\left[X^{'},Y^{'},Z^{'}\right]$
$\delta{\zeta}=\left[\delta\rho_1,\delta\rho_2,\delta\rho_3,\delta\phi_1,\delta\phi_2,\delta\phi_3\right]$
$\delta{\phi}^{\wedge} = \begin{bmatrix} 0 & -\delta\phi_3 & \delta\phi_2 \\ \delta\phi_3 & 0 & -\delta\phi_1 \\ -\delta\phi_2 & \delta\phi_1 & 0 \end {bmatrix}$
$\delta{\phi}^{\wedge}P^{'}+\delta\rho = \begin{bmatrix} -\delta\phi_3x_2+\delta\phi_2x_3 + \delta\rho_1 \\ \delta\phi_3x_1- \delta\phi_1x_3 + \delta\rho_2 \\ -\delta\phi_2x_1+\delta\phi_1x_2 + \delta\rho_3 \end{bmatrix}$
对$\delta{\zeta}=\left[\delta\rho_1,\delta\rho_2,\delta\rho_3,\delta\phi_1,\delta\phi_2,\delta\phi_3\right]$求导,得$\begin {bmatrix} 1 & 0 & 0 & 0 & -Z^{'} & Y^{'} \\ 0 & 1 & 0 & Z^{'} & 0 & -X^{'} \\ 0 & 0 & 1 & -Y^{'} & X^{'} & 0 \end{bmatrix}$,即$\left[I_{3x3},-P_{3x3}^{'\wedge}\right]$
3D-2D:PnP的更多相关文章
- 【转载】3D/2D中的D3DXMatrixPerspectiveFovLH和D3DXMatrixOrthoLH投影函数详解
原文:3D/2D中的D3DXMatrixPerspectiveFovLH和D3DXMatrixOrthoLH投影函数详解 3D中z值会影响屏幕坐标系到世界坐标系之间的转换,2D中Z值不会产生影响(而只 ...
- unity3d 角色头顶信息3D&2D遮挡解决方案(一)
先上效果图,只凭文字描述,脑补应该有些困难- - 如图:有三个角色(我们暂且从左到右叫它们A.B.C),一个2D UI(中间动作选择的框框),一个cube(右边的方块) cube挡住了角色C的头顶信息 ...
- unity3d 角色头顶信息3D&2D遮挡解决方案(二)
在阅读本文之前请先阅读上一篇文章:http://www.cnblogs.com/shenggege/p/4179012.html 本来一篇文章就可以说完了,但是上次只是实现了已知的一些功能 后来在实际 ...
- 学习手机游戏开发的两个方向 Cocos2d-x 和 Unity 3D/2D,哪个前景更好?
如题! 首先说一说学习手机游戏(移动游戏)这件事. 眼下移动互联网行业的在以井喷状态发展.全球几十亿人都持有智能终端设备(ios android),造就了非常多移动互联网创业机会: 一.移动社交 微信 ...
- 3D图形图像处理软件HOOPS介绍及下载
HOOPS 3D Application Framework(以下简称HOOPS)是建立在OpenGL.Direct3D等图形编程接口之上的更高级别的应用程序框架.不仅为您提供强大的图形功能,还内嵌了 ...
- 无插件纯web 3D机房 (第四季:大型园区、地球仪效果和其他扩展应用)
前言 初次见面的朋友们大家好,这篇文章是"无插件纯web 3D机房"系列的第四季,感兴趣的朋友可从头开始观看,以下是正确的阅读顺序: 无插件纯web 3D机房(第一季:从零开始搭建 ...
- 【翻译】西川善司的「实验做出的游戏图形」「GUILTY GEAR Xrd -SIGN-」中实现的「纯卡通动画的实时3D图形」的秘密,后篇
http://www.4gamer.net/games/216/G021678/20140714079/ 连载第2回的本回, Arc System Works开发的格斗游戏「GUILTY G ...
- 3D模型文件读写.Net SDK
AnyCAD .Net/C++ SDK支持多种3D/2D文件格式,比如BREP.STEP.IGES.STL.DXF.3DS.OBJ.FBX.SKP.IFC.DAE……等,根据使用场景提供不同的API. ...
- 全球最大的3D数据集公开了!标记好的10800张全景图
Middlebury数据集 http://vision.middlebury.edu/stereo/data/ KITTI数据集简介与使用 https://blog.csdn.net/solomon1 ...
- Godot-3D教程-01.介绍3D
创建一个3D游戏将是个挑战,额外增加的Z坐标将使许多用于2D游戏的通用技术不再有用.为了帮助变换(transition),值得一提的是Godot将使用十分相似的API用于2D和3D. 目前许多节点是公 ...
随机推荐
- java关于密码的加密解密
密码的加密方法有多种,常见的为Aes.Md5 Aes加密,可逆. 其中,Md5加密是采用了散列算法,也就是哈希算法,可以进行多次散列加密.Md5加密是不可逆的,无法解密. MD5是不可逆的单向加密方式 ...
- 流形学习 (Manifold Learning)
流形学习 (manifold learning) zz from prfans............................... dodo:流形学习 (manifold learning) ...
- win10如和设置远程桌面
最近几天一直在搞远程桌面问题,电脑一直连不上远程,今天终于出来了. 前提前提 条件,要电脑允许Administrator用户,先把电脑切换到那个用户,然后进行下面操作. 1.在桌面,我的电脑图标,鼠 ...
- py学习之FTP
1.FTP之参数解析与命令分发 a) 层级目录如下 b) 配置文件如下 #!/usr/bin/env python # -*- coding:utf8 -*- import socket sk=soc ...
- python全栈考试
1.执行 Python 脚本的两种方式 shell直接调用python脚本 python run.py 调用解释器来调用脚本 2.2.简述位.字节的关系 每8个位bit,组成一个字节byte. 一个 ...
- 利率计算--web版--软件工程
1.客户说:帮我开发一个复利计算软件. 完成复利公式计算程序,并成功PUSH到github上. 截止时间:3.10晚12点之前. 按照这个要求完成了. 演示. 计算:本金为100万,利率或者投资回报率 ...
- loadrunner--web_url函数用法
web_url语法: Int Web_url(const char *name, const char * url, <Lists of Attributes>, [EXTR ...
- 获取weibo用户所有的关注列表
1.新浪微博Python SDK笔记——获取粉丝列表或关注列表 http://www.tuicool.com/articles/VnQ3ye 2.friendships/friends关注列表 fri ...
- 6 Django 的视图层
视图函数 一个视图函数,简称视图,是一个简单的 Python 函数,它接受 Web 请求并且返回 Web 响应.响应可以是一张网页的 HTML 内容,一个重定向,一个 404 错误,一个 XML 文档 ...
- C++继承-重载-多态-虚函数
C++ 继承 基类 & 派生类 一个类可以派生自多个类,这意味着,它可以从多个基类继承数据和函数.定义一个派生类,我们使用一个类派生列表来指定基类.类派生列表以一个或多个基类命名,形式如下: ...