对OpenCV-ArUco中tvecs rvecs的基本理解

问题描述 投票:1回答:1

我想用ArUco找到标记的“空间坐标”。我在理解tvecsrvecs时遇到了问题。我到目前为止tvecs是翻译和rvecs是旋转。但他们如何定位,他们在代码中编写的顺序,或者我如何定位它们?

Here is a little sketch of the setup.我有一个相机(笔记本电脑摄像头刚刚用来说明相机的方向),位于X,Y,Z位置,相机是朝向的,可以用角度a围绕X,角度b绕Y,角度c左右来描述Z(Rad中的角度)。

因此,如果我的相机静止,我会拍摄ChArUco板的不同照片,并给出相机校准算法tvecs_camerapos(Z,Y,X)和rvecs_camerapos(c,b,a)。我得到了相机矩阵,distCoeffstvecs_cameracalibrvecs_cameracalibt/rvecs_camerapost/rvecs_cameracalib是不同的,我觉得很奇怪。

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

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

现在我想找到标记的X,Y,Z位置,我使用aruco.estimatePoseSingleMarkerst/rvecs_camerapos和retrive t/rvecs_markerpostvecs_markerpos与我的预期值不符。

  • 我是否需要转换t/rvecs_markerpos才能找到标记的X,Y,Z?
  • 我的误解在哪里?
python opencv orientation marker aruco
1个回答
1
投票

据我所知,标记的中心是3D世界的参考框架。 rvec和tvec是用于获取任何其他3D点(在世界参考系中)w.r.t摄像机坐标系的位置的变换。所以这两个向量都是外在参数[R | t]。内在参数通常来自校准。现在,如果要将任何其他3D点w.r.t世界参考框架投影到图像平面上,则需要先将该3D点放入摄像机坐标系,然后将其投影到图像上以获取透视图。

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


0
投票

处理相机和相机校准(包括AruCo)的OpenCV例程使用pinhole camera model。世界原点被定义为相机模型的投影中心(所有进入相机的光线会聚),Z轴定义为相机模型的光轴,X轴和Y轴形成正交系统Z. + Z在相机前面,+ X在右边,+ Y在下方。所有AruCo坐标都在此坐标系中定义。这就解释了为什么你的“相机”tvecs和rvecs改变了:他们没有在某个世界坐标系中定义你的相机的位置,而是相对于你的相机的标记位置。

你真的不需要知道摄像机校准算法是如何工作的,除了它会给你一个摄像机矩阵和一些镜头失真参数,你用它们作为其他AruCo和OpenCV例程的输入。

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

  • 标记的tvec是来自原点的标记的平移(x,y,z);距离单位是您用于定义打印校准图表的任何单位(即,如果您使用mm将校准图表描述为OpenCV,则tvecs中的距离单位为mm)。
  • 标记的rvec是3D旋转矢量,其定义旋转轴和围绕该轴的旋转角度,并给出标记的方向。它可以使用Rodrigues函数(cv :: Rodrigues())转换为3x3旋转矩阵。它可以是将标记的局部轴转换为世界(相机)轴的旋转,也可以是反转 - 我不记得了,但您可以轻松检查。
© www.soinside.com 2019 - 2024. All rights reserved.