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

将数学函数从Python转换为c++

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

    我正试图将一些opencv代码从python转换成c++,但有点迷路了。巨蟒是:

    if 0 < R[1,1] < 1:
        # If it gets here, the pose is flipped.
    
        # Flip the axes. E.g., Y axis becomes [-y0, -y1, y2].
        R *= np.array([
            [ 1, -1,  1],
            [ 1, -1,  1],
            [-1,  1, -1],
        ])
    
        # Fixup: rotate along the plane spanned by camera's forward (Z) axis and vector to marker's position
        forward = np.array([0, 0, 1])
        tnorm = T / np.linalg.norm(T)
        axis = np.cross(tnorm, forward)
        angle = -2*math.acos(tnorm @ forward)
        R = cv2.Rodrigues(angle * axis)[0] @ R
    

    到目前为止我有:

    cv::Mat R;
    if (0 < R.at<double>(1, 1) < 1) {
    
                // Flip the axes.E.g., Y axis becomes[-y0, -y1, y2].
                float mult[9] = { 1, -1, 1, 1, -1, 1,-1, 1, -1 };
    
                cv::Mat FlipAxes = cv::Mat(3, 3, CV_32F, mult);
    
                R *= FlipAxes;
    
                    //# Fixup: rotate along the plane spanned by camera's forward (Z) axis and vector to marker's position
                cv::Vec3d forward(0, 0, 1);
                double tnorm = tvecBest / np.linalg.norm(T)
                axis = np.cross(tnorm, forward)
                angle = -2 * math.acos(tnorm @ forward)
                R = cv2.Rodrigues(angle * axis)[0] * R
    
    
            }
    

    我迷失在这些台词中:

    double tnorm = tvecBest / np.linalg.norm(T)
    axis = np.cross(tnorm, forward)
    angle = -2 * math.acos(tnorm @ forward)
    

    np.linalg.norm 在c++opencv中?

    1 回复  |  直到 7 年前
        1
  •  1
  •   PilouPili    7 年前

    np.linalg.norm(T)只是L2 norm:

    sqrt(T[0]*T[0]+T[1]*T[1]+T[2]*T[2]) 
    

    np.cross(tnorm,forward)是交叉积:

    axis[0] = tnorm[1]*forward[2]-tnorm[2]*forward[1]
    axis[1] = -tnorm[0]*forward[2]+tnorm[2]*forward[0]
    axis[2] = tnorm[0]*forward[1]-tnorm[1]*forward[0]