PnP解算及SolvePnp用法

这篇具有很好参考价值的文章主要介绍了PnP解算及SolvePnp用法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 PnP解算

PnP问题:Perspective-n-Point问题。
参考下图,
opencv pnp,人工智能,opencv
给定n个3D空间参考点,以及各点在相机图像上对应的成像点,求参考点所在坐标系与相机的空间关系。
即:
已知条件1:给定匹配点对:世界坐标系(图中OwXwYwZw)下的n个3D点坐标及其对应在图像坐标系(图中ouv)下的2D点坐标。
已知条件2:相机的内参。
求:世界坐标系OwXwYwZw与相机坐标系OcXcYcZc之间的位姿变换关系。
PnP问题的用途:相机位姿获取,物体位姿测量,AR/VR,机器人操作,SLAM中位姿初值求解……
常用解法:DLT,P3P,EPnP,UPnP。

2 OpenCV的solvePnP

2.1 函数原型定义

OpenCV提供了PnP问题的解算函数,且包含有多种解法。
有以下两个函数。

1) solvePnP

bool solvePnP( InputArray objectPoints, InputArray imagePoints,
                            InputArray cameraMatrix, InputArray distCoeffs,
                            OutputArray rvec, OutputArray tvec,
                            bool useExtrinsicGuess = false, int flags = SOLVEPNP_ITERATIVE );

作用:根据3D-2D点对应关系,获得物体的位姿。
此函数返回旋转和平移向量,可用来将物体坐标系中的3D点变换到相机坐标系下。

2) solvePnPRansac

bool solvePnPRansac( InputArray objectPoints, InputArray imagePoints,
                                  InputArray cameraMatrix, InputArray distCoeffs,
                                  OutputArray rvec, OutputArray tvec,
                                  bool useExtrinsicGuess = false, int iterationsCount = 100,
                                  float reprojectionError = 8.0, double confidence = 0.99,
                                  OutputArray inliers = noArray(), int flags = SOLVEPNP_ITERATIVE );

与solvePnP功能相同,但这个函数使用RANSAC算法剔除异常样本。
RANSAC:Random Sample Consensus(随机抽样一致)。它是根据一组包含异常数据的样本数据集,计算出数据的数学模型参数,得到有效样本数据的算法。它于1981年由Fischler和Bolles最先提出。
因此RANSAC使得PnP函数能够抵抗异常值。

2.2 函数参数

参数:
objectPoints:世界坐标系(上图中OwXwYwZw)下的3D点坐标数组
imagePoints:图像(上图中ouv)中对应3D点的成像点坐标数组
cameraMatrix:相机内参矩阵,3×3
distCoeffs:相机畸变系数数组,可以为NULL,此时视为无畸变。
rvec和tvec:计算结果输出,rvec为旋转向量,tvec为平移向量,两者合并表达的是物体整体(即世界坐标系)在相机坐标系中的位姿

以下参数为可选:
useExtrinsicGuess,这个参数仅用于flags=SOLVEPNP_ITERATIVE,此值如果为true (1),需要rvec和tvec有输入值,以便函数把输入值作为旋转和平移的估计初始值.
flags:PnP解算方法,详见下节。

solvePnPRansac需要的可选参数
iterationsCount:迭代次数;
reprojectionError:RANSAC使用的内点阈值,即考虑作为内点的观察点与计算点投影之间的最大允许距离
confidence:算法得到有用结果的概率;
inliers:包含 objectPoints 和 imagePoints 中的内点索引的输出向量 .

