相机的位姿如何从标记的位姿计算得出

3

我目前正在使用计算机视觉定位车辆的任务。我正在使用C++OpenCV。我实现了ArUco标记来获取放置在车辆上的相机的姿态。

我使用以下函数来估计标记的姿态:

cv::aruco::estimatePoseSingleMarkers(markerCorners, markerLength, camMatrix, distCoeffs, rvecs,tvecs)

后来我发现,rvecstvecs是三通道的1x1数组,(openCVDataType=CV_8UC3)

现在,我从cv :: Rodrigues函数中获得了一个R(3x3)矩阵,假设它是Ri。

为了得到相机相对于标记的姿态,在经过大量研究后,我发现必须采取逆变换。我得到了Ri的逆变换。

现在,要想得到翻译向量的逆变换,只需将上述逆变换与翻译向量(tvecs)相乘即可。

我对c++还比较新,我的问题是:

  1. 我的方法正确吗,以找到相机相对于标记的姿态?
  2. 我无法将tvecs更改为mat对象,以避免乘法错误。
2个回答

1

方法estimatePoseSingleMarkers在内部使用cv::solvePnP方法。 这就是为什么在相机姿态估计中,您需要执行以下操作:

Mat R;
cv::Rodrigues(rvec, R); // calculate your object pose R matrix

camR = R.t();  // calculate your camera R matrix

Mat camRvec;
Rodrigues(R, camRvec); // calculate your camera rvec

Mat camTvec= -camR * tvec; // calculate your camera translation vector

看起来它符合你的猜测


1
在最后一行,我认为应该是 -R.t() * tvec。我对吗? - slayer2309
1
@slayer2309 和 tenta4,我认为情况恰恰相反。estimateposeSingleMarkers 给出了相机在标记坐标系下的姿态,需要按照 tenta4 所说的步骤来获取标记在相机坐标系下的姿态,我错了吗?请参考这个链接:http://ksimek.github.io/2012/08/22/extrinsic/。 - Komms
@Komms 请查看文档(https://docs.opencv.org/trunk/d9/d6a/group__aruco.html#ga84dd2e88f3e8c3255eb78e0f79571bd1):返回的变换是将每个标记坐标系中的点转换为相机坐标系的变换。因此,您需要对其进行反转。 - Shravya Boggarapu
很遗憾他们没有办法输入来自已知世界坐标系的实际物体点。它总是把标记的中心视为0。 - Shravya Boggarapu

0

Rodriguez方法可以为您提供一个旋转矩阵。利用旋转矩阵和平移矩阵创建一个4*4的变换矩阵。对变换矩阵进行求逆运算,可得到相机相对于标记的姿态。有关方程式的内容,请搜索谷歌,相关内容很简单且易获得。您需要从逆变换矩阵中提取旋转和平移信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接