Ne peut pas utiliser SURF, SIFT dans OpenCV
j'essaie une chose simple comme
detector = cv2.SIFT()
et obtenir cette erreur de mauvais
detector = cv2.SIFT()
AttributeError: 'module' object has no attribute 'SIFT'
Je ne comprends pas cela parce que cv2 est installé.
cv2.__version__
$Rev: 4557 $
mon système est Ubuntu 12.04.
Peut-être que quelqu'un a eu le même problème et pourrait m'aider.
EDIT:
pour faire court, testypypypy.py:
import cv2
detector = cv2.SIFT()
erreur:
Traceback (most recent call last):
File "testypypy.py", line 3, in <module>
detector = cv2.SIFT()
AttributeError: 'module' object has no attribute 'SIFT
Si je prends SURF
cela fonctionne parce que SURF
dir(cv2)
mais si je prends aussi cv2.BFMatcher()
j'obtiens la même erreur... Il est donc manquant et je dois l'ajouter, mais je ne sais pas comment.
9 réponses
je pense que c'est loin d'être la façon "correcte" de le faire (la façon "correcte" sur Ubuntu semble être de s'en tenir à une OpenCV cassée et/ou périmée), mais pour moi construire opencv-2.4.6.1 à partir de la source ramène cv2.SIFT et cv2.SURF.
Mesures:
- télécharger opencv-2.4.6.1.tar.gz opencv.org.
extraire la source:
tar -xf opencv-2.4.6.1.tar.gz -C /tmp
Configurer la source. Cela va dire à OpenCV de s'installer dans .opencv-2.4.6.1 dans votre répertoire:
cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D BUILD_PYTHON_SUPPORT=ON \ -D WITH_XINE=ON \ -D WITH_OPENGL=ON \ -D WITH_TBB=ON \ -D BUILD_EXAMPLES=ON \ -D BUILD_NEW_PYTHON_SUPPORT=ON \ -D WITH_V4L=ON \ -D CMAKE_INSTALL_PREFIX=~/.opencv-2.4.6.1 \ /tmp/opencv-2.4.6.1
Construire et installer:
cd /tmp/opencv-2.4.6.1 make -j4 make install
Set PYTHONPATH (cela fonctionne en bash, Je n'ai aucune idée des autres shells):
export PYTHONPATH=~/.opencv-2.4.6.1/lib/python2.7/dist-packages
maintenant si je démarre python et que j'importe cv2 (pour moi, cela produit un avertissement gnome-keyring), j'ai cv2.SIFT et cv2.SURF disponible.
Pour des informations récentes sur cette question (à compter de Septembre 2015) consulter cette page.
la plupart des informations sur cette question ici sont obsolètes.
ce que pyimagesearch dit est que SURF / SIFT ont été déplacés à opencv_contrib
en raison de problèmes de brevet.
Pour l'installation il y a aussi un belle page qui vous indique comment installer opencv opencv_contrib
et le support Python donc vous obtenez SURF / SIFT.
notez que L'API aussi modifié. Maintenant c'est comme ceci:
sift = cv2.xfeatures2d.SIFT_create()
avant de trouver les pages ci-dessus, j'ai aussi beaucoup souffert. Mais les pages énumérées font un très bon travail d'aider à l'installation et d'expliquer ce qui ne va pas.
Il y a une source pip qui rend cela très facile.
si vous avez une autre version d'opencv-python installée, utilisez cette commande pour la supprimer afin d'éviter les conflits:
pip uninstall opencv-python
puis installez la version contrib avec ceci:
pip install opencv-contrib-python
TAMISER utilisation:
import cv2 sift = cv2.xfeatures2d.SIFT_create()
pour information, à partir de 3.0.0 L'EIPD et ses amis font partie d'un repo contrib situé à https://github.com/Itseez/opencv_contrib et ne sont pas inclus avec opencv par défaut.
pour les utilisateurs debian, il est "facile" de créer leur propre paquet libopencv-nonfree.
j'ai suivi le tutoriel opencv pour python, mais dans ma debian les modules SIFT et SURF manquaient. Et il n'y a pas de paquet non libre Disponible pour debian, y compris SIFT et SURF etc.
ils ont été retirés du paquet en raison de problèmes de licence....
Je n'ai jamais créé de paquet pour debian avant (ajout d'un nouveau module, etc.) mais j'ai suivi quelques petites étapes dans la des tutoriels debian et essayé et deviné un peu, et après 1 jour, voilà... je travaille sur un libopencv-nonfree2.4 paquets deb et un module python avec des fixations correctes.
(Je ne sais pas si j'avais aussi besoin d'installer le paquet python-opencv nouvellement construit ou seulement le paquet nonfree... j'ai réinstallé les deux et j'ai obtenu une bibliothèque opencv python qui fonctionne avec tous les modules non libres nécessaires!)
ok, elle est ici:
!c'est pour libopencv 2.4!
!vous peut faire toutes les étapes sauf installer comme un utilisateur normal!
nous avons besoin des essais construits et de quelques outils du dépôt debian pour compiler et créer un nouveau paquet:
sudo apt-get install build-essential fakeroot devscripts
créer un répertoire dans votre maison et changer à ce répertoire:
cd ~ && mkdir opencv-debian
cd opencv-debian
télécharger les paquets nécessaires:
apt-get source libopencv-core2.4
et télécharger tous les paquets de dépendances nécessaires pour construire la nouvelle opencv
apt-get build-dep libopencv-core2.4
cela permettra de télécharger les sources nécessaires et créez un répertoire appelé "opencv-2.4.9.1+dfsg"
changement de répertoire:
cd opencv-2.4.9.1+dfsg
maintenant vous pouvez tester si le paquet sera construit sans modifications en tapant:
fakeroot debian/rules binary
cela prendra beaucoup de temps! cette étape devrait se terminer sans erreurs vous avez maintenant beaucoup de .paquets deb dans votre répertoire opencv-debian
maintenant, nous apportons quelques modifications à la définition du paquet pour permettre à debian de compiler les modules non libres et package!
modifier le répertoire opencv-debian et télécharger la source opencv correcte.. dans mon cas opencv 2.4.9 environ!--20-->
j'ai eu le mien à partir de https://github.com/Itseez/opencv/releases
wget https://codeload.github.com/Itseez/opencv/tar.gz/2.4.9
ceci téléchargera opencv-2.4.9.tar.gz
extraire l'archive:
tar -xzvf opencv-2.4.9.tar.gz
ceci déballera la source originale dans un répertoire appelé opencv-2.4.9
maintenant copier les modules non libres de source originale de la source debian:
cp -rv opencv-2.4.9/modules/nonfree opencv-2.4.9.1+dfsg/modules/
ok, maintenant nous avons la source des modules non libres, mais ce n'est pas assez pour debian... nous devons modifier 1 fichier et en créer un nouveau
nous devons modifier le fichier de contrôle debian et d'ajouter une nouvelle section à la fin du fichier: (j'utilise mcedit comme éditeur ici)
mcedit opencv-2.4.9.1+dfsg/debian/control
ou utilisez un autre éditeur de votre choix
et ajouter cette section:
Package: libopencv-nonfree2.4
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: OpenCV Nonfree Modules like SIFT and SURF
This package contains nonfree modules for the OpenCV (Open Computer Vision)
library.
.
The Open Computer Vision Library is a collection of algorithms and sample
code for various computer vision problems. The library is compatible with
IPL (Intel's Image Processing Library) and, if available, can use IPP
(Intel's Integrated Performance Primitives) for better performance.
.
OpenCV provides low level portable data types and operators, and a set
of high level functionalities for video acquisition, image processing and
analysis, structural analysis, motion analysis and object tracking, object
recognition, camera calibration and 3D reconstruction.
maintenant nous créons un nouveau fichier appelé libopencv-nonfree2.4.installer
touch opencv-2.4.9.1+dfsg/debian/libopencv-nonfree2.4.install
et modifier:
mcedit opencv-2.4.9.1+dfsg/debian/libopencv-nonfree2.4.install
et ajoutez le contenu suivant:
usr/lib/*/libopencv_nonfree.so.*
ok, c'est ça, maintenant créer les paquets:
cd opencv-2.4.9.1+dfsg
d'abord un nettoyage:
fakeroot debian/rules clean
et construire:
fakeroot debian/rules binary
et le tour est joué... après un certain temps, vous avez une nouvelle place et un nouveau paquet libopencv-nonfree2.4.deb!
maintenant installez comme root:
dpkg -i libopencv-nonfree2.4.deb
dpkg -i python-opencv.deb
et tester!
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('test.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
sift = cv2.SIFT()
kp = sift.detect(gray,None)
img=cv2.drawKeypoints(gray,kp)
corners = cv2.goodFeaturesToTrack(gray,16,0.05,10)
corners = np.int0(corners)
for i in corners:
x,y = i.ravel()
cv2.circle(img,(x,y),90,255,3)
plt.imshow(img),plt.show()
amusez-vous!
puisque j'avais déjà compilé opencv quand j'ai découvert ce problème, tout ce que j'avais à faire était de (de mon opencv répertoire de construction):
make opencv_nonfree
sudo make install
jachère cette installation étape
http://jayrambhia.com/blog/install-opencv-2-4-in-ubuntu-12-04-precise-pangolin/
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local
-D WITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=ON
-D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON
-D BUILD_EXAMPLES=ON -D WITH_QT=ON -D WITH_OPENGL=ON ..
cette commande installera la bibliothèque dans votre fichier /usr/local/lib.
Install OpenCV-Contrib
import cv2 sift = cv2.xfeatures2d.SIFT_create()
sift.something()
c'est la façon facile d'installer le Contrib.
l'approche proposée par vizzy fonctionne également avec OpenCV 2.4.8, comme lors de la construction du paquet non-free sous Ubuntu 14.04 LTS.
ce problème de dépendance peut empêcher l'installation du paquet non libre:
libopencv-nonfree2.4 depends on libopencv-ocl2.4; however:
Package libopencv-ocl2.4 is not installed.
facilement réparable car le paquet manquant peut être installé à partir de ceux qui viennent d'être construits:
dpkg -i libopencv-ocl2.4_2.4.8+dfsg1-2ubuntu1_amd64.deb
après cela l'installation se poursuit comme expliqué dans la réponse de vizzy.