相机姿态估计(一)--PnP

本文详细介绍了PnP(perspective-n-point)问题的概念及其求解方法,包括DLT、P3P/AP3P、EPnP等算法,并探讨了单目视觉下的相机位姿估计原理。
该文章已生成可运行项目,

PnP(pespective-n-point)问题,就是已知的n个空间3D点与图像2D点对应的点对,计算相机位姿、或者物体位姿,二者是等价的。

有个通俗,但很有用的解释:

以下讨论中设相机位于点Oc,P1、P2、P3……为特征点。

Case1:当N=1时

当只有一个特征点P1,我们假设它就在图像的正中央,那么显然向量OcP1就是相机坐标系中的Z轴,此事相机永远是面对P1,于是相机可能的位置就是在以P1为球心的球面上,再一个就是球的半径也无法确定,于是有无数个解。

Case2:当N=2时

现在多了一个约束条件,显然OcP1P2形成一个三角形,由于P1、P2两点位置确定,三角形的变P1P2确定,再加上向量OcP1,OcP2从Oc点射线特征点的方向角也能确定,于是能够计算出OcP1的长度=r1,OcP2的长度=r2。于是这种情况下得到两个球:以P1为球心,半径为r1的球A;以P2为球心,半径为r2的球B。显然,相机位于球A,球B的相交处,依旧是无数个解。

Case3:当N=3时

与上述相似,这次又多了一个以P3为球心的球C,相机这次位于ABC三个球面的相交处,终于不再是无数个解了,这次应该会有4个解,其中一个就是我们需要的真解了。

Case4:当N大于3时

N=3时求出4组解,好像再加一个点就能解决这个问题了,事实上也几乎如此。说几乎是因为还有其他一些特殊情况,这些特殊情况就不再讨论了。N>3后,能够求出正解了,但为了一个正解就又要多加一个球D显然不够"环保",为了更快更节省计算机资源地解决问题,先用3个点计算出4组解获得四个旋转矩阵、平移矩阵。根据公式:

将第四个点的世界坐标代入公式,获得其在图像中的四个投影(一个解对应一个投影),取出其中投影误差最小的那个解,就是我们所需要的正解。

不同算法的差别在于求解方式,如迭代逼近,还是牛顿优化,还是参考点验证等。

   基于视觉的姿态估计根据使用的摄像机数目分为单目视觉和多目视觉。根据算法又可以分为基于模型的姿态估计和基于学习的姿态估计。这里主要指n点对位姿计算算法,因此,单目,且基于针孔畸变模型。

   OpenCV中有solvePnP以及solvePnPRansac用来实现已知平面四点坐标确定摄像头相对世界坐标系的平移和旋转。cvPOSIT基于正交投影,用仿射投影模型近似透视投影模型,不断迭代计算出估计值。此算法在物体深度相对于物体到相机的距离比较大的时候,算法可能不收敛。

    从世界坐标系到相机坐标系的转换,需要矩阵[R|t],其中R是旋转矩阵,t是位移向量。如果世界坐标系为X,相机坐标系对应坐标为X‘,那么X' = [R|t]*X。从相机坐标系到理想屏幕坐标系的变换就需要内参数矩阵C。那么理想屏幕坐标系L = C*[R|t]*X。如何获得[R|t],大致是已知模板上的几个关键点在世界坐标系的坐标即X已知,然后在摄像头捕获的帧里获得模板上对应点在屏幕坐标系的坐标即L已知,通过求解线性方程组得到[R|t]的初值,再利用非线性最小二乘法迭代求得最优变换矩阵[R|t],这属于最一般的迭代法计算。

   相机姿态估计的问题就是寻找相机的外参数,即是最小化误差函数的问题。误差函数有的基于image-space,有的基于object-space(P3P,AP3P,EPnP等就是基于物体空间的)。

   RPP算法基于object-space为误差函数提供了一种可视化的方法。误差函数有两个局部极小值。在无噪声条件下,第一个局部极小值跟正确的姿态对应。另外的误差函数的极小值就是标准姿态估计算法为什么会抖动的原因。由于姿态估计算法最小化误差函数总是要使用迭代算法,因此需要一个初值。如果初值接近第二个局部极小值,那么迭代算法就收敛到错误的结果,后面详细介绍,估计第一个姿态,RPP算法使用任何已知的姿态估计算法,在这里里,使用迭代算法。从第一个姿态使用P3P算法估计第二个姿态。这个姿态跟误差函数的第二个局部极小值接近。使用估算的第二个姿态作为初值,使用迭代算法获得第二个姿态。最终正确的姿态是有最小误差的那个。

   这类问题最终都是解线性方程组AX=b的问题。当b∈R(A)时,x=A的广义逆*b;当b∈不R(A)时,能否是Ax接近b呢,即是否有x使||Ax-b||最小,习惯上用2-范数即欧式范数来度量。最小二乘解常存在,然后这样的解未必是唯一的。当在方程无解的情况下,要找到最优解。就是要最小化所有误差的平方和,要找拥有最小平方和的解,即最小二乘。最小化就是把误差向量的长度最小化。

    PnP问题解决了已知世界参考系下地图点以及相机参考系下投影点位置时3D-2D相机位姿估计问题,不需要使用对极约束(存在初始化,纯旋转和尺度问题,且一般需要8对点),可以在较少的匹配点(最少3对点,P3P方法)中获得较好的运动估计,是最重要的一种姿态估计方法。最后,如果知道世界参考系下的地图点,同时知道相机参考系下的地图点,可以通过ICP的方法去求解姿态。这样就构成了立体视觉中最重要的对极几何,PnP和ICP三种最常用的姿态估计方法。


