三维姿态:关于solvePnP与cvPOSIT
来源:互联网 发布:网络名片设计图片 编辑:程序博客网 时间:2024/05/22 00:17
之所以写:
场景:给定物体3D点集与对应的图像2D点集,之后进行姿态计算(即求旋转与位移矩阵)。
在翻阅opencv api时看到这2个函数输出都是旋转与位移,故做简单分析并记录于此。
官方解释:
solvePnP(http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#solvepnp)
Finds an object pose from 3D-2D point correspondences.
bool solvePnP(InputArray objectPoints, InputArray imagePoints, InputArray cameraMatrix, InputArray distCoeffs, OutputArray rvec, OutputArray tvec,bool useExtrinsicGuess=false, int flags=ITERATIVE )
cvPOSIT(http://www.opencv.org.cn/index.php/Cv%E7%85%A7%E7%9B%B8%E6%9C%BA%E5%AE%9A%E6%A0%87%E5%92%8C%E4%B8%89%E7%BB%B4%E9%87%8D%E5%BB%BA#POSIT)
执行POSIT算法
void cvPOSIT( CvPOSITObject* posit_object, CvPoint2D32f* image_points, double focal_length, CvTermCriteria criteria, CvMatr32f rotation_matrix, CvVect32f translation_vector );
理解:
相同点:1.输入都是3D点集和对应的2D点集,其中cvPOSIT的3D点包含在posit_object结构中
2.输出均包括旋转矩阵和位移向量
不同点:solvePnP有摄像机的一些内参
solvePnP源码:
void cv::solvePnP( InputArray _opoints, InputArray _ipoints, InputArray _cameraMatrix, InputArray _distCoeffs, OutputArray _rvec, OutputArray _tvec, bool useExtrinsicGuess ){ Mat opoints = _opoints.getMat(), ipoints = _ipoints.getMat(); int npoints = std::max(opoints.checkVector(3, CV_32F), opoints.checkVector(3, CV_64F)); CV_Assert( npoints >= 0 && npoints == std::max(ipoints.checkVector(2, CV_32F), ipoints.checkVector(2, CV_64F)) ); _rvec.create(3, 1, CV_64F); _tvec.create(3, 1, CV_64F); Mat cameraMatrix = _cameraMatrix.getMat(), distCoeffs = _distCoeffs.getMat(); CvMat c_objectPoints = opoints, c_imagePoints = ipoints; CvMat c_cameraMatrix = cameraMatrix, c_distCoeffs = distCoeffs; CvMat c_rvec = _rvec.getMat(), c_tvec = _tvec.getMat(); cvFindExtrinsicCameraParams2(&c_objectPoints, &c_imagePoints, &c_cameraMatrix, c_distCoeffs.rows*c_distCoeffs.cols ? &c_distCoeffs : 0, &c_rvec, &c_tvec, useExtrinsicGuess );}结论:可以看到,除了前面的一堆数据类型检查和转化外,其实solvePnP调用的是cvFindExtrinsicCameraParams2通过已知的内参进行未知外参求解,是一个精确解;而cvPOSIT是用仿射投影模型近似透视投影模型下,不断迭代计算出来的估计值(在物体深度变化相对于物体到摄像机的距离比较大的时候,这种算法可能不收敛)。
- 三维姿态:关于solvePnP与cvPOSIT
- 三维姿态估计:关于solvePnP与cvPOSIT
- solvepnp三维位姿估算
- solvePnp
- 关于MPU6050姿态解算的理解与认识
- 关于MPU6050姿态解算的理解与认识
- 坐标系与姿态矩阵
- opencv中3D点根据相机参数投影成2D点+solvePnP函数计算相机姿态+2D坐标到3D+相机参数calibration(标定与配准,求得深度彩色相机的内参与外参,再进行配准)
- opencv solvePnP
- solvepnp详解
- 关于正方体的姿态问题
- 关于姿态解算与融合的基础概念篇(一)
- 关于姿态解算与融合的证明篇(二)
- 关于姿态解算与融合的代码注释篇(三)
- 四元数与姿态解算
- 关于移动测量姿态问题的思考
- opencv 中的solvePnP() 程序
- 姿态解算中的欧垃角与四元数
- Spring中两个关键知识点的形象理解
- MFC子窗口向父窗口发送消息
- JMX代码入门(一)
- 如何模拟android 中GridView的选中item的事件
- MFC项目使用webbrowser控件,点击载入的页面里的文件下载链接后导致程序的崩溃问题的解决方案
- 三维姿态:关于solvePnP与cvPOSIT
- 浏览器组成及工作原理介绍
- Flash/Flex解决IE缓存,socket不能断开连接问题
- 关于Android Activity 的几种模式
- VC使用Zlib对内存流进行压缩与解压缩
- 《C++ Primer》 第08章 标准 IO 库 | Good !
- C#中时间的相关处理
- GRUB4DOS使用大全(1)
- 确定文件的行数