在OpenCV-ArUco中对tvecs rvec的基本了解

时间:2018-11-13 09:19:47

标签: python opencv orientation marker aruco

我想使用 ArUco 查找标记的“空间坐标”。 我在理解tvecsrvecs时遇到问题。我认为tvecs是平移的,而rvecs是旋转的。但是,它们是如何定向的,在代码中是以什么顺序编写的?或者如何定向它们?

Here is a little sketch of the setup.我在位置 X Y Z处有一个摄像头(刚刚绘制的便携式摄像头,用于说明摄像头的方向) ,相机的方向可以用围绕 X 的角度 a ,围绕 Y的角度 b 来描述。 em>,围绕 Z 的角度 c (Rad中的角度)。

因此,如果我的相机静止不动,我会拍下ChArUco板的不同图片,并为相机校准算法提供tvecs_camerapos Z Y ,< em> X )和rvecs_camerapos c b a )。我得到了cameraMatrix distCoeffstvecs_cameracalibrvecs_cameracalibt/rvecs_camerapost/rvecs_cameracalib不同,我觉得很奇怪。

  • t / rvecs的此提名/顺序正确吗?
  • 如果相机不移动,是否应该使用cameraposcameracalib进行姿势估计?

我认为t/rvecs_cameracalib可以忽略不计,因为我只对相机校准算法的内在参数感兴趣。

现在我想找到标记的 X Y Z 位置,我使用{ {1}}与aruco.estimatePoseSingleMarkers并检索t/rvecs_camerapost/rvecs_markerpos与我的期望值不匹配。

  • 我是否需要转换tvecs_markerpos才能找到标记的 X Y Z
  • 我的误解在哪里?

2 个答案:

答案 0 :(得分:1)

据我所知,标记的中心是3D世界的参考框架。 rvec和tvec是用于获取带有摄像机坐标系的任何其他3D点(在世界参考框架中)位置的转换。因此,这两个向量都是外部参数 [R | t] 。固有参数通常从校准中获得。现在,如果要将世界基准框架上的任何其他3D点投影到图像平面上,则需要先将该3D点投影到相机坐标系中,然后再将其投影到图像上以获得透视图。

图像平面中的点(u,v,1)= [内部] [外部] [3D点,1]

答案 1 :(得分:1)

处理摄像机和摄像机校准(包括AruCo)的OpenCV例程使用pinhole camera model。世界原点定义为相机模型的投影中心(所有进入相机的光线会聚),Z轴定义为相机模型的光轴,X和Y轴形成一个正交系统,其中Z。+ Z在相机前面,+ X在右边,+ Y在下面。在此坐标系中定义了所有AruCo坐标。这就解释了为什么您的“相机”电视和rvecs会发生变化:它们不定义您的相机在某些世界坐标系中的位置,而是定义标记相对于您的相机的位置。

您真的不需要知道相机校准算法的工作原理,除了它会为您提供相机矩阵和一些镜头畸变参数,您可以将其用作其他AruCo和OpenCV例程的输入。

获得校准数据后,您可以使用AruCo识别标记并返回其在相机定义的3D坐标系中的位置和方向,并正确补偿相机镜头的变形。这样就足够了,例如,在摄像机的视频源上方使用OpenGL进行增强现实。

  • 标记的tvec是标记从原点开始的平移(x,y,z);距离单位是用来定义打印的校准表的单位(即,如果您使用mm将校准表描述为OpenCV,则tvecs中的距离单位为mm)。

  • 标记的rvec是3D旋转矢量,它定义旋转轴和绕该轴的旋转角度,并给出标记的方向。可以使用Rodrigues函数(cv :: Rodrigues())将其转换为3x3旋转矩阵。是将标记的局部轴转换为世界(相机)轴的旋转,还是反向旋转-我不记得了,但是您可以轻松地进行检查。