Croix rapide méthode de corrélation en Python
J'ai été récemment en essayant de trouver un moyen rapide et efficace pour effectuer de la croix-vérifier la corrélation entre les deux tableaux à l'aide de langage Python. Après un peu de lecture, j'ai trouvé ces deux options:
- La
NumPy.correlate()
méthode, qui est trop lent quand il s'agit de tableaux de grande taille. - La
cv.MatchTemplate()
méthode, qui semble être beaucoup plus rapide.
Pour des raisons évidentes, j'ai choisi la deuxième option. J'ai essayé d'exécuter le code suivant:
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)
Même si ce code suppose d'être très simple, il génère l'erreur suivante:
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
Après quelques heures de frustrant tente, je suis toujours bloqué! Quelqu'un at-il une suggestion?
BTW, c'est ma version de Python de sortie:
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.
Merci à vous tous!
Il y a un certain nombre de suggestions ici: stackoverflow.com/questions/6991471/...
J'ai déjà lu ce post, merci. Comme je l'ai dit, je ne veux pas utiliser le NumPy\SciPy bibliothèques, car ils offrent une assez lent méthodes.
Bien que numpy/scipy n'utilisez pas toujours la manière la plus rapide de mise en œuvre, ils ne sont pas généralement lente. Par exemple, leur FFT n'est pas aussi rapide que certains (c'est pourquoi j'ai écrit mon FFTW wrappers). Le point est, ne vous attendez pas à une magique augmentation de la vitesse à l'aide d'OpenCV rapport à l'aide de la "corriger" l'algorithme avec numpy/scipy. Numpy/scipy sont assez omniprésent, qui est un gros plus.
J'ai déjà lu ce post, merci. Comme je l'ai dit, je ne veux pas utiliser le NumPy\SciPy bibliothèques, car ils offrent une assez lent méthodes.
Bien que numpy/scipy n'utilisez pas toujours la manière la plus rapide de mise en œuvre, ils ne sont pas généralement lente. Par exemple, leur FFT n'est pas aussi rapide que certains (c'est pourquoi j'ai écrit mon FFTW wrappers). Le point est, ne vous attendez pas à une magique augmentation de la vitesse à l'aide d'OpenCV rapport à l'aide de la "corriger" l'algorithme avec numpy/scipy. Numpy/scipy sont assez omniprésent, qui est un gros plus.
OriginalL'auteur Shlomi | 2012-09-07
Vous devez vous connecter pour publier un commentaire.
Vous êtes peu probable d'obtenir beaucoup plus rapidement qu'à l'aide d'une fft en fonction de corrélation de la méthode.
Maintenant pour une comparaison du temps:
Si vous pouvez faire face à une circulaire de corrélation, vous pouvez supprimer la copie. La différence de temps augmentera à mesure que
data_length
augmente.Aucune idée, je n'ai pas utilisé d'OpenCV.
OriginalL'auteur Henry Gomersall
Je crois que votre code ne fonctionne pas parce que OpenCV attend images comme uint8 et pas float32 format.
Vous pouvez trouver le cv2 python interface plus intuitive (conversion automatique entre ndarray et CV formats d'Image).
Comme pour la vitesse de la corrélation, vous pouvez essayer d'utiliser un rapide fft mise en œuvre (FFTW a un wrapper python : pyfftw).
Merci ! L'air prometteur en effet.
OriginalL'auteur Nicolas Barbey