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

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

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

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

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

    现在我想找到标记的 X,Y,Z位置,我将aruco.estimatePoseSingleMarkerst/rvecs_camerapos一起使用并检索t/rvecs_markerpostvecs_markerpos与我的期望值不匹配。
  • 是否需要对t/rvecs_markerpos进行转换才能找到标记的X,Y,Z?
  • 我的误解在哪里?
  • 最佳答案

    处理摄像机和摄像机校准(包括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旋转矩阵。是将标记的局部轴转换为世界(相机)轴的旋转,还是反向旋转-我不记得了,但是您可以轻松地进行检查。
  • 关于python - 在OpenCV-ArUco中对tvecs rvecs的基本了解,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53277597/

    10-10 07:18