estimateWorldCameraPose & cameraPoseToExtrinsics(matlab)与solvepnp(opencv)区别

opencv以python下的opencv3.4.2为例(ps.opencv高版本部分函数要收费使用,俺就降低版本了)

前言

位姿估计任务当中,pnp方法是一项重要且经典的位姿估计方法,可以通过寻找二维图像和三维世界点对来结算相机位姿。

鄙人曾经用过matlab和opencv的pnp,发现两个版本下的pnp方法有细微不同(这个不同也折磨了鄙人很久!!!),当时没有在csdn中找到介绍相关问题的帖子,特此分享给大家。

先上链接:
个人感觉这个说的不错,github issues讨论
matlab estimateWorldCameraPose函数
matlab cameraPoseToExtrinsics函数
opencv solvepnp和solvepnpRansac

正文

matlab和opencv(以python为例)区别一:

matlab结果按行存储,opencv的结果按列存储,所以,相同的矩阵,matlab结果,其旋转矩阵需要进行转置才能转化为opencv的结果(平移矩阵不需要转置)。

matlab和opencv(以python为例)区别二:

matlab计算的结果,是在原始坐标系绕z旋转180°后再进行旋转平移的,所以matlab旋转矩阵在进行转置后需要前两行取反(即再绕z轴旋转180°),相应的平移向量前两个元素也要取反。

matlab和opencv(以python为例)区别三:

因为前面的区别,导致相机和世界坐标系rt矩阵求取方法也不同
matlab 的 estimateWorldCameraPose函数和opencv的solvepnp函数得到的结果都是m2c矩阵,即世界坐标系下的坐标系左乘该矩阵的标准形式得到该点在相机坐标系下的坐标。
若想得到c2m矩阵,opencv下

c2m_ROpencv = r.T
c2m_TOpencv = np.dot(-r.T,t)

c2m_RMatlab = r.T
c2m_TMatlab = np.dot(-t,r.T)

注:.T是转置操作,np.dot是矩阵相乘

你可能感兴趣的:(python,matlab,opencv,计算机视觉)