三、全景拼接

一、項目所涉及到的一些知識點

Ⅰ,BF(Brute-Force)暴力匹配:把兩張圖像的特征點全部給算出來,然后使用歸一化的歐氏距離比較這兩張圖像上特征點之間的大小關系,越小越相似。

SIFT算法

import cv2
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
def cv_show(name,img):cv2.imshow(name,img)cv2.waitKey(0)cv2.destroyAllWindows()
image1 = cv2.imread("book1.jpg")
image2 = cv2.imread("book2.jpg")
cv_show('image1',image1)
cv_show('image2',image2)
sift = cv2.xfeatures2d.SIFT_create()#SIFT構造特征
kp1,des1 = sift.detectAndCompute(image1,None)#計算圖像的關鍵點并且去計算特征向量
kp2,des2 = sift.detectAndCompute(image2,None)#得到kp1圖像的特征點、des特征點所對應的特征向量
bf = cv2.BFMatcher(crossCheck=True)

在這里插入圖片描述在這里插入圖片描述

1對1匹配
matches = bf.match(des1,des2)
matches = sorted(matches,key=lambda x : x.distance)#因為獲取到的特征太多了,這里根據相似程度來進行排序
image3 = cv2.drawMatches(image1,kp1,image2,kp2,matches[:10],None,flags=2)#將圖像的關鍵點相近的進行連接在一塊,把相似的關鍵點前十給繪制出來
cv_show('image3',image3)

在這里插入圖片描述

1對K匹配
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1,des2,k=2)#一個特征點找打與它2個相近的點
good = []
for m,n in matches:#將關鍵點進行過濾操作if m.distance < 0.75*n.distance:good.append([m])
image3 = cv2.drawMatchesKnn(image1,kp1,image2,kp2,good,None,flags=2)
cv_show('image3',image3)

在這里插入圖片描述

Ⅱ,RANSAC(Random sample consensus)隨機抽樣一致算法

最小二乘法

回歸算法中有最小二乘法,也就是有一些數據點,需要進行擬合這些數據點,擬合的函數要盡可能多的去滿足所有的數據點。
由于最小二乘法為了滿足所有的數據點,此時擬合的函數并不是特別理想的,因為有一些噪音點進行了誤導。
在這里插入圖片描述
在這里插入圖片描述

RANSAC

RANSAC效果就顯然好多了,因為它不受一些噪音點的誤導。
在這里插入圖片描述
在這里插入圖片描述
RANSAC算法思路:選擇初始樣本點進行擬合,給定一個容忍范圍,不斷的進行更新迭代。
例如:初始樣本點的格式為2
在這里插入圖片描述
設置容忍范圍,也就是這個線周圍的虛線,這里找到有9個點屬于局內點,是自己人,在容忍范圍之內
在這里插入圖片描述
接下來接著迭代,找到8個局內點,在容忍范圍內,以此類推一直迭代,直到最后找出在容忍范圍內擬合點最多的那一條曲線,就是最后求解的擬合曲線。
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

單應性矩陣

圖像可以通過單應性矩陣進行空間維度的變換,一般為3*3的矩陣,為了歸一化方便,最后一個值常設置為1。即,單應性矩陣需要求解8個未知數,,需要8個方程,最少需要4對特征點。
在這里插入圖片描述
為了構建單應性矩陣最少需要4對特征點,但是選取哪幾對特征點好呢?圖片進行暴力匹配之后會有很多的特征點,但是并不是所有的特征點都是正確的,故需要通過RANSAC算法進行篩選出效果最好的4對特征點來進行構建單應性矩陣。

二、完整代碼

