web-dev-qa-db-fra.com

Impossible d'utiliser SURF, SIFT dans OpenCV

J'essaye une chose simple comme

detector = cv2.SIFT()

et obtenez cette mauvaise erreur

detector = cv2.SIFT()
AttributeError: 'module' object has no attribute 'SIFT'

Je ne comprends pas cela parce que CV2 est installé.

cv2.__version__ Est

$Rev: 4557 $

Mon système est Ubuntu 12.04.

Peut-être que quelqu'un a le même problème et pourrait m'aider.

EDIT:

Histoire longue, 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 est dans dir(cv2) mais si je prends aussi cv2.BFMatcher(), je reçois la même erreur ... Donc, il manque et je dois l'ajouter mais je ne sais pas comment.

49
Linda

Je pense que c'est loin d'être le "bon" moyen de le faire (le "bon" moyen sous Ubuntu semble être de s'en tenir à un OpenCV cassé et/ou obsolète), mais pour moi, construire l'opencv-2.4.6.1 à partir de la source nous ramène cv2.SIFT et cv2.SURF.

Pas:

  1. Téléchargez opencv-2.4.6.1.tar.gz depuis opencv.org .
  2. Extraire la source:

    tar -xf opencv-2.4.6.1.tar.gz -C /tmp
    
  3. Configurez la source. Cela indiquera à OpenCV de s’installer dans .opencv-2.4.6.1 dans votre répertoire personnel:

    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
    
  4. Construire et installer:

    cd /tmp/opencv-2.4.6.1
    make -j4
    make install
    
  5. Réglez PYTHONPATH (cela fonctionne à bash, je n'ai aucune idée sur les autres coquilles):

    export PYTHONPATH=~/.opencv-2.4.6.1/lib/python2.7/dist-packages
    

Maintenant, si je lance python et importe cv2 (pour moi, cela génère un avertissement gnome-keyring)), j’ai cv2.SIFT et cv2.SURF disponibles.

24
Mårten W

Pour des informations récentes sur ce sujet (à compter de septembre 2015), consultez cette page .

La plupart des informations sur cette question ici sont obsolètes.

Ce que pyimagesearch dit, c'est que SURF/SIFT ont été déplacés vers opencv_contrib à cause de problèmes de brevets.

Pour l’installation, il y a aussi un Belle page qui vous explique comment installer opencv avec opencv_contrib and Python supporte donc l’utilisation de SURF/SIFT.

Notez que l'API a également changé. Maintenant c'est comme ça:

sift = cv2.xfeatures2d.SIFT_create()

Avant de trouver les pages ci-dessus, j'ai également beaucoup souffert. Mais les pages répertoriées font un très bon travail d’aide à l’installation et expliquent ce qui ne va pas.

56
Stefan Savev

Il existe une source pip qui rend cela très facile.

  1. 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
    
  2. Puis installez la version contrib avec ceci:

    pip install opencv-contrib-python
    
  3. Utilisation SIFT:

    import cv2
    sift = cv2.xfeatures2d.SIFT_create()
    
56
Tripp Cannella

Pour info, à compter de la version 3.0.0, EIFT et ses amis sont dans un dépôt de contribution situé à l’adresse https://github.com/Itseez/opencv_contrib et ne sont pas inclus avec opencv par défaut.

28
Spechal

pour les utilisateurs de debian, il est "facile" de créer leur propre paquet libopencv-nonfree.

j'ai suivi le tutoriel d'openv pour python, mais dans ma version debian, les modules SIFT et SURF étaient manquants. 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 colis en raison de problèmes de licence ...

je n'avais jamais créé de paquet pour Debian auparavant (ajout d'un nouveau module, etc.), mais j'ai suivi quelques étapes dans les tutoriels Debian et j'ai essayé et deviné un peu, et après 1 jour, voila ... j'ai eu à travailler avec libopencv-nonfree2. 4 paquet deb et un module python avec les liaisons correctes).

(Je ne sais pas si j'ai aussi besoin d'installer le paquet python-opencv nouvellement construit ou seulement le fichier non-libre ... J'ai réinstallé les deux et j'ai obtenu une python opencv avec tous les modules non-libres nécessaires !)

ok, le voici:

! Ceci est pour libopencv 2.4!

! vous pouvez faire toutes les étapes sauf l'installation en tant qu'utilisateur normal!

nous avons besoin des essesntials construits et de certains outils du référentiel Debian pour compiler et créer un nouveau paquet:

Sudo apt-get install build-essential fakeroot devscripts

créez un répertoire dans votre maison et accédez à ce répertoire:

cd ~ && mkdir opencv-debian
cd opencv-debian

télécharger les packages nécessaires:

apt-get source libopencv-core2.4

et téléchargez tous les paquets de dépendance nécessaires pour construire le nouvel opencv

apt-get build-dep libopencv-core2.4

cela téléchargera les sources nécessaires et créera un répertoire appelé "opencv-2.4.9.1 + dfsg"

