我目前正在执行使用计算机视觉对车辆进行定位的任务。我正在使用OpenCVC++。我实现了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,我反了。

现在,要获得平移 vector 的逆,只需要将上述逆与平移 vector (tvecs)相乘即可。

我对C++相当陌生,我的问题是:
  • 在找到相机w.r.t标记的姿势时,我的方法是否正确?
  • 我无法将tvecs更改为mat对象,因此没有乘法错误。
  • 最佳答案

    方法估计PoseSingleMarkers 方法在其中使用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
    

    似乎符合您的猜测

    10-08 11:56