提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
在识别aruco码的时候,老是搞不清R,T,坐标系转换的关系,现在写下来
提示:以下是本篇文章正文内容,下面案例可供参考
一、R,t到底是代表什么?
CV_EXPORTS_W void estimatePoseSingleMarkers(InputArrayOfArrays corners, float markerLength,
InputArray cameraMatrix, InputArray distCoeffs,
OutputArray rvecs, OutputArray tvecs, OutputArray _objPoints = noArray(),
Ptr<EstimateParameters> estimateParameters = EstimateParameters::create());
这个函数的意思是返回rvecs和tvecs,是从mark坐标系转换到相机坐标系的
具体意义参考slam十四讲第45页,这里的mark坐标系就是坐标系2,相机坐标系是坐标系1,tvecs的含义就是坐标系2的原点在坐标系1下的坐标。也就是返回的tvecs是mark中心点在相机坐标系下的坐标,
其实也很好理解,把a2设为(0,0,0)a1就是tvecs了
rvecs的意义也好理解了,就是把mark坐标系扭转到相机坐标系下的旋转操作。
二、mark坐标系和相机坐标系
首先需要了解的是opencv相机坐标系是右手坐标系,自然aruco的mark坐标系也是右手,也可以通过图片看出来。
仔细观察图片,mark红蓝绿坐标系的方向,此图相机是在mark上方,正右边拍摄的,
根据输入信息
R_{camera<---marker} :
[-0.9995757537181484, 0.02905460828596541, 0.002035268076802161;
0.02895610315729921, 0.9988548156887623, -0.03808675971136301;
-0.003139533204026787, -0.03801166811278305, -0.9992723634818209]
t_{camera<---marker} :
[-0.141753, 0.000979788, 0.27318]
首先看x=-0.14,根据实意图,因为实际情况是mark在相机左边,也就是mark中心在相机x轴的负半轴,负号对上了。。。
再看y=0,也和实际情况相符
z=0.27,也表明mark中心在相机z轴正半轴,符合实际情况。
然后看R,R表示是把mark的x轴方向乘以-1,也就是反转;y轴方向不变;z轴方向也反转,即可得到相机坐标系方向。
也符合示意图。
至此完美自洽。
总结
提示:这里对文章进行总结:
说明了mark坐标系和相机坐标系都是右手坐标系,以及返回的R,t的物理意义。