from Stitcher import Stitcher
import numpy as np
import cv2class Stitcher:# 拼接函數def stitch(self, images, ratio=0.75, reprojThresh=4.0, showMatches=False):# 獲取輸入圖片(imageB, imageA) = images# 檢測A、B圖片的SIFT關鍵特征點,并計算特征描述子(kpsA, featuresA) = self.detectAndDescribe(imageA)(kpsB, featuresB) = self.detectAndDescribe(imageB)# 匹配兩張圖片的所有特征點,返回匹配結果M = self.matchKeypoints(kpsA, kpsB, featuresA, featuresB, ratio, reprojThresh)# 如果返回結果為空,沒有匹配成功的特征點,退出算法if M is None:return None# 否則,提取匹配結果# H是3x3視角變換矩陣(matches, H, status) = M# 將圖片A進行視角變換,result是變換后圖片result = cv2.warpPerspective(imageA, H, (imageA.shape[1] + imageB.shape[1], imageA.shape[0]))self.cv_show('result', result)# 將圖片B傳入result圖片最左端result[0:imageB.shape[0], 0:imageB.shape[1]] = imageBself.cv_show('result', result)# 檢測是否需要顯示圖片匹配if showMatches:# 生成匹配圖片vis = self.drawMatches(imageA, imageB, kpsA, kpsB, matches, status)# 返回結果return (result, vis)# 返回匹配結果return resultdef cv_show(self, name, img):cv2.imshow(name, img)cv2.waitKey(0)cv2.destroyAllWindows()def detectAndDescribe(self, image):# 將彩色圖片轉換成灰度圖gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 建立SIFT生成器descriptor = cv2.xfeatures2d.SIFT_create()# 檢測SIFT特征點,并計算描述子(kps, features) = descriptor.detectAndCompute(image, None)# 將結果轉換成NumPy數組kps = np.float32([kp.pt for kp in kps])# 返回特征點集,及對應的描述特征return (kps, features)def matchKeypoints(self, kpsA, kpsB, featuresA, featuresB, ratio, reprojThresh):# 建立暴力匹配器matcher = cv2.BFMatcher()# 使用KNN檢測來自A、B圖的SIFT特征匹配對,K=2rawMatches = matcher.knnMatch(featuresA, featuresB, 2)matches = []for m in rawMatches:# 當最近距離跟次近距離的比值小于ratio值時,保留此匹配對if len(m) == 2 and m[0].distance < m[1].distance * ratio:# 存儲兩個點在featuresA, featuresB中的索引值matches.append((m[0].trainIdx, m[0].queryIdx))# 當篩選后的匹配對大于4時,計算視角變換矩陣if len(matches) > 4:# 獲取匹配對的點坐標ptsA = np.float32([kpsA[i] for (_, i) in matches])ptsB = np.float32([kpsB[i] for (i, _) in matches])# 計算視角變換矩陣(H, status) = cv2.findHomography(ptsA, ptsB, cv2.RANSAC, reprojThresh)# 返回結果return (matches, H, status)# 如果匹配對小于4時,返回Nonereturn Nonedef drawMatches(self, imageA, imageB, kpsA, kpsB, matches, status):# 初始化可視化圖片,將A、B圖左右連接到一起(hA, wA) = imageA.shape[:2](hB, wB) = imageB.shape[:2]vis = np.zeros((max(hA, hB), wA + wB, 3), dtype="uint8")vis[0:hA, 0:wA] = imageAvis[0:hB, wA:] = imageB# 聯合遍歷,畫出匹配對for ((trainIdx, queryIdx), s) in zip(matches, status):# 當點對匹配成功時,畫到可視化圖上if s == 1:# 畫出匹配對ptA = (int(kpsA[queryIdx][0]), int(kpsA[queryIdx][1]))ptB = (int(kpsB[trainIdx][0]) + wA, int(kpsB[trainIdx][1]))cv2.line(vis, ptA, ptB, (0, 255, 0), 1)# 返回可視化結果return vis# 讀取拼接圖片
imageA = cv2.imread("left.jpg")
imageB = cv2.imread("right.jpg")# 把圖片拼接成全景圖
stitcher = Stitcher()
(result, vis) = stitcher.stitch([imageA, imageB], showMatches=True)# 顯示所有圖片
cv2.imshow("Image A", imageA)
cv2.imshow("Image B", imageB)
cv2.imshow("Keypoint Matches", vis)
cv2.imshow("Result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/377875.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/377875.shtml
英文地址,請注明出處:http://en.pswp.cn/news/377875.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

找回自建SVN密碼

自建了一個SVN Repo自己用。重裝系統之后密碼忘了。 經過了漫長的Google過程&#xff0c;才知道Repo中的密碼居然是明文保存的。 在yourRepoDir/conf/svnserve.conf下的password-db處設置&#xff0c;通常是yourRepoDir/conf/passwd文件。 打開passwd文件&#xff0c;就是明文保…

ruby hash方法_Ruby中帶有示例的Hash.invert方法

ruby hash方法Hash.invert方法 (Hash.invert Method) In this article, we will study about Hash.invert Method. The working of this method can be predicted with the help of its name but it is not as simple as it seems. Well, we will understand this method with …

leetcode 216. 組合總和 III 思考分析

可能需要回顧的文章; leetcode 77. 組合 思考分析 1、題目 找出所有相加之和為 n 的 k 個數的組合。組合中只允許含有 1 - 9 的正整數&#xff0c;并且每種組合中不存在重復的數字。 說明&#xff1a; 所有數字都是正整數。 解集不能包含重復的組合。 2、遞歸 這一題和之前…

【Unity】Update()和FixedUpdate()

Update()每幀調用&#xff0c;FixedUpdate&#xff08;&#xff09;以指定頻率被調用。可以在 Edit -> project settings -> Time -> Fixed Timestep 中設定該頻率。轉載于:https://www.cnblogs.com/xiayong123/p/3717002.html

約束執行區域(CER)

受約束的執行區域 (CER) 是創作可靠托管代碼的機制的一部分。CER 定義一個區域&#xff0c;在該區域中公共語言運行庫 (CLR) 會受到約束&#xff0c;不能引發可使區域中的代碼無法完全執行的帶外異常。在該區域中&#xff0c;用戶代碼受到約束&#xff0c;不能執行會導致引發帶…

python 抓取網頁鏈接_從Python中的網頁抓取鏈接

python 抓取網頁鏈接Prerequisite: 先決條件&#xff1a; Urllib3: It is a powerful, sanity-friendly HTTP client for Python with having many features like thread safety, client-side SSL/TSL verification, connection pooling, file uploading with multipart encod…

四、模擬英語四六級答題卡識別閱卷評分

一、思路分析 首先拿到答題卡照片的時候&#xff0c;需要對照片進行一系列預處理操作&#xff0c;通過透視變換將圖像擺正方便后續的操作。每一道題五個選項&#xff0c;有五道題&#xff0c;通過字典存放準確答案。沒有依次對答題卡進行輪廓檢測&#xff0c;這里采用的是正方…

leetcode 17. 電話號碼的字母組合 思考分析

題目 給定一個僅包含數字 2-9 的字符串&#xff0c;返回所有它能表示的字母組合。 給出數字到字母的映射如下&#xff08;與電話按鍵相同&#xff09;。注意 1 不對應任何字母。 思考與遞歸程序 解空間樹的寬度是輸入數字對應的字符的個數&#xff0c;深度是輸入的數字的個數…

Blockquotes,引用,html里面,經常用到的一個!

blockquote元素的使用已經非常多樣化&#xff0c;但語義上它只適用于一件事–標記了一段你的網頁被引用從另一來源。這意味著&#xff0c;如果你想讓那些花俏的引文&#xff0c;<blockquote>是不是你應該使用元素。讓我們看一看如何你應該使用此元素&#xff1a; <art…

仔細分析了下這7行,貌似時間復雜度,空間復雜度都不大,為嘛就是執行效率這么低?...

for(Girl girl Girls.first(); !myGirlFriend.like(me); girl Girls.next()){if(!girl.hasBoyFriend(now) && i.like(girl)) { GirlFriend myGirlFriend (GirlFriend)girl; }} 轉載于:https://www.cnblogs.com/naran/archive/2011/12/28/2305467.html…

BHMS的完整形式是什么?

BHMS&#xff1a;順勢療法醫學和外科學士 (BHMS: Bachelor of Homeopathic Medicine and Surgery) BHMS is an abbreviation of Bachelor of Homeopathic Medicine and Surgery. It is a medical degree program for under graduation in Homeopathy; an alternative move towa…

c++編程思想2 --友元存儲控制

友元friend在c中的應用 我們知道在c的類訪問權限中,private和 protected在類外面進行訪問的時候 會因為權限而不能訪問 &#xff0c;友元就解決了這個問題 。 可以這樣理解&#xff0c;他為外部的 函數 或者類 進行了 訪問授權,其實這已經超出OOP的范疇,但是對于C而言是以實用…

WordPress Event Easy Calendar插件多個跨站請求偽造漏洞

漏洞名稱&#xff1a;WordPress Event Easy Calendar插件多個跨站請求偽造漏洞CNNVD編號&#xff1a;CNNVD-201309-083發布時間&#xff1a;2013-09-11更新時間&#xff1a;2013-09-11危害等級&#xff1a; 漏洞類型&#xff1a;跨站請求偽造威脅類型&#xff1a;遠程CVE編號&…

XML轉txt格式腳本

一、東北大學老師收集的鋼材缺陷數據集是XML格式的&#xff0c;但是YOLOv5只允許使用txt文件標簽 例如其中一種缺陷圖片所對應的標簽&#xff1a;crazing_1.xml <annotation><folder>cr</folder><filename>crazing_1.jpg</filename><source&…

python程序生成exe_使用Python程序生成QR代碼的Python程序

python程序生成exeQR code is a short form of the quick response code. It is a type of matrix barcode that contains some information like some specific link, important message, email-id, etc. In Python, the qrcode module is used to generate the QR code of so…

leetcode 242. 有效的字母異位詞 思考分析

題目 給定兩個字符串 s 和 t &#xff0c;編寫一個函數來判斷 t 是否是 s 的字母異位詞。 我們先考慮低階版本&#xff0c;認為字符只有26種可能&#xff0c;然后將a ~ z的字符映射到數組的索引0 ~ 25&#xff0c;數組中存放的則是該索引出現的頻次。 記錄下s的頻次和t的頻次…

總結一下ERP .NET程序員必須掌握的.NET技術,掌握了這些技術工作起來才得心應手...

從畢業做.NET到現在&#xff0c;有好幾年了&#xff0c;自認為只能是達到熟練的水平&#xff0c;談不上精通。所以&#xff0c;總結一下&#xff0c;自己到底熟練掌握了哪些.NET方面的開發技術&#xff0c;以此對照&#xff0c;看看還有哪些不足&#xff0c;歡迎補充。 1 .NET …

js \n直接顯示字符串_顯示N個字符的最短時間

js \n直接顯示字符串Problem statement: 問題陳述&#xff1a; You need to display N similar characters on a screen. You are allowed to do three types of operation each time. 您需要在屏幕上顯示N個相似的字符。 每次允許您執行三種類型的操作。 You can insert a c…

示例 Demo 工程和 API 參考鏈接

Camera Explorer&#xff1a;有關 Windows Phone8 中有關增強 Camera API 的使用。文章鏈接 Filter Effects&#xff1a;對拍攝的照片或者圖片庫中的照片應用 Nokia Imaging SDK 中的濾鏡。文章鏈接 Filter Explorer&#xff1a;演示了對新拍攝圖片或者現有圖片的編輯功能&…

三、標簽準備

所有操作均在anaconda中的自己配置的環境下進行 一、安裝labelimg 因為YOLO模型所需要的樣本標簽必須是txt類型&#xff0c;本人使用labelimg軟件進行對圖像進行打標簽操作。 pip install pycocotools-windows pip install pyqt5 pip install labelimg 通過labelimg命令打…