博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
solvepnp三维位姿估算
阅读量:2384 次
发布时间:2019-05-10

本文共 1131 字,大约阅读时间需要 3 分钟。

一、前言

关于PNP问题就是指通过世界中的N个特征点与图像成像中的N个像点,计算出其投影关系,从而获得相机或物体位姿的问题。

opencv提供的solvepnp函数就是用来解决pnp问题。利用该函数可以实现测算相机/物体的空间姿态,也可以用来空间定位。

二、solvepnp函数解析

solvepnp函数原型

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

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

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

cameraMatrix:相机内参矩阵

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

rvec:输出的旋转向量

tvec:输出的平移矩阵

函数分析

solvepnp通过2D点和3D点求解相机的位姿(R,t),在opencv3中常用的方法是epnp, DLS,迭代法。如果3D点分布在一个平面上,那么通过点对(3D点2D点)算出单应矩阵。然后进行SVD分解。如果平面,可直接使用SVD分解。在opencv2中,没有DLS方法。

三、旋转向量转换旋转矩阵

应用罗德里格斯变换

double rm[9];

cv::Mat rotM(3, 3, CV_64FC1, rm);

Rodrigues(rvec, rotM);

四、由旋转矩阵求得姿态角

代码:

float theta_z = atan2(rotMat[1][0], rotMat[0][0])*57.2958;

float theta_y = atan2(-rotMat[2][0], sqrt(rotMat[2][0] * rotMat[2][0] + rotMat[2][2] * rotMat[2][2]))*57.2958;

float theta_x = atan2(rotMat[2][1], rotMat[2][2])*57.2958;

理论:

以下图片内容转载自VShawn

最后得到的三个旋转角度都是相对于世界坐标系的旋转角度。

你可能感兴趣的文章
代理服务器中的HTTP代理与SOCKS代理有什么区别?
查看>>
零基础Python学习路线,小白的进阶之路!
查看>>
CSS的23个垂直居中技巧,你都学会了吗?
查看>>
黑客攻击用的最短代码大揭秘,颠覆你的世界观!
查看>>
零基础的自学前端之路,当年的入坑之旅
查看>>
新手程序员?教你解决办法!基础都掌握了,动手敲代码就一脸懵逼
查看>>
程序员快速进阶学习到底要看书还是要看视频?
查看>>
web游戏框架哪家强?国内外精选优质框架分析及注意事项
查看>>
各行业都爱用什么编程语言开发?
查看>>
css3实现ps蒙版效果以及动画,炫酷吊炸天!
查看>>
程序员休息时间接私活遭公司辞退,不明觉厉?
查看>>
CSS 、JS实现浪漫流星雨动画
查看>>
花4万学代码,工资却只有5千,这个程序员做的..
查看>>
新手网站建设指南(2)
查看>>
新手网站建设优化,这些网站为你提供数之不尽的免费素材!(3)
查看>>
HTML特殊字符显示(常用到的特殊符号,箭头相关,数学相关,标点,符号相关等)...
查看>>
40岁的程序员找不到工作,原来码农真的是碗青春饭
查看>>
2018年前端性能优化总结,这也是我做程序员的第五个年头了
查看>>
前端进阶(三)从0到1学AJAX,这篇就够了!
查看>>
强大的CSS:实现平行四边形布局效果
查看>>