2.3 PnP解算方法(flags取值)

  1. SOLVEPNP_ITERATIVE:缺省方法,基于 Levenberg-Marquardt 优化的迭代方法,使重投影误差最小化
  2. SOLVEPNP_P3P:方法基于论文 X.S. Gao, X.-R. Hou, J. Tang, H.-F. Chang “Complete Solution Classification for the Perspective-Three-Point Problem”
  3. SOLVEPNP_AP3P:方法基于论文 T. Ke, S. Roumeliotis "An Efficient Algebraic Solution to the Perspective-Three-Point Problem
  4. SOLVEPNP_EPNP:方法基于论文 F. Moreno-Noguer, V. Lepetit and P. Fua “EPnP: Efficient Perspective-n-Point Camera Pose Estimation”
  5. SOLVEPNP_DLS:方法基于论文 J. Hesch and S. Roumeliotis. “A Direct Least-Squares (DLS) Method for PnP”
  6. SOLVEPNP_UPNP:方法基于论文 A. Penate-Sanchez, J. Andrade-Cetto, F. Moreno-Noguer. “Exhaustive Linearization for Robust Camera Pose and Focal Length Estimation”
  7. SOLVEPNP_IPPE:方法基于论文 T. Collins and A. Bartoli. “Infinitesimal Plane-Based Pose Estimation”
  8. SOLVEPNP_IPPE_SQUARE:方法基于论文 Toby Collins and Adrien Bartoli. “Infinitesimal Plane-Based Pose Estimation”
  9. SOLVEPNP_SQPNP:方法基于论文 “A Consistently Fast and Globally Optimal Solution to the Perspective-n-Point Problem” by G. Terzakis and M.Lourakis

2.4 solvePnp的点对

一般来说,解算PnP,最少需要4个物体点与其成像点构成的点对,几个特例如下:

  1. 当SOLVEPNP_ITERATIVE并且useExtrinsicGuess=true时(rvec和tvec有初值),所需的点数最小可以为3;
  2. P3P methods (SOLVEPNP_P3P, SOLVEPNP_AP3P): 需且仅需4个输入点来获得唯一解;
  3. SOLVEPNP_IPPE:输入点数必须 >= 4,并且所有物体点必须共面;
  4. SOLVEPNP_IPPE_SQUARE:对点的顺序有规定,具体这里略;
    除了这几个外,其它方法(flags)要求点的数量必须 >= 4 ,对物体点位置顺序等没有特殊规定。

3 solvePnP使用

使用solvePnP前,需要已具备如下参数:

vector<Point3f>objPts;	//3D点数组,世界坐标系物体点坐标,至少4个点
vector<Point2f>imgPts;	//2D点数组,与以上物体点一一对应的图像点坐标
Mat cameraMatrix;	//相机内参矩阵,3x3矩阵
Mat distCoeff;	//相机畸变系数矩阵,我一般是用1x5矩阵,如果相机没有畸变,可以把所有元素置为0

然后调用

Mat rvec, tvec;	//声明用于接收运算结果的两个矢量
solvePnP(objPts, imgPts, cameraMatrix, distCoeff, rvec, tvec);

得到解算结果后,rvec为旋转矢量形式,后续计算不方便,所以一般会用Rodrigues公式转为旋转矩阵,以下直接将rvec和tvec一起转为位姿矩阵

Mat wldInCam = Mat::zeros(4, 4, CV_64FC1);
Rodrigues(rvec, wldInCam(Rect(0, 0, 3, 3)));
tvec.copyTo(wldInCam(Rect(3, 0, 1, 3)));

以上得到的wldInCam即为世界坐标系在相机坐标系中的位姿,如果需要求相机在世界坐标系中的位姿,可取逆即可:

Mat camInWld = wldInCam.inv();

参考

[PnP] PnP问题之DLT解法文章来源地址https://www.toymoban.com/news/detail-779499.html