求解PnP问题目前主要有直接线性变换DLT,P3P/AP3P,EPnP,UPnP以及非线性优化方法,还有SDP,NPL等,不常见,忽略。

DLT

直接构建一个12个未知数的[R|t]增广矩阵(先不考虑旋转矩阵的自由度只有3),取六个点对,去求解12个未知数(每一个3D点到归一化平面的映射给出两个约束),最后将[R|t]左侧3*3矩阵块进行QR分解,用一个旋转矩阵去近似(将3*3矩阵空间投影到SE(3)流形上)。

P3P

P3P方法是通过3对3D/2D匹配点,求解出四种可能的姿态,在OpenCV calib3d模块中有实现,但是对于相机远离3D平面(low parallax)或者视角垂直于3D平面的情况下效果不佳,不知道最近有没有更新过。论文Complete Solution Classification for the Perspective-Three-Point Problem中提到了一种改进的方法,可以消除这种退化的情况。

将世界坐标系下的ABC三点和图像坐标系下的abc三点匹配,其中AB,BC,AC的长度已知,<a,b>,<b,c>,<a,c>也是已知,通过余弦定理可以求出A,B,C在相机参考系中的坐标,然后使用类似ICP的坐标系对齐,就可以求得当前相机薇姿。

通过余弦定理构建二元二次方程组【2】可以求解出OA,OB,OC之间的长度比例,从而确定世界坐标系下的相机位姿。可以想象一下为什么会出现四个解,在空间中的位置是什么样的,以及为什么在远离3D点平面或者视角垂直3D点平面时,会出现退化情况。

EPnP

需要4对不共面的(对于共面的情况只需要3对)3D-2D匹配点,是目前最有效的PnP求解方法。

The aim of the Perspective-n-Point problem—PnP in short—is to determine the position and orientation of a camera given its intrinsic parameters and a set of n correspondences between 3D points and their 2D projections. It has many applications in Computer Vision, Robotics, Augmented Re- ality and has receivedmuch attention in both the Photogrammetry and Computer Vision communities. In particular, applications such as feature point-based camera tracking require dealing with hundreds of noisy feature points in real-time, which requires computationally efficient methods.

空间中任意3D点的坐标可以用4个不共面的3D点坐标的权重表示

通常选取世界坐标下的四个控制点坐标为Cw=[0,0,0,1]T, [1,0,0,1]T,[0,1,0,1]T,[0,0,1,1]T;通过n个3D点在相机平面的投影关系,以及与这四个控制点的权重关系,构建一个12*12方阵,求得其零空间特征向量,可以得到虚拟控制点的相机平面坐标,然后使用POSIT算法即可求出相机位姿。

通常在用EPnP求得四对点下的封闭解后,可以将该解作为非线性优化的初值,优化提高精度

