Python创建SIFT遇AttributeError:模块无SIFT_create属性求助
Hey there! Let's break down why you're getting that AttributeError: module 'cv2.cv2' has no attribute 'SIFT_create' error when running your feature matching code.
The Root Cause: OpenCV Version & SIFT's Module Placement
SIFT (Scale-Invariant Feature Transform) had patent restrictions until 2020, which changed where it's located in OpenCV across versions:
- OpenCV 2.x: You’d use
cv2.SIFT()directly (this is what your original code tried, but this syntax is long deprecated). - OpenCV 3.x to 4.3: SIFT was moved to the
opencv-contrib-pythonpackage (extra contributed modules), so you had to call it viacv2.xfeatures2d.SIFT_create(). - OpenCV 4.4+ (post-patent expiration): SIFT was moved back to the main OpenCV module, so
cv2.SIFT_create()works—but only if you have the full package installed.
Step-by-Step Fixes
Install/Update the Right OpenCV Packages
If you only installedopencv-python, you’re missing the contrib modules (required for SIFT in older versions, and useful for other features). Run this in your terminal to get both core and contrib packages:pip install --upgrade opencv-python opencv-contrib-pythonCheck Your OpenCV Version
First, confirm which version you’re using to pick the correct SIFT initialization:import cv2 print(cv2.__version__)- For 4.4 or newer: Use
cv2.SIFT_create() - For 3.x to 4.3: Use
cv2.xfeatures2d.SIFT_create()
- For 4.4 or newer: Use
Full Corrected Code Example
Here’s a version that works across most modern OpenCV releases, with a fallback for older versions:import numpy as np import cv2 from matplotlib import pyplot as plt img1 = cv2.imread('or1.jpg', 0) img2 = cv2.imread('dm1.jpg', 0) # Initialize SIFT with version fallback try: sift = cv2.SIFT_create() except AttributeError: sift = cv2.xfeatures2d.SIFT_create() kp1, des1 = sift.detectAndCompute(img1, None) kp2, des2 = sift.detectAndCompute(img2, None) bf = cv2.BFMatcher() matches = bf.knnMatch(des1, des2, k=2) good = [] for m, n in matches: if m.distance < 0.75 * n.distance: good.append([m]) # Added None as the output image parameter to match modern syntax img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good, None, flags=2) plt.imshow(img3), plt.show()
Why Your Original Code Failed
- Your first attempt used
sift = cv2.SIFT()—this is outdated syntax that only works in very old OpenCV 2.x versions. - When you switched to
cv2.SIFT_create(), if you didn’t have the correct OpenCV package (either missing contrib for older versions, or an outdated main package), Python couldn’t locate the function, hence the AttributeError.
内容的提问来源于stack exchange,提问作者Humair Mannan

