2013-04-21 106 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。查看輸出的大小大於輸入。