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

mgdq6dx1  于 2023-01-16  发布在  Python
关注(0)|答案(2)|浏览(399)

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

我有一个摄像头(笔记本电脑摄像头只是为了说明摄像头的方向)在位置 XYZ,摄像头是有方向的,这可以用Angular a 围绕 X,Angular b 围绕 Y,Angular c 围绕 Z(Angular 在拉德)来描述。
因此,如果我的相机是固定的,我会采取不同的照片ChArUco板,并给予相机校准算法tvecs_cameraposZYX)和rvecs_cameraposcba)。我得到cameraMatrix,distCoeffstvecs_cameracalibrvecs_cameracalibt/rvecs_camerapost/rvecs_cameracalib是不同的,我觉得奇怪。

  • t/rvecs的指定/顺序是否正确?
  • 如果相机不移动,我应该使用camerapos还是cameracalib进行姿势估计?

我认为t/rvecs_cameracalib可以忽略不计,因为我只对摄像机校准算法的固有参数感兴趣。
现在我想找到标记XYZ 位置,我将aruco.estimatePoseSingleMarkerst/rvecs_camerapos一起使用,并检索t/rvecs_markerpostvecs_markerpos与我的预期值不匹配。

  • 是否需要对t/rvecs_markerpos进行变换以查找标记的 XYZ
  • 我的误解在哪里?
mwg9r5ms

mwg9r5ms1#

处理摄像机和摄像机校准的OpenCV例程(包括AruCo)使用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旋转向量,它定义了旋转轴和绕该轴的旋转Angular ,并给出了标记的方向。它可以使用Rodrigues函数(cv::Rodrigues())转换为3x 3旋转矩阵。它可以是将标记的局部轴转换到世界(相机)轴上的旋转,也可以是相反的旋转--我记不清了,但你可以很容易地检查。
bnl4lu3b

bnl4lu3b2#

在我的理解中,相机坐标是3D世界的参考系。rvec和tvec是用于获得任何其他3D点(在世界参考系中)相对于相机坐标系的位置的变换。因此,这两个向量都是外部参数**[R|t]。内参数通常通过校准获得。现在,如果您想将世界参考系中的任何其他3D点投影到图像平面上,您需要首先将该3D点放入相机坐标系中,然后将其投影到图像上以获得正确的透视图。
图像平面中的点
(u,v,1)=[固有] [非固有] [3D点,1]**
参考坐标系是照相机。rvec,tvec为照相机提供标记wrt的6D姿态。

相关问题