MatLab transformPointsForward等效Python

2024-09-30 18:16:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要一个与Python中的transformPointsForward(来自MatLab)的等效函数。我有一个来自: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');

在哪里

  • Tr_Data{s}.meanshape2tf{k]是一个几何变换,指定为affine2d几何变换对象。在
  • pixel_a_x_imgcoors是向量1000x1
  • pixel_a_y_imgcoors是向量1000x1

我的尝试

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

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

示例:

MatLab

^{pr2}$

输出:

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)

Tags: 函数代码datanptransformarraycv2tr
1条回答
网友
1楼 · 发布于 2024-09-30 18:16:49

当你需要一个用Python(或任何其他语言)编写的MatLab函数,而它不在它的本机库中(就像这里它不在NumPy)中,那么最佳实践是在Octave中寻找一个等价的(或至少类似的)函数。在

例如,我们在这里寻找来自MatLab的transformPointsForward。倍频程中的几乎等价函数是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()

输出:

^{pr2}$

相关问题 更多 >