通过solvePnP求解相机位置 (代码可运行)

目录

一、Opencv函数使用

二、目标是求得相机在世界坐标系下的3D坐标。

1、法一:

2、法二:

3、法1附录源代码(可运行通过)


一、Opencv函数使用

solvePnP原型为:

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

其中,rvec以及tvec为旋转向量与平移向量。

 在solvePnP调用结束后,需要使用罗德里格斯变化将旋转向量转换成旋转矩阵。

Mat r,t;
solvePnP(pts_3d,pts_2d,K,Mat(),r,t,false,cv::SOLVEPNP_EPNP);
Mat R;
Rodrigues(r, R);

二、目标是求得相机在世界坐标系下的3D坐标。

1、法一:

利用求得的旋转矩阵和平移矩阵:

Pcam代表物体在相机坐标系下的坐标,Pworld代表物体在世界坐标系下的坐标,R和T代表了将点的从世界坐标系下映射到相机坐标系下,可以知道solvePnP求出的刚好是这样的映射关系。
使Pcam = 0,则意味着物体移到了相机坐标系的原点,求出来的Pworld代表了相机在世界坐标系中的位置,P的z轴坐标就是深度信息。
0=RPworld+T
P = -inverse(R)*T

代码为:

	//Mat到Eigen格式转换
	Eigen::Matrix3f R_n;
	Eigen::Vector3f T_n;
	cv2eigen(rotMat, R_n);
	cv2eigen(tvec, T_n);
	Eigen::Vector3f P_oc;

	P_oc = -R_n.inverse()*T_n;
	cout << "世界坐标" << P_oc << 
  • 6
    点赞
  • 102
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值