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');
哪里
Tr_Data{s}.meanshape2tf{k]
是几何变换,指定为affine2d
几何变换对象。
pixel_a_x_imgcoors
是向量 1000x1
pixel_a_y_imgcoors
是向量 1000x1
我的尝试
我正在寻找一个等效的函数,但没有成功。到目前为止,我已经找到 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.]]
我需要一个与 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');
哪里
Tr_Data{s}.meanshape2tf{k]
是几何变换,指定为affine2d
几何变换对象。pixel_a_x_imgcoors
是向量 1000x1pixel_a_y_imgcoors
是向量 1000x1
我的尝试
我正在寻找一个等效的函数,但没有成功。到目前为止,我已经找到 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.]]