结合 OpenCV 估计AffinePartial2D 得到的几个仿射变换

问题描述 投票:0回答:1

我在 Android 上使用 OpenCV。我使用

goodFeaturesToTrack
方法来查找视频帧中的特征。然后,我拍摄下一个视频帧,并使用
calcOpticalFlowPyrLK
找到其中的这些特征,并使用
estimateAffinePartial2D
估计所需的转换。到目前为止,一切都按我的预期进行。

我想要实现的是这个,给定来自

estimateAffinePartial2D
的几个变换矩阵,我想要有一个可以应用于原始帧以获得最后一帧的矩阵,即具有m1(frame_0 - >frame_1),m2 ... mn,我想计算frame_0到frame_n之间转换的Mn。

estimateAffinePartial2D
返回的矩阵是2x3

[[cos(theta)*s, -sin(theta)*s, tx]; 
[sin(theta)*s,  cos(theta)*s, ty]]

我尝试添加一行 1 并将两个矩阵相乘,但结果矩阵似乎并不对应于组合两个变换的变换(相乘的翻译似乎是错误的)。

>>> arr1 = np.array([[cos(pi / 4.), -sin(pi / 4.), 100], [sin(pi / 4.), cos(pi / 4.), 100], [1, 1, 1]])
>>> arr2 = np.array([[cos(pi / 2.), -sin(pi / 2.), 50], [sin(pi / 2.), cos(pi / 2.), 50], [1, 1, 1]])
>>> arr_result = np.multiply(arr1, arr2)
>>> print(arr_result)
[[4.32978028e-17 7.07106781e-01 5.00000000e+03]
 [7.07106781e-01 4.32978028e-17 5.00000000e+03]
 [1.00000000e+00 1.00000000e+00 1.00000000e+00]]
android opencv affinetransform
1个回答
1
投票
  1. 最后一行应该是 [0, 0, 1] 而不是 [1, 1, 1]
  2. 使用 numpy.matmul 而不是 numpy.multiply 进行矩阵乘法(numpy.multiply 是按元素乘法,而不是矩阵乘法)
© www.soinside.com 2019 - 2024. All rights reserved.