我有一个openCv应用程序,可以找到基准标记。我想做的就是在标记空间中获得这些标记之间的相对转换。
所有标记都在同一平面上,成一直线,并且旋转不同,如下所示:
找到的第一个标记,我将以下变量设置为“原点”或零点。
cv::Mat otv(OriginTvec); //the first marker found, translation
cv::Mat orv(OriginRvec); //rotation vector
然后,对于下一个标记,我运行以下代码:
cv::Mat composedT, composedR;
relativePosition(orv, otv, rvec, tvec, composedR, composedT); //rvec, tvec are the current marker transforms
具有以下功能:
void inversePerspective(cv::Mat rvec, cv::Mat tvec, cv::Mat &invRvec, cv::Mat &invTvec)
{
cv::Mat R;
cv::Rodrigues(rvec, R);
R = R.t();
invTvec = -R * tvec;
cv::Rodrigues(R, invRvec);
}
void relativePosition(cv::Mat rvec1, cv::Mat tvec1, cv::Mat rvec2, cv::Mat tvec2, cv::Mat &composedRvec, cv::Mat &composedTvec)
{
// Inverse the second marker, the right one in the image
cv::Mat invRvec, invTvec, orgRvec, orgTvec;
inversePerspective(rvec2, tvec2, invRvec, invTvec);
cv::composeRT(rvec1, tvec1, invRvec, invTvec, composedRvec, composedTvec);
}
这应该给我在composedR
和composedT
矩阵中从一个标记到另一个标记的相对转换。
当我打印结果时,它适用于一个标记,而不适用于另一个标记。
标记ID 10 :(正确结果)
Origin Tvec:: [17.40034702383909; 0.9026984362994943; 97.32508809945712]
marker 10 tvec: [4.461679451405943; 0.6087983984519095; 97.92729032119958]
relative transform:: [12.94176130094641; -0.5101704536674134; -0.329672315462247]
标记ID 11 :(错误结果)
Origin Tvec: [17.40034702383909; 0.9026984362994943; 97.32508809945712]
marker 11 tvec: [-8.965452763369187; 1.030574874942149; 96.66721684253494]
relative transform: [-0.9334416873257574; -26.34493062970068;0.8233238281594311]
看起来轴切换结果不正确。但是我在哪里错了?
我已经检查了返回的初始标记转换,但它们是正确的,因此上述函数存在问题。