使用opencv将多个perspectiveTransforms组合成一个转换
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用opencv将多个perspectiveTransforms组合成一个转换相关的知识,希望对你有一定的参考价值。
我有一个应用程序有两个透视变换从两个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 ++解决方案将是一个奖励。
答案
在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]])
另一答案
我在this post找到答案的线索。从本质上讲,我的原始代码是按照@Silencer指出的逐元素乘法。诀窍是在进行乘法之前将变换转换为矩阵:
M = np.matrix(updateM) * np.matrix(trackingM)
dst = cv2.perspectiveTransform(pts, M)
操作数的顺序很重要。可以认为上述内容是将updateM变换应用于trackingM变换以匹配原始问题中所述的顺序。
以上是关于使用opencv将多个perspectiveTransforms组合成一个转换的主要内容,如果未能解决你的问题,请参考以下文章