我有一个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]
看起来轴的切换结果不正确。但我在这里哪里错了?
我已经检查了初始返回的标记转换,它们是正确的,因此这是上述函数的问题。