2

OpenCV を使用して 2D マトリックスの畳み込みを実行しようとしています。私は実際にこのコードhttp://blog.timmlinder.com/2011/07/opencv-equivalent-to-matlabs-conv2-function/#respondを実行しましたが、正の場合にのみ正しい答えが得られます。OpenCV または C++ の 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++ でこの出力を計算する関数はありますか? 私は応答に感謝します。

4

2 に答える 2

4

排他的な OpenCV ソリューションが必要な場合は、cv2.filter2D関数を使用します。ただし、matlab の出力と同じように正しい出力を得たい場合は、borderType フラグを調整する必要があります。

>>> 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 を渡す必要があります。出力が入力よりもサイズが大きいことを確認してください。

于 2013-04-21T17:42:00.843 に答える
0

Python 2 バインディングで OpenCV を使用している場合、画像が ndarray である限り、Scipy を使用できます。

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

「同じ」モードを使用する場合、Scipy は Matlab とは異なる方法で中心に配置される限り、matlab と同じ結果を達成したい場合は、フル モード (デフォルトで設定されています) を使用してください。

于 2013-04-21T17:01:45.770 に答える