python實現影象拼接
阿新 • • 發佈:2020-03-05
本文例項為大家分享了python實現影象拼接的具體程式碼,供大家參考,具體內容如下
1.待拼接的影象
2. 基於SIFT特徵點和RANSAC方法得到的影象特徵點匹配結果
3.影象變換結果
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)
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。