本文章已经生成可运行项目
<think>嗯,用户想了解姿态估计的实现方法和算法介绍。首先,我需要回顾姿态估计的基本概念,然后分清楚不同的方法类别。根据用户提供的引用[1],姿态估计算法大致分为两类:基于2D标定信息和3D模型的优化方法,以及数据驱动的回归方法。 首先,基于2D到3D的方法,比如SolvePnP,需要先检测人脸的关键点,比如使用深度学习模型如Dlib或MTCNN。然后,这些2D关键点与预定义的3D模型进行匹配,通过优化算法计算旋转和平移矩阵。这部分可能需要解释PnP问题的原理,以及如何利用OpenCV中的函数来实现。 然后是数据驱动的方法,比如使用卷积神经网络直接回归欧拉角或旋转矩阵。这种方法需要大量的标注数据,可能涉及到不同的网络结构,如简单的CNN或更复杂的架构。需要提到些具体的例子,比如DeepHeadPose或Hopenet,以及它们的效果。 接下来,实现步骤部分需要详细说明两种方法的流程,包括关键点检测、模型匹配、优化求解,以及数据准备、模型训练和预测。可能需要给出些代码示例,比如使用OpenCV的SolvePnP或者PyTorch构建回归模型。 用户可能还关心如何评估姿态估计的准确性,比如平均误差或成功率的指标。此外,应用场景如虚拟现实、驾驶员监控系统也是重要的点。 最后,生成相关问题时,要考虑用户可能想深入的方向,比如关键点检测算法、SolvePnP的具体原理、数据驱动的优缺点、3D模型构建方法,以及实际应用中的挑战。确保问题覆盖了用户可能感兴趣的各个方面,帮助他们进步探索。</think>### 姿态估计算法实现方法 姿态估计(Pose Estimation)的目标是通过图像或视频数据推断目标物体或人体的空间姿态(旋转角、平移向量等)。以下是两类主流方法及实现步骤: --- #### 、基于2D标定与3D模型的优化方法 **核心思想**:利用2D关键点与预定义3D模型的对应关系,通过几何优化求解姿态参数。 **步骤**: 1. **关键点检测**: 使用深度学习模型(如Dlib、MTCNN、HRNet等)检测人脸/物体的2D关键点。例如,人脸姿态估计需检测眼睛、鼻尖、嘴角等特征点。 2. **3D模型匹配**: 定义与目标物体匹配的3D参考模型(如平均人脸模型)。例如,标准3D人脸模型可能包含鼻尖坐标为$(0,0,0)$,两眼间距为$d$等。 3. **求解位姿变换**: 通过**Perspective-n-Point (PnP)** 算法求解旋转矩阵$R$和平移向量$t$,最小化重投影误差: $$ \min_{R,t} \sum_{i} \| \text{Proj}(R \cdot P_i + t) - p_i \|^2 $$ 其中$P_i$为3D模型点,$p_i$为对应的2D图像点,`Proj`为相机投影函数。OpenCV中可直接调用`cv2.solvePnP`实现[^1]。 **代码示例**: ```python import cv2 # 假设已知3D模型点、2D图像点和相机内参矩阵K success, rvec, tvec = cv2.solvePnP( object_points_3d, image_points_2d, K, None ) # 将旋转向量转换为欧拉角 rotation_matrix, _ = cv2.Rodrigues(rvec) ``` --- #### 二、数据驱动的回归方法 **核心思想**:直接通过深度学习模型从输入图像回归姿态参数(如欧拉角、四元数)。 **实现步骤**: 1. **数据准备**: 收集带有姿态标签(如yaw, pitch, roll角度)的数据集(如AFLW、BIWI)。 2. **模型设计**: 构建卷积神经网络(CNN),输出层为姿态参数。例如: - **DeepHeadPose**:使用ResNet主干网络,输出3个欧拉角 - **Hopenet**:结合分类与回归,提升角度预测鲁棒性 3. **训练与预测**: 损失函数通常采用均方误差(MSE)或几何感知损失。 **代码框架**: ```python import torch import torch.nn as nn class PoseRegression(nn.Module): def __init__(self): super().__init__() self.backbone = torch.hub.load('pytorch/vision', 'resnet18', pretrained=True) self.fc = nn.Linear(1000, 3) # 输出yaw, pitch, roll def forward(self, x): features = self.backbone(x) angles = self.fc(features) return angles ``` --- #### 三、评估与应用场景 - **评估指标**:平均角度误差(MAE)、成功率(预测角度与真值差小于阈值) - **典型应用**: 1. 虚拟现实(VR)中的头部姿态跟踪 2. 驾驶员注意力监测(如检测头部偏转角度) 3. 机器人的物体抓取姿态估计 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值