python3.6 windows安裝python-contrib-opencv安裝及提取影象的SIFT特徵
#前言
最近幾天在做水果分類的一個Project,看到有人說SIFT特徵比較有用。由於Project的其他部分都是在python中完成的,所以想在python中提取影象的SIFT特徵。上網上一查立馬就發現了很多程式碼,原來python的opencv庫就封裝後SIFT演算法。遂覺容易。哪知道安裝個包就折騰了一個多小時。再次記錄艱苦的填坑歷程。
第一坑:AttributeError: module ‘cv2.cv2’ has no attribute ‘SIFT’
首先去網上搜索 python 提取圖片的sift特徵
會發現有很多帖子,首先找了一個最簡單的,打算先試試,閾值選擇了Python中利用Scipy包的SIFT方法進行圖片識別的例項教程
#coding=utf-8
import cv2
import scipy as sp
img1 = cv2.imread('x1.jpg',0) # queryImage
img2 = cv2.imread('x2.jpg',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 parameters
FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks=50) # or pass empty dictionary
flann = cv2.FlannBasedMatcher(index_params,search_params)
matches = flann.knnMatch(des1, des2,k=2)
print 'matches...',len(matches)
# Apply ratio test
good = []
for m,n in matches:
if m.distance < 0.75*n.distance:
good.append(m)
print 'good',len(good)
# #####################################
# visualization
h1, w1 = img1.shape[:2]
h2, w2 = img2.shape[:2]
view = sp.zeros((max(h1, h2), w1 + w2, 3), sp.uint8)
view[:h1, :w1, 0] = img1
view[:h2, w1:, 0] = img2
view[:, :, 1] = view[:, :, 0]
view[:, :, 2] = view[:, :, 0]
for m in good:
# draw the keypoints
# print m.queryIdx, m.trainIdx, m.distance
color = tuple([sp.random.randint(0, 255) for _ in xrange(3)])
#print 'kp1,kp2',kp1,kp2
cv2.line(view, (int(kp1[m.queryIdx].pt[0]), int(kp1[m.queryIdx].pt[1])) , (int(kp2[m.trainIdx].pt[0] + w1), int(kp2[m.trainIdx].pt[1])), color)
cv2.imshow("view", view)
cv2.waitKey()
複製程式碼後發現sift = cv2.SIFT()
這行程式碼有錯誤,AttributeError: module 'cv2.cv2' has no attribute 'SIFT'
。於是繼續把錯誤提示貼上到百度搜索。
第二坑:‘module’ object has no attribute ‘xfeatures2d’
搜尋後發現,新版本的opencv下,SIFT API的使用方法改變了,於是在SIFT影象特徵提取 python3.4 + opencv3.1.0程式碼這篇部落格中找了一個新版本的例子再試一下。程式碼如下:
import cv2
import numpy as np
#read image
img = cv2.imread('test.jpg', cv2.IMREAD_COLOR)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('origin',img)
#SIFT
sift= cv2.xfeatures2d.SIFT_create()
keypoints = sift.detect(gray, None)
#kp, des = sift.detectAndCompute(gray,None) #des是描述子,for match, should use des, bf = cv2.BFMatcher();smatches = bf.knnMatch(des1,des2, k=2
cv2.drawKeypoints(gray, keypoints, img)
cv2.imshow('testSift', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
複製程式碼後發現sift= cv2.xfeatures2d.SIFT_create()
這行程式碼有錯誤,module' object has no attribute 'xfeatures2d
。於是繼續把錯誤提示貼上到百度搜索。
第三坑:PermissionError: [Errno 13] Permission denied: ‘D:\Anaconda3\Lib\site-packages\cv2\cv2.cp36-win_amd64.pyd’
搜尋後同樣看到很多帖子和部落格,閱讀後發現是python-opencv並沒有包含SIFT的API,需要安裝opencv-contrib-python。看到有人說需要先使用pip uninstall opencv-python
解除安裝opencv-python。我就索性先不解除安裝,如果報錯再進行解除安裝。於是使用pip install contrib-opencv-python
安裝。結果出現如下異常:PermissionError: [Errno 13] Permission denied: 'D:\\Anaconda3\\Lib\\site-packages\\cv2\\cv2.cp36-win_amd64.pyd'
。
我感到很奇怪,之前使用pip安裝庫從來沒有初選過這種許可權拒絕的資訊。再次百度異常資訊。
第四坑:PermissionError: [WinError 5] 拒絕訪問。: ‘d:\anaconda3\lib\site-packages\cv2\cv2.cp36-win_amd64.pyd’
這次搜尋到的資訊就非常雜亂了,使用百度和google都沒找到很好的解決方法。有人說要使用管理員執行cmd.exe,我嘗試了,不行。看到報錯資訊是anaconda的某個檔案訪問不到,修改Anaconda安裝路徑的目錄許可權,還是不行。於是我想到之前有人提到的需要先解除安裝python-opencv再安裝python-contrib-opencv,於是嘗試pip uninstall python-opencv
先解除安裝python-opencv。結果,解除安裝python-opencv也有許可權問題:PermissionError: [WinError 5] 拒絕訪問。: 'd:\\anaconda3\\lib\\site-packages\\cv2\\cv2.cp36-win_amd64.pyd'
。
這就尷尬了,解除安裝不讓解除安裝,安裝不讓安裝。再次百度異常資訊。
填坑
百度後找到如下部落格windows系統下Python安裝或升級模組報錯:PermissionError: [WinError 5] 拒絕訪問。的解決辦法.看到在pip install
後新增--user
引數就解決了問題。於是我想到在安裝python-contrib-opencv時新增--user
引數。執行pip install --user python-contrib-opencv
安裝成功。
然後執行第二坑中的程式碼就成功了。接下來還要研究提取的SIFT特徵怎麼使用。
總結
原來加個引數就能解決的問題,我卻饒了這麼一大圈子,人生如此艱難,一定要愛護程式設計師。