使用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 ++解决方案将是一个奖励。

答案

numpynp.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组合成一个转换的主要内容,如果未能解决你的问题,请参考以下文章

如何将来自不同图像的多个描述符存储在 C++ 和 OpenCV 中的向量向量中?

使用Opencv去噪多个灰度文本图像[重复]

使用 OpenCV 在同一窗口中显示多个图像

OpenCV - 将多个不规则的小图紧密合并成大图

OpenCV:如何混合多个不同颜色的半透明多边形?

[OpenCV实战]31 使用OpenCV将一个三角形仿射变换到另一个三角形