我想使用ArUco来查找标记的“空间坐标”。我在理解tvecs
和rvecs
时遇到了一些问题。我一直认为tvecs
是平移,rvecs
是旋转。但是它们是如何定位的,它们在代码中的编写顺序是什么,或者我如何定位它们?
我有一个摄像头(笔记本电脑摄像头只是为了说明摄像头的方向)在位置 X,Y,Z,摄像头是有方向的,这可以用Angular a 围绕 X,Angular b 围绕 Y,Angular c 围绕 Z(Angular 在拉德)来描述。
因此,如果我的相机是固定的,我会采取不同的照片ChArUco板,并给予相机校准算法tvecs_camerapos
(Z,Y,X)和rvecs_camerapos
(c,b,a)。我得到cameraMatrix,distCoeffs
和tvecs_cameracalib
,rvecs_cameracalib
。t/rvecs_camerapos
和t/rvecs_cameracalib
是不同的,我觉得奇怪。
- t/rvecs的指定/顺序是否正确?
- 如果相机不移动,我应该使用
camerapos
还是cameracalib
进行姿势估计?
我认为t/rvecs_cameracalib
可以忽略不计,因为我只对摄像机校准算法的固有参数感兴趣。
现在我想找到标记的X,Y,Z 位置,我将aruco.estimatePoseSingleMarkers
与t/rvecs_camerapos
一起使用,并检索t/rvecs_markerpos
。tvecs_markerpos
与我的预期值不匹配。
- 是否需要对
t/rvecs_markerpos
进行变换以查找标记的 X、Y、Z? - 我的误解在哪里?
2条答案
按热度按时间mwg9r5ms1#
处理摄像机和摄像机校准的OpenCV例程(包括AruCo)使用pinhole camera model。世界原点定义为摄像机模型的投影中心(所有进入摄像机的光线会聚),Z轴定义为摄像机模型的光轴,X轴和Y轴与Z形成正交系。+Z在摄像机前方,+X在摄像机右侧,+Y向下。所有AruCo坐标都在这个坐标系中定义。这解释了为什么你的“相机”tvecs和rvecs会改变:它们不定义摄影机在某个世界坐标系中的位置,而是定义标记相对于摄影机的位置。
您实际上不需要知道相机校准算法是如何工作的,除此之外,它会给予您一个相机矩阵和一些透镜失真参数,您可以将其用作其他AruCo和OpenCV例程的输入。
获得校准数据后,您可以使用AruCo识别标记,并返回其在相机定义的3D坐标系中的位置和方向,同时对相机透镜的失真进行正确补偿。这足以在相机视频源上使用OpenGL实现增强现实。
bnl4lu3b2#
在我的理解中,相机坐标是3D世界的参考系。rvec和tvec是用于获得任何其他3D点(在世界参考系中)相对于相机坐标系的位置的变换。因此,这两个向量都是外部参数**[R|t]。内参数通常通过校准获得。现在,如果您想将世界参考系中的任何其他3D点投影到图像平面上,您需要首先将该3D点放入相机坐标系中,然后将其投影到图像上以获得正确的透视图。
图像平面中的点(u,v,1)=[固有] [非固有] [3D点,1]**
参考坐标系是照相机。rvec,tvec为照相机提供标记wrt的6D姿态。