一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达

简介: 一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达

1 pnp算法概念和原理介绍

1.1 pnp算法的概念

下面几种说法都是对pnp算法要做的事情的描述,大家自己体会一下

1、PnPPerspective-n-Point)是求解 3D 到 2D 点对运动的方法。它描述了当我们知道n 个 3D 空间点以及它们的投影位置时,如何估计相机所在的位姿。——《视觉SLAM十四讲》(参考

2、通俗的讲,PnP问题就是在已知世界坐标系N个空间点的真实坐标以及这些空间点图像上的投影,如何计算相机所在的位姿。罗嗦一句:已知量是空间点的真实坐标和图像坐标,未知量(求解量)是相机的位姿。

3、PnP是用来求解3D-2D点对运动的方法参考

4、PnP问题就是指通过世界中的N个特征点图像成像中的N个像点,计算出其投影关系,从而获得相机或物体位姿的问题(参考

1.2 pnp算法的概念总结

下面我在来简单总结一下我个人的理解(参考):
image.png

使用Perspective-n-Point (PnP)算法需要知道的已知量和需要求解的未知量

1.2.1 PnP需要知道的已知量

1、需要知道n个世界坐标系下参考点的3D坐标系:$\left{c_1, c_2, c_3, ..., c_n\right}$

2、同时知道这个n个3D坐标对应相机图像坐标系上的2D投影点:$\left{u_1, u_2, u_3, ..., u_n\right}$

注意:

  • 世界坐标系下的3D点和相机坐标系下投影的2D点是一一对应的
  • 相机图像坐标系,并不是相机坐标系相机像素坐标系,注意区分

下图是四大坐标系:

image.png

3、已知相机摄像头的内参(需要自己提前标注好),相机的摄像头内参包括两部分;

  • 相机的内参矩阵
  • 相机畸变系数

内参矩阵:

$$ \text { camera matrix }=\left[\begin{array}{ccc} f_{x} & 0 & c_{x} \\ 0 & f_{y} & c_{y} \\ 0 & 0 & 1 \end{array}\right] $$

焦距$(f_x, f_y)$和光学中心$(c_x, c_y)$

畸变系数:

  • $k_1、k_2、k_3$:是径向畸变
  • $p_1、p_2$:是切向畸变

1.2.2 PnP需要求的未知量

世界坐标系摄像机坐标系之间的位姿变换 :$\left{R|t\right}$

  • R:是旋转矩阵,可以理解为绕x、y、z三个坐标轴方向的旋转
  • t:是平移,可以理解为沿x、y、z三个方向上的平移

所以从一个坐标系变换到另外一个坐标系位姿变换的自由度就是6,三个方向上的旋转和三个方向上的平移。(参考

1.3 PnP算法的用处

从上面可以知道PnP就是计算出两个坐标系之间的位姿变换的:$\left{R|t\right}$

因此PnP用途也很多:

  • 相机位姿跟踪
  • 物体位姿跟踪
  • AR/VR、
  • 机器人操作
  • SLAM中位姿初值求解
  • 相机标定,相机和激光雷达联合标定等

2 PnP的常见解法

PnP的常用解法也有很多:DLT,P3P,EPnP,UPnP

2.1 PnP解法之DLT

2.2 PnP解法之P3P

上面的文章中还介绍了很多其他的解法

2.3 PnP解法之EPnP

PnP问题是研究如何从3D-2D匹配对中求解摄像头位姿,EPnP算法是一种非迭代的PnP算法

3 opencv中solvePn()函数的介绍与使用

3.1 opencv中solvePnP函数的定义

1、在opencv中的slovePnP函数的定义
image.png

3.2 solvePnP()中参数含义:

3.2.1 solvePnP()中的参数

1、下面是solvePnP()函数参数含义解释(参考):

image.png

  • objectPoints:特征点的世界坐标,坐标值需为float型,不能为double型,可以为mat类型,也可以直接输入vector

  • imagePoints:特征点在图像中的像素坐标,可以输入mat类型,也可以直接输入vector,注意输入点的顺序要与前面的特征点的世界坐标一一对应

  • cameraMatrix相机内参矩阵

  • distCoeffs:相机的畸变参数【Mat_(5, 1)】

  • rvec:输出的旋转向量

  • tvec:输出的平移向量

  • useExtrinsicGuess: 用于SOLVEPNP迭代的参数。如果为true(1),函数使用提供的rvectvec值分别作为旋转平移向量的初始近似,并进一步优化它们。默认值为False

  • flags:PnP的计算方法

3.2.2 sovlePnP()中flags参数对应的PnP计算方法

flags取值对应的是PnP的计算方法,flags的参数选择(参考):

enum {
   
    SOLVEPNP_ITERATIVE = 0,
       SOLVEPNP_EPNP      = 1, //!< EPnP: Efficient Perspective-n-Point Camera Pose Estimation @cite lepetit2009epnp
       SOLVEPNP_P3P       = 2, //!< Complete Solution Classification for the Perspective-Three-Point Problem 
       SOLVEPNP_DLS       = 3, //!< A Direct Least-Squares (DLS) Method for PnP  @cite hesch2011direct
       SOLVEPNP_UPNP      = 4, //!< Exhaustive Linearization for Robust Camera Pose and Focal Length Estimation 
       SOLVEPNP_AP3P      = 5, //!< An Efficient Algebraic Solution to the Perspective-Three-Point Problem 
       SOLVEPNP_MAX_COUNT      //!< Used for count
};

1、cv2.SOLVEPNP_ITERATIVE=0

SOLVEPNP_ITERATIVE迭代方法是基于Levenberg-Marquardt优化。 在这种情况下,函数会找到一个使重新投影误差最小的位姿(pose),该位姿是观察到的投影imagePoints与使用projectPoints将objectPoints投影的点之间的平方距离的总和(参考)。

Levenberg-Marquardt法(LM法)是一种非线性优化方法。LM算法用于解决非线性最小二乘问题,多用于曲线拟合等场合

2、cv2.SOLVEPNP_EPNP=1

3、cv2.SOLVEPNP_P3P=2

4、cv2.SOLVEPNP_DLS=3

5、cv2.SOLVEPNP_UPNP=4

6、cv2.SOLVEPNP_AP3P=5

3.3 如何获取世界坐标和图像坐标

3.4 如何标定相机的内参(内参矩阵和畸变系数)

3.5 solvePnP()的实际使用实例

参考https://blog.csdn.net/lyhbkz/article/details/90246356
参考https://blog.csdn.net/shenxiaolu1984/article/details/50165635

3.5.1 使用solvePnP()标定相机和2D lidar激光雷达

camera_2d_lidar_calibration

cv2.solvePnP(objp, imgp, K, D, flags=cv2.SOLVEPNP_ITERATIVE)使用LM优化迭代算法介绍

  • flags=cv2.SOLVEPNP_ITERATIVE

3、epnp相关源码:


image.png

重投影误差公式:

$$reprojection\_error =\frac {1}{n} \sum_{i}^{n} \sqrt{(u-ue)^2+(v-ve)^2}$$

其中:
$$n = number\_of\_correspondences$$

目录
相关文章
|
6天前
|
数据处理 Python
Python 高级技巧:深入解析读取 Excel 文件的多种方法
在数据分析中,从 Excel 文件读取数据是常见需求。本文介绍了使用 Python 的三个库:`pandas`、`openpyxl` 和 `xlrd` 来高效处理 Excel 文件的方法。`pandas` 提供了简洁的接口,而 `openpyxl` 和 `xlrd` 则针对不同版本的 Excel 文件格式提供了详细的数据读取和处理功能。此外,还介绍了如何处理复杂格式(如合并单元格)和进行性能优化(如分块读取)。通过这些技巧,可以轻松应对各种 Excel 数据处理任务。
34 16
|
1天前
|
存储 索引 Python
反转Python列表的4种方法
反转Python列表的4种方法
|
2天前
|
Python
深入解析 Python 中的对象创建与初始化:__new__ 与 __init__ 方法
深入解析 Python 中的对象创建与初始化:__new__ 与 __init__ 方法
8 1
|
2天前
|
Python
深入理解Python中的类方法、类实例方法和静态方法
深入理解Python中的类方法、类实例方法和静态方法
6 0
|
4天前
|
机器学习/深度学习 开发者 Python
Python中进行特征重要性分析的9个常用方法
在Python机器学习中,特征重要性分析是理解模型预测关键因素的重要步骤。本文介绍了九种常用方法:排列重要性、内置特征重要性(如`coef_`)、逐项删除法、相关性分析、递归特征消除(RFE)、LASSO回归、SHAP值、部分依赖图和互信息。这些方法适用于不同类型模型和场景,帮助识别关键特征,指导特征选择与模型解释。通过综合应用这些技术,可以提高模型的透明度和预测性能。
27 0
|
12天前
|
机器学习/深度学习 PyTorch TensorFlow
Python实现深度学习学习率指数衰减的方法与参数介绍
学习率指数衰减提供了一种高效的动态调整学习率的手段,帮助模型在不同训练阶段以不同的学习速度优化,有利于提升模型性能和训练效率。通过合理设置衰减策略中的参数,可以有效地控制学习率的衰减过程,实现更加精确的模型训练调优。
13 0
|
12天前
|
UED Python
Python requests库下载文件时展示进度条的实现方法
以上就是使用Python `requests`库下载文件时展示进度条的一种实现方法,它不仅简洁易懂,而且在实际应用中非常实用。
27 0
|
3天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于GA遗传优化的GroupCNN分组卷积网络时间序列预测算法matlab仿真
该算法结合了遗传算法(GA)与分组卷积神经网络(GroupCNN),利用GA优化GroupCNN的网络结构和超参数,提升时间序列预测精度与效率。遗传算法通过模拟自然选择过程中的选择、交叉和变异操作寻找最优解;分组卷积则有效减少了计算成本和参数数量。本项目使用MATLAB2022A实现,并提供完整代码及视频教程。注意:展示图含水印,完整程序运行无水印。
|
1天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于MSER和HOG特征提取的SVM交通标志检测和识别算法matlab仿真
### 算法简介 1. **算法运行效果图预览**:展示算法效果,完整程序运行后无水印。 2. **算法运行软件版本**:Matlab 2017b。 3. **部分核心程序**:完整版代码包含中文注释及操作步骤视频。 4. **算法理论概述**: - **MSER**:用于检测显著区域,提取图像中稳定区域,适用于光照变化下的交通标志检测。 - **HOG特征提取**:通过计算图像小区域的梯度直方图捕捉局部纹理信息,用于物体检测。 - **SVM**:寻找最大化间隔的超平面以分类样本。 整个算法流程图见下图。
|
2天前
|
算法 决策智能
基于禁忌搜索算法的VRP问题求解matlab仿真,带GUI界面,可设置参数
该程序基于禁忌搜索算法求解车辆路径问题(VRP),使用MATLAB2022a版本实现,并带有GUI界面。用户可通过界面设置参数并查看结果。禁忌搜索算法通过迭代改进当前解,并利用记忆机制避免陷入局部最优。程序包含初始化、定义邻域结构、设置禁忌列表等步骤,最终输出最优路径和相关数据图表。