1. 程式人生 > 程式設計 >python實現影象拼接

python實現影象拼接

本文例項為大家分享了python實現影象拼接的具體程式碼,供大家參考,具體內容如下

1.待拼接的影象

python實現影象拼接

python實現影象拼接

2. 基於SIFT特徵點和RANSAC方法得到的影象特徵點匹配結果

python實現影象拼接

3.影象變換結果

python實現影象拼接

4.程式碼及注意事項

import cv2
import numpy as np
 
 
def cv_show(name,image):
  cv2.imshow(name,image)
  cv2.waitKey(0)
  cv2.destroyAllWindows()
 
 
def detectAndCompute(image):
  image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
  sift = cv2.xfeatures2d.SIFT_create()
  (kps,features) = sift.detectAndCompute(image,None)
  kps = np.float32([kp.pt for kp in kps]) # 得到的點需要進一步轉換才能使用
  return (kps,features)
 
 
def matchKeyPoints(kpsA,kpsB,featuresA,featuresB,ratio = 0.75,reprojThresh = 4.0):
  # ratio是最近鄰匹配的推薦閾值
  # reprojThresh是隨機取樣一致性的推薦閾值
  matcher = cv2.BFMatcher()
  rawMatches = matcher.knnMatch(featuresA,2)
  matches = []
  for m in rawMatches:
    if len(m) == 2 and m[0].distance < ratio * m[1].distance:
      matches.append((m[0].queryIdx,m[0].trainIdx))
  kpsA = np.float32([kpsA[m[0]] for m in matches]) # 使用np.float32轉化列表
  kpsB = np.float32([kpsB[m[1]] for m in matches])
  (M,status) = cv2.findHomography(kpsA,cv2.RANSAC,reprojThresh)
  return (M,matches,status) # 並不是所有的點都有匹配解,它們的狀態存在status中
 
 
def stich(imgA,imgB,M):
  result = cv2.warpPerspective(imgA,M,(imgA.shape[1] + imgB.shape[1],imgA.shape[0]))
  result[0:imageA.shape[0],0:imageB.shape[1]] = imageB
  cv_show('result',result)
 
 
def drawMatches(imgA,kpsA,status):
  (hA,wA) = imgA.shape[0:2]
  (hB,wB) = imgB.shape[0:2]
  # 注意這裡的3通道和uint8型別
  drawImg = np.zeros((max(hA,hB),wA + wB,3),'uint8')
  drawImg[0:hB,0:wB] = imageB
  drawImg[0:hA,wB:] = imageA
  for ((queryIdx,trainIdx),s) in zip(matches,status):
    if s == 1:
      # 注意將float32 --> int
      pt1 = (int(kpsB[trainIdx][0]),int(kpsB[trainIdx][1]))
      pt2 = (int(kpsA[trainIdx][0]) + wB,int(kpsA[trainIdx][1]))
      cv2.line(drawImg,pt1,pt2,(0,255))
  cv_show("drawImg",drawImg)
 
 
# 讀取影象
imageA = cv2.imread('./right_01.png')
cv_show("imageA",imageA)
imageB = cv2.imread('./left_01.png')
cv_show("imageB",imageB)
# 計算SIFT特徵點和特徵向量
(kpsA,featuresA) = detectAndCompute(imageA)
(kpsB,featuresB) = detectAndCompute(imageB)
# 基於最近鄰和隨機取樣一致性得到一個單應性矩陣
(M,status) = matchKeyPoints(kpsA,featuresB)
# 繪製匹配結果
drawMatches(imageA,imageB,status)
# 拼接
stich(imageA,M)

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。