我想用ArUco找到标记的“空间坐标”。我在理解tvecs
和rvecs
时遇到了问题。我到目前为止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)。我得到了相机矩阵,distCoeffs
和tvecs_cameracalib
,rvecs_cameracalib
。 t/rvecs_camerapos
和t/rvecs_cameracalib
是不同的,我觉得很奇怪。
camerapos
或cameracalib
进行姿势估计吗?我认为t/rvecs_cameracalib
可以忽略不计,因为我只对相机校准算法的内在参数感兴趣。
现在我想找到标记的X,Y,Z位置,我使用aruco.estimatePoseSingleMarkers
与t/rvecs_camerapos
和retrive t/rvecs_markerpos
。 tvecs_markerpos
与我的预期值不符。
t/rvecs_markerpos
才能找到标记的X,Y,Z?据我所知,标记的中心是3D世界的参考框架。 rvec和tvec是用于获取任何其他3D点(在世界参考系中)w.r.t摄像机坐标系的位置的变换。所以这两个向量都是外在参数[R | t]。内在参数通常来自校准。现在,如果要将任何其他3D点w.r.t世界参考框架投影到图像平面上,则需要先将该3D点放入摄像机坐标系,然后将其投影到图像上以获取透视图。
图像平面中的点(u,v,1)= [内在] [外在] [3D点,1]
处理相机和相机校准(包括AruCo)的OpenCV例程使用pinhole camera model。世界原点被定义为相机模型的投影中心(所有进入相机的光线会聚),Z轴定义为相机模型的光轴,X轴和Y轴形成正交系统Z. + Z在相机前面,+ X在右边,+ Y在下方。所有AruCo坐标都在此坐标系中定义。这就解释了为什么你的“相机”tvecs和rvecs改变了:他们没有在某个世界坐标系中定义你的相机的位置,而是相对于你的相机的标记位置。
你真的不需要知道摄像机校准算法是如何工作的,除了它会给你一个摄像机矩阵和一些镜头失真参数,你用它们作为其他AruCo和OpenCV例程的输入。
获得校准数据后,您可以使用AruCo识别标记并在相机定义的3D坐标系中返回其位置和方向,并正确补偿相机镜头的失真。例如,在摄像机的视频输入之上使用OpenGL进行增强现实就足够了。