1. 程式人生 > 程式設計 >opencv-python 提取sift特徵並匹配的例項

opencv-python 提取sift特徵並匹配的例項

我就廢話不多說,直接上程式碼吧!

# -*- coding: utf-8 -*-
import cv2
import numpy as np
from find_obj import filter_matches,explore_match
from matplotlib import pyplot as plt
 
def getSift():
  '''
  得到並檢視sift特徵
  '''
  img_path1 = '../../data/home.jpg'
  #讀取影象
  img = cv2.imread(img_path1)
  #轉換為灰度圖
  gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
  #建立sift的類
  sift = cv2.SIFT()
  #在影象中找到關鍵點 也可以一步計算#kp,des = sift.detectAndCompute
  kp = sift.detect(gray,None)
  print type(kp),type(kp[0])
  #Keypoint資料型別分析 http://www.cnblogs.com/cj695/p/4041399.html
  print kp[0].pt
  #計算每個點的sift
  des = sift.compute(gray,kp)
  print type(kp),type(des)
  #des[0]為關鍵點的list,des[1]為特徵向量的矩陣
  print type(des[0]),type(des[1])
  print des[0],des[1]
  #可以看出共有885個sift特徵,每個特徵為128維
  print des[1].shape
  #在灰度圖中畫出這些點
  img=cv2.drawKeypoints(gray,kp)
  #cv2.imwrite('sift_keypoints.jpg',img)
  plt.imshow(img),plt.show()
 
def matchSift():
  '''
  匹配sift特徵
  '''
  img1 = cv2.imread('../../data/box.png',0) # queryImage
  img2 = cv2.imread('../../data/box_in_scene.png',0) # trainImage
  sift = cv2.SIFT()
  kp1,des1 = sift.detectAndCompute(img1,None)
  kp2,des2 = sift.detectAndCompute(img2,None)
  # 蠻力匹配演算法,有兩個引數,距離度量(L2(default),L1),是否交叉匹配(預設false)
  bf = cv2.BFMatcher()
  #返回k個最佳匹配
  matches = bf.knnMatch(des1,des2,k=2)
  # cv2.drawMatchesKnn expects list of lists as matches.
  #opencv2.4.13沒有drawMatchesKnn函式,需要將opencv2.4.13\sources\samples\python2下的common.py和find_obj檔案放入當前目錄,並匯入
  p1,p2,kp_pairs = filter_matches(kp1,kp2,matches)
  explore_match('find_obj',img1,img2,kp_pairs) # cv2 shows image
  cv2.waitKey()
  cv2.destroyAllWindows()
 
def matchSift3():
  '''
  匹配sift特徵
  '''
  img1 = cv2.imread('../../data/box.png',k=2)
  # cv2.drawMatchesKnn expects list of lists as matches.
  #opencv3.0有drawMatchesKnn函式
  # Apply ratio test
  # 比值測試,首先獲取與A 距離最近的點B(最近)和C(次近),只有當B/C
  # 小於閾值時(0.75)才被認為是匹配,因為假設匹配是一一對應的,真正的匹配的理想距離為0
  good = []
  for m,n in matches:
    if m.distance < 0.75 * n.distance:
      good.append([m])
  img3 = cv2.drawMatchesKnn(img1,kp1,good[:10],None,flags=2)
  cv2.drawm
  plt.imshow(img3),plt.show()
 
matchSift()

以上這篇opencv-python 提取sift特徵並匹配的例項就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。