从标记的姿势照相机的姿势

时间:2018-07-23 10:31:41

标签: c++ opencv

我目前正在执行使用计算机视觉对车辆进行定位的任务。我在OpenCV中使用C++。我实现了ArUco标记器,以将摄像头的姿势放置在车辆上。

我使用以下函数来估算标记的姿势:

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

后来我发现rvecstvecs是具有3个通道(openCVDataType=CV_8UC3)的1x1数组。

现在,我从cv::Rodrigues函数获得R(3x3)矩阵,说它是Ri。

为了使相机w.r.t的姿势能够进行标记,经过大量研究,我发现必须进行逆变换。 如果Ri,我就反了。

现在要获得平移向量的逆,只是上述逆与平移向量(tvecs)的乘积。

我对C ++还是很陌生,我的问题是:

  1. 在找到相机w.r.t标记的姿势时,我的方法正确吗?
  2. 我无法将tvecs更改为mat对象,因此不会出现乘法错误。

2 个答案:

答案 0 :(得分:0)

方法 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 :(得分:0)

Rodriguez的方法为您提供了一个旋转矩阵。借助旋转矩阵和平移矩阵制作4 * 4变换矩阵。逆变换矩阵将提供相机相对于标记的姿势。对于方程式,只是google,它非常简单且可用。您需要从逆变换矩阵中提取旋转和平移。