到了这里,关于PnP解算及SolvePnp用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • pnp单目相机标定测距

    参考:opencv 单目相机pnp测距(Cpp)-CSDN博客

    2024年02月08日
    浏览(35)
  • PnP算法详解(超详细公式推导)

    博主缺粉丝希望大家能给个关注!!! PnP(Perspective-n-Point)是求解3D到2D点的对应方法。它描述了当知道n个3D空间点及其位置,如何估计相机的位姿。如果两张图像中的一张特征点3D位置已知,那么至少需要3个点对(以及至少一个额外验证点验证结果)就可以计算相机的运动。 P

    2024年02月03日
    浏览(37)
  • PNP结算方法(后面可能有空再补充了)

    一些pnp的实验结论: (1)yaw角稳定性上: 在opencv中, SOLVEPNP_UPNP=SOLVEPNP_EPNP=SOLVEPNP_DLSSOLVEPNP_IPPESOLVEPNP_AP3PSOLVEPNP_ITERATIVE 固定一个识别物体检查结算的yaw角 在这张图中l1是ippe,l2是AP3P,l3,l4分别是UPNP,EPNP,两者基本重叠 第二张图l1,l2,l3,l4分别是IPPE,DLS,UPNP,EPNP,后三者基本

    2024年02月12日
    浏览(58)
  • pnp4nagios 配置 nagios

    /root/software/pnp4nagios-0.6.26/sample-config/nagios.cfg-sample.in /root/software/pnp4nagios-0.6.26/sample-config/misccommands.cfg-sample.in /root/software/pnp4nagios-0.6.26/sample-config/nagios.cfg-sample /root/software/pnp4nagios-0.6.26/sample-config/misccommands.cfg-sample /root/software/pnp4nagios-0.6.26/sample-config/pnp/rra.cfg-sample /root/software/p

    2024年01月25日
    浏览(28)
  • PnP and Perspective Projection and Pose Computation

    Review PnP problem from a computer graphics rendering view 首先从一个 StackExchange 问题出发,下面是本人的回答摘录。 What is the difference between Intrinsic Matrix( K ) and Perspective Projection Matrix(call it P Matrix later)? For K Matrix it transform 3D points to 2D pixels in image space. And during this procedure only x and y value

    2024年02月13日
    浏览(39)
  • Smoothieware_best-for-pnp 工具链的升级尝试

    正在迁移Smoothieware_best-for-pnp到MCUXPresso的失败实验中徘徊. 现在已知2者的工具链版本是不一样的. 通过2进制比对, 知道2家用的都是公版的gcc for arm的版本. MCUXPresso 是10.3, NXP家并没有改gcc, 是公版的实现. gcc-arm-none-eabi-10.3-2021.10-win32.zip Smoothieware_best-for-pnp 是4.8, 也是公版的实现

    2024年02月05日
    浏览(39)
  • 2D-3D匹配问题的PnP算法对比:DLT,P3P,EPnP

    首先需要清楚什么叫做PnP(Perspective-n-Point)呢?是为了解决什么问题? 已知信息: n个3D点在A坐标系(可以认为是世界坐标系)的坐标 { p 1 , p 2 , . . . , p n } {p_1, p_2, ..., p_n} { p 1 ​ , p 2 ​ , . . . , p n ​ } ,以及这些3D点投影在图像上的2D点在图像坐标系的坐标 { u 1 , u 2 , . . . , u

    2023年04月14日
    浏览(45)
  • 实验:如何在YOLO8中添加PnP算法来实现Head Pose Estimation

    YOLO8的集成度比较高,如何在简洁的代码中加入Head Pose的东西,不是一件简单的事情.这里介绍如何插入PnP算法实现头部姿态估计的代码? 修改predict中的模型,改为我们自己训练的YOLOLandmark模型. 修改cfg入口,由于我们修改来config中不少超参数,因此我们干脆修改来为fi

    2024年02月16日
    浏览(41)
  • 人工智能基础_机器学习003_有监督机器学习_sklearn中线性方程和正规方程的计算_使用sklearn解算八元一次方程---人工智能工作笔记0042

    然后我们再来看看,如何使用sklearn,来进行正规方程的运算,当然这里 首先要安装sklearn,这里如何安装sklearn就不说了,自己查一下 首先我们还是来计算前面的八元一次方程的解,但是这次我们不用np.linalg.solve这个 解线性方程的方式,也不用 直接 解正规方程的方式: 也就是上面这种

    2024年02月08日
    浏览(52)
  • 【视觉SLAM入门】5.2. 2D-3D PNP 3D-3D ICP BA非线性优化方法 数学方法SVD DLT

    前置事项: 该问题描述为:当我们知道n 个 3D 空间点以及它们的投影位置时,如何估计相机所在的位姿 1.1.1 DLT(直接线性变换法) 解决的问题:已知空间点 P = ( X , Y , Z , 1 ) T P = (X, Y, Z, 1)^T P = ( X , Y , Z , 1 ) T 和它投影点 x 1 = ( u 1 , v 1 , 1 ) T x_1 = (u_1, v_1, 1)^T x 1 ​ = ( u 1 ​ , v 1

    2024年02月12日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包