我目前正在执行使用计算机视觉对车辆进行定位的任务。我在OpenCV
中使用C++
。我实现了ArUco标记器,以将摄像头的姿势放置在车辆上。
我使用以下函数来估算标记的姿势:
cv::aruco::estimatePoseSingleMarkers(markerCorners, markerLength, camMatrix, distCoeffs, rvecs,tvecs)
后来我发现rvecs
和tvecs
是具有3个通道(openCVDataType=CV_8UC3)
的1x1数组。
现在,我从cv::Rodrigues
函数获得R(3x3)矩阵,说它是Ri。
为了使相机w.r.t
的姿势能够进行标记,经过大量研究,我发现必须进行逆变换。
如果Ri,我就反了。
现在要获得平移向量的逆,只是上述逆与平移向量(tvecs)的乘积。
我对C ++还是很陌生,我的问题是:
w.r.t
标记的姿势时,我的方法正确吗?tvecs
更改为mat
对象,因此不会出现乘法错误。答案 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,它非常简单且可用。您需要从逆变换矩阵中提取旋转和平移。