passer à ce répertoire:

cd opencv-2.4.9.1+dfsg

vous pouvez maintenant 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 erreur, 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 et le paquet non-libres!

allez dans le répertoire opencv-debian et téléchargez le bon code source opencv .. dans mon cas, opencv 2.4.9 ou plus

j'ai eu le mien de https://github.com/Itseez/opencv/releases

wget https://codeload.github.com/Itseez/opencv/tar.gz/2.4.9

cela téléchargera opencv-2.4.9.tar.gz

extraire l'archive:

tar -xzvf opencv-2.4.9.tar.gz

cela décompactera la source originale dans un répertoire appelé opencv-2.4.9

maintenant, copiez les modules non libres de la source originale vers 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 suffisant pour debian ... nous devons modifier 1 fichier et en créer un nouveau

nous devons éditer le fichier de contrôle debian et 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 ajoutez 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.install

touch opencv-2.4.9.1+dfsg/debian/libopencv-nonfree2.4.install

et éditer:

mcedit opencv-2.4.9.1+dfsg/debian/libopencv-nonfree2.4.install

et ajoutez le contenu suivant:

usr/lib/*/libopencv_nonfree.so.*

ok, ça y est, créez à nouveau les packages:

cd opencv-2.4.9.1+dfsg

d'abord un nettoyage:

fakeroot debian/rules clean

et construire:

fakeroot debian/rules binary

et voila ... après un moment, vous avez un nouveau paquet et un nouveau paquet libopencv-nonfree2.4.deb!

installez maintenant en tant que root:

dpkg -i libopencv-nonfree2.4.deb
dpkg -i python-opencv.deb

et testez!

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

s'amuser!

8
vizzy

comme j'avais déjà compilé OpenCV quand j'ai découvert ce problème, tout ce que je devais faire était (à partir de mon répertoire de construction OpenCTV):

make opencv_nonfree
Sudo make install
2
nmz787

En tant qu'utilisateur Anaconda, je voulais trouver une ou deux commandes appropriées pour résoudre le problème. Heureusement, ceci réponse a aidé. Pour la version 4.5.11 (utilisez conda -V pour vérifier la version d'Anaconda) J'ai effectué les étapes suivantes:

# Python version does not matter, most likely, check yourself
conda create -n myenv python=3.6     
conda activate myenv
conda install -c menpo opencv

Cela installera OpenCV 2.4.11. Anaconda est un autre commandeconda install -c menpo opencv3 installera OpenCV3, mais Python doit être rétrogradé à la version 2.7. Pour installer OpenCV3 avec Python3, utilisez ensuite (en raison du premier lien):

conda create -n myenv python  
pip install opencv-python==3.4.2.16
pip install opencv-contrib-python==3.4.2.16

Vérifiez l'EIFT:

conda activate myenv
python
>>> cv2.xfeatures2d.SIFT_create()
<xfeatures2d_SIFT 000002A3478655B0>
2
A.Ametov
  1. Installer OpenCV-Contrib

  2. import cv2 sift = cv2.xfeatures2d.SIFT_create()

  3. sift.something()

C'est le moyen facile d'installer Contrib.

1
user8396116

suivre cette étape d'installation

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 ..

utiliser cette commande installera la librairie sur votre/usr/local/lib.

1
madan ram

Dans opencv3.x, SIFT () et SURF () n’existent plus.

désinstaller toutes les versions d'opencv

python -m pip uninstall opencv-python

python -m pip uninstall opencv-contrib-python

après cela, installez opencv-contrib pour inclure sift () et surf () en utilisant la commande ci-dessous avec python (3.x)

python -m pip install opencv-contrib-python==3.4.2.16

alors vous pouvez utiliser

sift = cv2.xfeatures2d.SIFT_create()
1
Priyansh gupta

L'approche suggérée par vizzy fonctionne également avec OpenCV 2.4.8, comme lors de la construction du paquet non libre 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

Ensuite, l’installation se déroule comme expliqué dans la réponse de vizzy.

0
Joe Futrelle

Il suffit de changer la version d’opencv en 3.4.2.16. S’il est breveté, il n’est pas disponible dans la nouvelle version.

0
ankita singh

Aucune des solutions suggérées ci-dessus n'a fonctionné pour moi. J'utilise Anaconda et j'ai constaté que Sift était toujours activé dans la version 3.3.1. Si vous voulez tester dans un environnement isolé, essayez ce qui suit, inspiré de la réponse de @ A.Ametov ci-dessus.

conda create -n testenv opencv=3.3.1     
conda activate testenv

conda activate myenv
python
#Check version of opencv being used
>>> import cv2
>>> cv2.__version__
#Check if Sift is available
>>> cv2.xfeatures2d.SIFT_create()
<xfeatures2d_SIFT 000002A3478655B0>
0
Vik

Changer ceci:

sift = cv2.xfeatures2d.SIFT_create()

Par ceci:

cv2.ORB_create()
0
Saulo