OpenCV3.0 - 模块没有属性SIFT

时间:2014-09-09 02:16:38

标签: opencv attributes matching sift

我正在使用Ubuntu 12.04。我最近从https://github.com/Itseez/opencv/archive/3.0.0-alpha.zip安装了OpenCV 3.0。我想进行功能匹配,我使用了以下代码:

import numpy as np
import cv2
from matplotlib import pyplot as plt

MIN_MATCH_COUNT = 10

img1 = cv2.imread('box.png',0)          # queryImage
img2 = cv2.imread('box_in_scene.png',0) # trainImage

# Initiate SIFT detector
sift = cv2.SIFT()

# find the keypoints and descriptors with SIFT
kp1, des1 = sift.detectAndCompute(img1,None)
kp2, des2 = sift.detectAndCompute(img2,None)

FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks = 50)

flann = cv2.FlannBasedMatcher(index_params, search_params)

matches = flann.knnMatch(des1,des2,k=2)

# store all the good matches as per Lowe's ratio test.
good = []
for m,n in matches:
    if m.distance < 0.7*n.distance:
        good.append(m)

if len(good)>MIN_MATCH_COUNT:
    src_pts = np.float32([ kp1[m.queryIdx].pt for m in good ]).reshape(-1,1,2)
    dst_pts = np.float32([ kp2[m.trainIdx].pt for m in good ]).reshape(-1,1,2)

    M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC,5.0)
    matchesMask = mask.ravel().tolist()

    h,w = img1.shape
    pts = np.float32([ [0,0],[0,h-1],[w-1,h-1],[w-1,0] ]).reshape(-1,1,2)
    dst = cv2.perspectiveTransform(pts,M)

    img2 = cv2.polylines(img2,[np.int32(dst)],True,255,3, cv2.CV_AA)

else:
    print "Not enough matches are found - %d/%d" % (len(good),MIN_MATCH_COUNT)
    matchesMask = None

draw_params = dict(matchColor = (0,255,0), # draw matches in green color
                   singlePointColor = None,
                   matchesMask = matchesMask, # draw only inliers
                   flags = 2)

img3 = cv2.drawMatches(img1,kp1,img2,kp2,good,None,**draw_params)

plt.imshow(img3, 'gray'),plt.show()

我收到以下错误:

Traceback (most recent call last):
  File "feature_matching.py", line 11, in <module>
    sift = cv2.SIFT()
AttributeError: 'module' object has no attribute 'SIFT'

为什么SIFT在OpenCV 3.0中不可用?如何将SIFT添加到OpenCV 3.0?任何帮助,将不胜感激。三江源。

PS。我尝试包含来自https://github.com/Itseez/opencv_contrib

的模块
$ cd <opencv_build_directory>
$ cmake -DOPENCV_EXTRA_MODULES_PATH=<opencv_contrib>/modules <opencv_source_directory>
$ make -j5
$ make install

6 个答案:

答案 0 :(得分:6)

  • 是的,您需要构建opencv_extra模块(尤其是xfeatures2d)。

  • 不要忘记在cmake / make步骤之后运行make install(你的新python模块必须复制到python / lib / sitelibs)

  • 在3.0中:cv2.xfeatures2d.SIFT(注意额外的命名空间)

答案 1 :(得分:0)

另一种可能性(也是我发现的最简单的一种)是安装已经包含SIFT和SURF算法的2.4.9版本。 你只需要这样做

import cv2
sift = cv2.SIFT()
(...)

答案 2 :(得分:0)

由于SIFT和SIRF由他们的创作者获得专利,这些描述符被移至opencv_contrib包。要使用它,您需要下载并安装两个软件包:original和contrib。

cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D INSTALL_C_EXAMPLES=ON \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \
    -D BUILD_EXAMPLES=ON ..

更多信息http://www.pyimagesearch.com/2015/07/16/where-did-sift-and-surf-go-in-opencv-3/

答案 3 :(得分:0)

有一个点源使这很容易。

如果您安装了另一个版本的opencv-python,请使用此命令将其删除以避免冲突:

pip卸载opencv-python 然后使用以下命令安装contrib版本:

pip install opencv-contrib-python SIFT用法:

导入cv2 sift = cv2.xfeatures2d.SIFT_create()

源:Can't use SURF, SIFT in OpenCV

答案 4 :(得分:0)

如上所述,您可以使用可通过pip获得的OpenCV的预编译版本:
pip install opencv-python

如果您要访问其他模块(例如实验模块),可以使用:
pip install opencv-contrib-python

如果需要非免费模块(SURF,SIFT和其他),则在执行上一条命令后将找不到该模块。您需要使用以下一个:
pip install opencv-contrib-python-nonfree

完整的模块列表(包括contrib和non-free,您可以在OpenCV docs中找到。

答案 5 :(得分:0)

尝试使用

sift = cv2.xfeatures2d.SIFT_create()