我想使用 ArUco 查找标记的“空间坐标”。
我在理解tvecs
和rvecs
时遇到问题。我认为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 distCoeffs
和tvecs_cameracalib
,rvecs_cameracalib
。 t/rvecs_camerapos
和t/rvecs_cameracalib
不同,我觉得很奇怪。
camerapos
或cameracalib
进行姿势估计? 我认为t/rvecs_cameracalib
可以忽略不计,因为我只对相机校准算法的内在参数感兴趣。
现在我想找到标记的 X , Y , Z 位置,我使用{ {1}}与aruco.estimatePoseSingleMarkers
并检索t/rvecs_camerapos
。 t/rvecs_markerpos
与我的期望值不匹配。
tvecs_markerpos
才能找到标记的 X , Y , Z ? 答案 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旋转矩阵。是将标记的局部轴转换为世界(相机)轴的旋转,还是反向旋转-我不记得了,但是您可以轻松地进行检查。