将openCV python函数转换为C++
Posted
技术标签:
【中文标题】将openCV python函数转换为C++【英文标题】:Converting openCV python function to C++ 【发布时间】:2019-12-13 23:39:49 【问题描述】:以下片段是从 openCV python 样本中窃取的:
def motion_kernel(angle, d, sz=65):
kern = np.ones((1, d), np.float32)
c, s = np.cos(angle), np.sin(angle)
A = np.float32([[c, -s, 0], [s, c, 0]])
sz2 = sz // 2
A[:,2] = (sz2, sz2) - np.dot(A[:,:2], ((d-1)*0.5, 0))
kern = cv2.warpAffine(kern, A, (sz, sz), flags=cv2.INTER_CUBIC)
return kern
它是恢复被某种噪声模糊的图像的程序的一部分。 我正在尝试将此代码转换为 C++,但我对 python 的了解非常肤浅。 所以我特别遇到了以下问题:
A[:,2] = (sz2, sz2) - np.dot(A[:,:2], ((d-1)*0.5, 0))
我了解剩余的代码。
【问题讨论】:
【参考方案1】:让我们把你的矩阵A
写成
A=[R | T]
其中R
是2*2
矩阵,T
是A
的最后一列。代码中的符号A[:,2]
指的是T
,A[:,:2]
指的是R
。所以,这条线
A[:,2] = (sz2, sz2) - np.dot(A[:,:2], ((d-1)*0.5, 0))
只是在计算这个:
R*v + u //v in R^2 is [(0.5(d-1)), 0]^T
//u in R^2 is [sz2, sz2]^T
然后将其存储在T
(A
的最后一列)中。
【讨论】:
【参考方案2】:不确定,因为我没有看到一些代码,但很可能:
A[:,:2]
是矩阵
[[c, -s]
[s, c]]
然后,与
np.dot(A[:,:2], ((d-1)*0.5, 0))
我们将该矩阵乘以向量
[(d-1)*0.5, 0]
其实是元组,不是向量,但是意思是一样的。
在乘法之后,我们得到一些两个元素的向量,然后我们从该向量中减去
[sz2, sz2]
最后,我们将 2x3 矩阵 A
中的零替换为减法的结果
【讨论】:
以上是关于将openCV python函数转换为C++的主要内容,如果未能解决你的问题,请参考以下文章
opencv-PIL-matplotlib-Skimage-Pytorch图片读取区别与联系