代码之家  ›  专栏  ›  技术社区  ›  anti

OpenCv,作曲家给出了奇怪的结果

  •  0
  • anti  · 技术社区  · 6 年前

    我有一个openCv应用程序可以找到基准标记。我要做的是得到这些标记之间的相对转换,在标记空间中。

    标记都在同一个平面上,在一条直线上,具有不同的旋转,如下所示:

    marker placement

    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]
    

    看起来轴的切换结果不正确。但我在这里哪里错了?

    我已经检查了初始返回的标记转换,它们是正确的,因此这是上述函数的问题。

    0 回复  |  直到 6 年前