2013-04-21 108 views
2

我一直在尝试使用OpenCV进行二维矩阵的卷积。我其实通过了这个代码http://blog.timmlinder.com/2011/07/opencv-equivalent-to-matlabs-conv2-function/#respond,但它只在正面情况下才会得到正确答案。 OpenCV或C++中是否有像Matlab这样的简单函数?在OpenCV中的Matlab的Conv2等价物

下面是一个例子:

A= [ 
    1 -2 
    3 4 
] 

我想[-0.707 0.707]

进行卷积它,并将结果作为从Matlab的CONV2是

-0.7071 2.1213 -1.4142 
-2.1213 -0.7071 2.8284 

一些函数来计算这个输出OpenCV或C++?我会很感激回应。

+0

你可以使用filter2d() – 2013-04-21 17:26:10

+0

我试过了,但是它没有给出所需的答案。 – user1343318 2013-04-21 17:34:38

回答

0

如果您使用的OpenCV与Python 2绑定,您可以使用SciPy的,只要你的形象将是ndarrays:

>>> from scipy import signal 
>>> A = np.array([[1,-2], [3,4]]) 
>>> B = np.array([[-0.707, 0.707]]) 
>>> signal.convolve2d(A,B) 
array([[-0.707, 2.121, -1.414], 
     [-2.121, -0.707, 2.828]]) 

确保您使用完整的模式(这是默认设置),如果你只要你使用“相同”模式,希望获得与matlab中相同的结果,Scipy的中心与Matlab不同。

3

如果您想要独家OpenCV解决方案,请使用cv2.filter2D函数。但是你应该调整borderType标志,如果你想获得正确的输出作为matlab的输出。

>>> A = np.array([ [1,-2],[3,4] ]).astype('float32') 
>>> A 
array([[ 1., -2.], 
     [ 3., 4.]], dtype=float32) 

>>> B = np.array([[ 0.707,-0.707]]) 
>>> B 
array([[ 0.707, -0.707]]) 

>>> cv2.filter2D(A2,-1,B,borderType = cv2.BORDER_CONSTANT) 
array([[-0.70700002, 2.12100005, -1.41400003], 
     [-2.12100005, -0.70700002, 2.82800007]], dtype=float32) 

borderType很重要。要找到卷积,您需要数组外的值。如果你想获得像输出一样的matlab,你需要通过cv2.BORDER_CONSTANT。查看输出的大小大于输入。