1. 程式人生 > >python3.6 windows安裝python-contrib-opencv安裝及提取影象的SIFT特徵

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特徵怎麼使用。
這裡寫圖片描述
這裡寫圖片描述

總結

原來加個引數就能解決的問題,我卻饒了這麼一大圈子,人生如此艱難,一定要愛護程式設計師。

參考部落格