Python 中的 MatLab transformPointsForward 等价物

MatLab transformPointsForward equivalent in Python

我需要一个与 transformPointsForward (from MatLab) in Python. I have a code from: https://github.com/jwyang/face-alignment 等效的函数,我正在尝试使用 openCv 在 Python 中重写它。


我在 MatLab 中有以下函数:

[pixel_a_x_lmcoord, pixel_a_y_lmcoord] = transformPointsForward(Tr_Data{s}.meanshape2tf{k}, pixel_a_x_imgcoord', pixel_a_y_imgcoord');

哪里


我的尝试

我正在寻找一个等效的函数,但没有成功。到目前为止,我已经找到 matplotlib.transform.Affine2D,所以我已准备好所有输入。

问题是,我在Python中找不到正向几何变换函数。我试过 cv2.perspectiveTransform(),但它给了我完全不同的输出:

示例:

MatLab

A = [1 2 3; 4 5 6; 0 0 1]';
pixelx = [1 5 9]';
pixely = [7 5 3]';
obj = affine2d(A);
[x,y] = transformPointsForward(obj,pixelx',pixely');

输出:

x = [18 18 18]
y = [45 51 57]

Python

A = np.transpose(np.array([[1,2,3],[4,5,6],[0,0,1]], dtype='float32'))
v = np.array([np.transpose(np.array([[1,5,9],[7,5,3]],dtype='float32'))])
cv2.perspectiveTransform(v,A)

输出:

array([[[ 0.63043481,  0.80434781],
        [ 0.54347825,  0.76086956],
        [ 0.45652175,  0.71739131]]], dtype=float32)

编辑:

我试过转换函数,但是 cv2.transform 的输出是错误的。

代码:

A = np.transpose(np.array([[1,2,3],[4,5,6],[0,0,1]], dtype='float32'))
v = np.array([np.transpose(np.array([[1,5,9],[7,5,3]],dtype='float32'))])
cv2.transform(v,A)

输出:

array([[[ 29., 37., 45.], 
        [ 25., 35., 45.], 
        [ 21., 33., 45.]]], dtype=float32)

编辑2:

我试过使用没有行 [0,0,1] 的矩阵,但结果仍然不正确。

代码:

A = np.transpose(np.array([[1,2,3],[4,5,6]], dtype='float32'))
v = np.array([np.transpose(np.array([[1,5,9],[7,5,3]],dtype='float32'))])
cv2.transform(v,A)

输出:

array([[[ 29.,  37.,  45.],
        [ 25.,  35.,  45.],
        [ 21.,  33.,  45.]]], dtype=float32)

当您需要 Python(或任何其他语言)的 MatLab 函数并且它不在其本机库中时(就像这里它不在 NumPy 中),那么最佳做法是在 Octave.

中寻找等效(或至少相似)的函数

例如在这里,我们正在寻找来自 MatLab 的 transformPointsForward。 Octave 中几乎等价的函数是 tformfwd().


Python

中的代码

tformfwd启发的一个非常简单的几何正变换代码如下所示:

#!/usr/bin/python

import numpy as np

def forwardAffineTransform(T,v1,v2):
    if v1.shape[1] != 1 or v2.shape[1] != 1:
        print('Vectors must be column-shaped!')
        return
    elif v1.shape[0] != v2.shape[0]:
        print('Vectors must be of equal length!')
        return

    vecSize = v1.shape[0]

    concVec = np.concatenate((v1,v2),axis=1)
    onesVec = np.ones((vecSize,1))

    U = np.concatenate((concVec,onesVec),axis=1)

    retMat = np.dot(U,T[:,0:2])

    return (retMat[:,0].reshape((vecSize,1)), retMat[:,1].reshape((vecSize,1)))

def main():
    v1 = np.array([1,4,9,5,6])
    v1.shape = (v1.shape[0],1)

    v2 = np.array([7,2,6,7,8])
    v2.shape = (v2.shape[0],1)

    T = np.array( [ [1,3,0],[2,2,0],[3,5,1] ] )

    res = forwardAffineTransform(T,v1,v2)

    print("{0}\n{1}".format(res[0], res[1]))


if __name__=='__main__':
    main()

输出:

[[ 18.]
 [ 11.]
 [ 24.]
 [ 22.]
 [ 25.]]
[[ 22.]
 [ 21.]
 [ 44.]
 [ 34.]
 [ 39.]]