使用opencv将多个perspectiveTransforms组合成一个转换

时间:2018-01-26 00:21:44

标签: python numpy opencv image-processing

我有一个应用程序,它有两个透视变换,从两个findHomography调用中获得,它们连续应用于一组点(python):

pts = np.float32([ [758,141],[769,141],[769,146],[758,146] ]).reshape(-1,1,2)
pts2 = cv2.perspectiveTransform(pts, trackingM)
dst = cv2.perspectiveTransform(pts2, updateM)

我想将此结合到一个转换中。我尝试过以下但转换不正确:

M = trackingM * updateM
dst = cv2.perspectiveTransform(pts, M)

如何将两个矩阵变换组合成一个变换?现在我在python中进行原型设计。除了python之外的C ++解决方案将是一个奖励。

2 个答案:

答案 0 :(得分:0)

numpy中,np.multiply(M, N)elementwise-product,而np.dot(M,N)dot-product。我认为,在您的情况下,您应该选择np.dot

例如:

>>> import numpy as np 
>>> x = np.array([[1,2],[3,4]])

## elementwise-product 
>>> x*x
array([[ 1,  4],
       [ 9, 16]])
>>> np.multiply(x,x)
array([[ 1,  4],
       [ 9, 16]])

## dot-product
>>> x.dot(x)
array([[ 7, 10],
       [15, 22]])
>>> np.dot(x,x)
array([[ 7, 10],
       [15, 22]])

答案 1 :(得分:0)

我在this post找到了答案的线索。从本质上讲,我的原始代码是按照@Silencer指出的逐元素乘法。诀窍是在进行乘法之前将变换转换为矩阵:

M = np.matrix(updateM) * np.matrix(trackingM)
dst = cv2.perspectiveTransform(pts, M)

操作数的顺序很重要。可以将上述内容视为将updatedM转换应用于trackingM转换以匹配原始问题中所述的顺序。