我正在使用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
答案 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()
答案 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()