solvepnp详解
来源:互联网 发布:vb语言基本代码 编辑:程序博客网 时间:2024/06/12 23:44
转载自:http://blog.csdn.net/aptx704610875/article/details/48915149
注意点1:solvePnP里有三种解法:P3P, EPnP,迭代法(默认);opencv2里参数分别为CV_P3P,CV_EPNP,CV_ITERATIVE (opencv3里多了DLS和UPnP解法)。
注意点2:solvePnP需要至少3组点:P3P只使用4组点,3组求出多个解,第四组确定最优解;EPnP使用大于等于3组点;迭代法调用cvFindExtrinsicCameraParams2,进而使用SVD分解并调用cvFindHomography,而cvFindHomography需要至少4组点。
接下来我们使用OpenCV实现相机姿态更新:
上一节得到的相机内参和相机畸变:
首先检测ORB角点并亚像素化:
使用鼠标选定4个2D点(按正方形左上顶点开始顺时针),然后查找所选点附近的角点,若找到则压入跟踪点集合:建立与2D跟踪点集合相对应的3D空间点集合:使用LK光流法跟踪已选定角点:若4个点均跟踪成功,使用solvePnP计算相机姿态,并使用计算出的相机姿态重画3D空间点到2D平面查看是否匹配:通过查看cmd中输出的旋转矩阵和平移向量以及重画的2D点,我们发现solvePnP运行良好。点这里获得程序源码
下一节我们将结合相机外参使用OpenGL画出AR物体。
============================================================================================================
2015/10/20号补充:
这几天在做跟踪恢复的时候需要用给定的2D点和R,T计算3D点,于是重新手算了一边图像2D点和空间3D点的关系。过程中搞懂了为什么PnP计算rotation和translation的时候需要至少3组2D/3D点。
首先来看图像2D点和空间3D点的关系:
对于R和T展开并且对矩阵相乘展开我们得到:
把(3)式带入(1)式和(2)式,整理得:
Xw * ( fx * R11 + u0 * R31 - x * R31) + Yw * (fx * R12 + u0 * R32 - x * R32) + Zw * (fx * R13 + u0 * R33 - x * R33) = T3 * x - fx * T1 - u0 * T3
Xw * ( fy * R21 + v0 * R31 - y * R31) + Yw * (fy * R22 + v0 * R32 - y * R32) + Zw * (fy * R23 + v0 * R33 - y * R33) = T3 * y - fy * T2 - v0 * T3
我们可以看出,fx fy u0 v0是相机内参,上一节中已经求出,Xw Yw x y是一组3D/2D点的坐标,所以未知数有R11 R12 R13 R21 R22 R23 R31 R32 R33 T1 T2 T3一共12个,由于旋转矩阵是正交矩阵,每行每列都是单位向量且两两正交,所以R的自由度为3,秩也是3,比如知道R11 R12 R21就能求出剩下的Rxx。加上平移向量的3个未知数,一共6个未知数,而每一组2D/3D点提供的x y Xw Yw Zw可以确立两个方程,所以3组2D/3D点的坐标能确立6个方程从而解出6个未知数。
故PnP需要知道至少3组2D/3D点。
另外这里http://www.cnblogs.com/singlex/p/pose_estimation_0.html有比较通俗点的解释,可以参考。
============================================================================================================
2016/1/28号补充:
最近在用平均最小误差求精准相机姿态的过程中,需要搞清楚R和t的具体含义。R的第i行 表示摄像机坐标系中的第i个坐标轴方向的单位向量在世界坐标系里的坐标;
R的第i列 表示世界坐标系中的第i个坐标轴方向的单位向量在摄像机坐标系里的坐标;
t 表示世界坐标系的原点在摄像机坐标系的坐标;
-R的转置 * t 表示摄像机坐标系的原点在世界坐标系的坐标。(原理如下图,t表示平移,T表示转置)
- solvepnp详解
- solvePnp
- opencv solvePnP
- Opencv249和Opencv3.0以上的 SolvePnp函数详解(附带程序、算例)
- opencv 中的solvePnP() 程序
- solvepnp三维位姿估算
- 三维姿态:关于solvePnP与cvPOSIT
- 三维姿态估计:关于solvePnP与cvPOSIT
- Opencv 里的solvePnP函数使用问题
- OPENCV之从calibrateCamera到solvePnP(一)
- OPENCV之从calibrateCamera到solvePnP(二)
- 深度相机结合cv--solvePnP函数获取定位
- PnP 单目相机位姿估计(二):solvePnP利用二维码求解相机世界坐标
- 详解
- 详解
- 详解
- 详解
- &,&&,|,||详解
- 学习OpenCV——KeyPoint Matching 优化方式
- 棋盘覆盖问题
- Servlet API中包装类装饰模式的应用
- rediskey的辅助类备忘
- LeetCode 257. Binary Tree Paths
- solvepnp详解
- Python实现删除当前目录下除当前脚本以外的文件和文件夹实例
- java中“或”(||)条件的执行次序
- com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
- spring boot 单元测试
- quick框架之MyApp详解
- 正则表达式-元字符
- RxJava—组合操作符
- cte with as 用法