10

私は最近、Python言語を使用して2つの配列間の相互相関チェックを実行するための高速で効率的な方法を見つけようとしています。いくつか読んだ後、私はこれらの2つのオプションを見つけました:

  1. このNumPy.correlate()方法は、大きな配列になると遅すぎます。
  2. このcv.MatchTemplate()方法は、はるかに高速のようです。

明らかな理由で、私は2番目のオプションを選択しました。次のコードを実行しようとしました。

import scipy
import cv

image = cv.fromarray(scipy.float32(scipy.asarray([1,2,2,1])),allowND=True)
template = cv.fromarray(scipy.float32(scipy.asarray([2,2])),allowND=True)
result = cv.fromarray(scipy.float32(scipy.asarray([0,0,0])),allowND=True)
cv.MatchTemplate(image,template,result,cv.CV_TM_CCORR)

このコードは非常に単純であると想定されていますが、次のエラーがスローされます。

OpenCV Error: Bad flag (parameter or structure field) (Unrecognized or unsupported array type) in cvGetMat, file /builddir/build/BUILD/OpenCV-2.1.0/src/cxcore/cxarray.cpp, line 2476
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
cv.error: Unrecognized or unsupported array type

イライラする数時間の試みの後、私はまだ立ち往生しています!誰か提案はありますか?

ところで、これは私のPythonバージョンの出力です:

Python 2.7 (r27:82500, Sep 16 2010, 18:03:06) 
[GCC 4.5.1 20100907 (Red Hat 4.5.1-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.

皆さん、ありがとうございました!

4

2 に答える 2

22

fftベースの相関法を使用するよりもはるかに高速になる可能性はほとんどありません。

import numpy
from scipy import signal

data_length = 8192

a = numpy.random.randn(data_length)
b = numpy.zeros(data_length * 2)

b[data_length/2:data_length/2+data_length] = a # This works for data_length being even

# Do an array flipped convolution, which is a correlation.
c = signal.fftconvolve(b, a[::-1], mode='valid') 

# Use numpy.correlate for comparison
d = numpy.correlate(a, a, mode='same')

# c will be exactly the same as d, except for the last sample (which 
# completes the symmetry)
numpy.allclose(c[:-1], d) # Should be True

今度は時間比較のために:

In [12]: timeit b[data_length/2:data_length/2+data_length] = a; c = signal.fftconvolve(b, a[::-1], mode='valid')
100 loops, best of 3: 4.67 ms per loop

In [13]: timeit d = numpy.correlate(a, a, mode='same')
10 loops, best of 3: 69.9 ms per loop

循環相関に対処できる場合は、コピーを削除できます。時間差は増加するにつれてdata_length増加します。

于 2012-09-07T19:58:10.670 に答える
3

OpenCVはfloat32形式ではなくuint8として画像を期待しているため、コードは失敗すると思います。cv2 pythonインターフェースの方が直感的に使用できる場合があります(ndarrayとCV Image形式間の自動変換)。

相関の速度については、高速fft実装を使用してみることができます(FFTWにはPythonラッパー:pyfftwがあります)。

于 2012-09-10T08:08:50.977 に答える