Python+OpenCV學習(9)---SIFT
阿新 • • 發佈:2019-02-13
利用python學習OpenCV,個人感覺比較方便。函式的形式與C++基本相同,所以切換過來還是比較好的,對於像我這種對python不太熟練的人,使用python的整合開發環境PyCharm進行學習,可以設定斷點除錯,有助於我這類初學者理解掌握。
下面是利用python語言結合OpenCV進行SIFT特徵檢測的程式碼:
# -*- coding:utf-8 -*- __author__ = 'Microcosm' import cv2 import numpy as np img = cv2.imread("E:\python\Python Project\opencv_showimage\images\lena.jpg") gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) sift = cv2.SIFT() # kp 是所有128特徵描述子的集合 kp = sift.detect(gray, None) print len(kp) # 找到後可以計算關鍵點的描述符 Kp,res = sift.compute(gray, kp) print Kp # 特徵點的描述符 print res # 是特徵點個數*128維的矩陣 # 還可以用下面的函式直接檢測並返回特徵描述符 kp2,res1 = sift.detectAndCompute(gray,None) print "******************************" print res1 img = cv2.drawKeypoints(img, kp, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow("sift", img) cv2.waitKey(0) cv2.destroyAllWindows()
注:opencv 的版本不能太低,否則無法使用cv2.SIFT()這個函式,程式會報錯,我的是Opencv2.4.9的,沒問題,下面是執行的結果:
python3.0 以上版本配合opencv3.0以上的版本
SIFT及SURF等都被整合到contrib中,所以與之前的版本要區分開
import cv2 import numpy as np img = cv2.imread('lena.jpg') gray = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY) siftDetector = cv2.xfeatures2d.SIFT_create(100) kp,res = siftDetector.detectAndCompute(gray,None) print(len(kp)) print(res) img = cv2.drawKeypoints(img,outImage=img,keypoints=kp, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow("sift",img) cv2.waitKey(0) cv2.destroyAllWindows()