将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]

其中R2*2 矩阵,TA 的最后一列。代码中的符号A[:,2]指的是TA[:,: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

然后将其存储在TA 的最后一列)中。

【讨论】:

【参考方案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图片读取区别与联系

如何使用 OpenCV 在 Python 中为图像添加噪声(高斯/盐和胡椒等)[重复]

将 python 行翻译成 c++ opencv

将数学函数从 Python 转换为 C++

如何在C语言里调用opencv C++函数?

如何在opencv中将图像转换为矩阵[重复]