1. 程式人生 > >基於RobHess原始碼的sift全景影象合成過程分析

基於RobHess原始碼的sift全景影象合成過程分析

在我改進的RobHess原始碼中,拼接的順序大致如下:
1.讀取圖片,使用opencv的undistort函式來對攝像機拍攝的圖片進行畸變矯正。
2.為每幅圖想呼叫sift_features函式,檢測特徵點。
3.用第i幅圖的特徵點建立kd樹,用第i+1幅圖的特徵點在建立好的kd樹進行搜尋,初步篩選出第一批特徵點。
4.在之前篩選出的特徵點的基礎上,用RANSAC演算法進行二次篩選,並計算得出每幅圖片的轉移矩陣。
5.從轉移矩陣中獲取水平方向和垂直方向的位移,進行影象拼接。

下面分條說明幾個重要步驟的過程:

sift特徵點監測

sift演算法具有尺度、旋轉和平移的不變性,也就是說如果我們對一幅圖片進行縮放、旋轉或者平移等的變換,然後呼叫sift演算法對它進行檢測,在變換前後的圖片中,sift能檢測出相同的特徵點。
在具體演算法中,高斯差分金字塔(DOG)可以使得演算法具有尺度不變性和平移不變性,通過求關鍵點的梯度和方向直方圖,可以使得演算法具有旋轉不變性。
最後,sift會把求出來的特徵點以及特徵點附近的點的資訊用一個高維向量來表示。

參考頁面

kd樹

假設資料是三維的,那麼kd樹就是按照某種建樹的規則,把空間劃分成不同的區域,把資料儲存在這些區域中。

Created with Raphaël 2.1.2開始選取方差最大的維度得到這個維度上的中值以這個中值節點為界劃分空間還有其他節點嗎?結束yesno

例子
6個二維資料點{(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)}構建kd樹的具體步驟為:

確定:split域=x。具體是:6個數據點在x,y維度上的資料方差分別為39,28.63,所以在x軸上方差更大,故split域值為x;
確定:Node-data = (7,2)。具體是:根據x維上的值將資料排序,6個數據的中值(所謂中值,即中間大小的值)為7,所以Node-data域位資料點(7,2)。這樣,該節點的分割超平面就是通過(7,2)並垂直於:split=x軸的直線x=7;
確定:左子空間和右子空間。具體是:分割超平面x=7將整個空間分為兩部分:x<=7的部分為左子空間,包含3個節點={(2,3),(5,4),(4,7)};另一部分為右子空間,包含2個節點={(9,6),(8,1)};

kd樹的查詢比較複雜,因為兩個很近的點可能很早就被不同維度給切開來了,所以需要回溯,這裡不展開了。
在過程3中,我們用第i+1幅圖的特徵點在第i幅圖建立的kd樹中進行檢索,找到第i幅圖中距離最近的兩個特徵點,如果這兩個特徵點的比值小於我們設定的閾值,則認為距離最近的特徵點就是第i+1幅圖中特徵點對應的點(初步篩選)。
參考頁面

RANSAC演算法

RANSAC演算法的中文翻譯叫做隨機抽樣一致性演算法,引用網路上對這個演算法的解釋:
RANSAC演算法的輸入是一組觀測資料,一個可以解釋或者適應於觀測資料的引數化模型,一些可信的引數。
RANSAC通過反覆選擇資料中的一組隨機子集來達成目標。被選取的子集被假設為局內點,並用下述方法進行驗證:

1.有一個模型適應於假設的局內點,即所有的未知引數都能從假設的局內點計算得出。
2.用1中得到的模型去測試所有的其它資料,如果某個點適用於估計的模型,認為它也是局內點。
3.如果有足夠多的點被歸類為假設的局內點,那麼估計的模型就足夠合理。
4.然後,用所有假設的局內點去重新估計模型,因為它僅僅被初始的假設局內點估計過。
5.最後,通過估計局內點與模型的錯誤率來評估模型。

這個過程被重複執行固定的次數,每次產生的模型要麼因為局內點太少而被捨棄,要麼因為比現有的模型更好而被選用。

在過程4中,我們先在過程3篩選的特徵點中隨機選取4個匹配點對(8個點),計算變換矩陣H;然後對第i幅圖的所有特徵點用H去進行變換,再去檢查變換結果中符合誤差範圍的點個個數是否大於閾值(其實就是用隨機選取的匹配點的變換矩陣與第i幅圖相乘,如果變換之後的圖的大部分特徵點的位置與第i+1幅圖的特徵點的位置相差不大,則認為檢驗通過了);如果大於閾值,則成功,如果小於閾值,則重複這個迴圈。

Created with Raphaël 2.1.2開始隨機選取4對點計算變換矩陣H用H對匹配圖的特徵點進行變換計算變換完的特徵點與待匹配圖的特徵點的匹配度這個匹配度大於閾值嗎?結束yesno

變換矩陣

變換矩陣
全比例係數為1,4對點,8個方程,正好解出8個未知數。
這裡我們我需要l和m。

相關推薦

基於RobHess原始碼sift全景影象合成過程分析

在我改進的RobHess原始碼中,拼接的順序大致如下: 1.讀取圖片,使用opencv的undistort函式來對攝像機拍攝的圖片進行畸變矯正。 2.為每幅圖想呼叫sift_features函式,檢測特徵點。 3.用第i幅圖的特徵點建立kd樹,用第i+1幅

基於N原始碼的Activity的啟動過程分析

對於該主題的文章,網上氾濫,為了加深印象,最好還是自己跟一遍原始碼,這樣對框架的認識以及對應用的控制都是很有幫助的。 推薦老羅的一些列文章: 老羅的部落格寫的非常好,但分析的原始碼有點老,不過大體思路是不會變的。我這裡就基於android 7.0的原始碼來跟下這個流程,希

Android6.0 影象合成過程詳解(二) doComposition函式

上篇部落格分析到setUpHWComposer函式,這裡我們繼續分析影象合成的過程從doComposition函式開始,以及在這過程中解答一些上篇部落格提出的疑問。 一、doComposition合成圖層 doComposition這個函式就是合成所有層的影象 void

Linux核心:基於int指令的經典系統呼叫過程分析

眾所周知,程式碼執行可以存在多種不同的特權級別,而針對Linux系統,即為:使用者模式(user mode)和核心模式(kernel mode)。在使用者模式下,CPU的功能空間受到極大的限制,是沒有權利訪問多少系統資源的,諸多關鍵資源的使用無法直接調配,如:硬

利用RobHess原始碼實現SIFT演算法及RANSAC去錯的影象特徵提取匹配及去除錯匹配

本文是在VS2010+Opencv2.4.9環境下實現! 首先下載RobHess利用opencv實現SIFT演算法原始碼,在配置好opencv環境的vs2010中實現SIFT特徵提取、匹配,在利用K-D樹、BBF和RANSAC去除錯誤匹配,實驗結果如圖: 去

【OpenCV影象處理入門學習教程三】基於SIFT特徵和SURF特徵的微旋轉影象拼接與融合生成全景影象的比較

安裝教程可以參考本人之前的一篇部落格:可以使OpenCV2和OpenCV3共存。那麼這裡為什麼又要提到OpenCV2和OpenCV3的區別了呢?其實本人也覺得挺奇葩的,因為從OpenCV3以來,一些比較新的功能都挪到了“opencv_contrib”庫裡,原因是他們覺得這些庫“不安全”,因此並沒有預設自帶這些

Opencv Sift和Surf特徵實現影象無縫拼接生成全景影象

Sift和Surf演算法實現兩幅影象拼接的過程是一樣的,主要分為4大部分: 1. 特徵點提取和描述2. 特徵點配對,找到兩幅影象中匹配點的位置3. 通過配對點,生成變換矩陣,並對影象1應用變換矩陣生成對影象2的對映影象4. 影象2拼接到對映影象上,完成拼接 過程1、2

u-boot-201611 啟動過程分析——基於smdk2410

u-bootu-boot-201611 啟動過程分析——基於smdk2410

基於nginx+keepalived架構實現的完整過程

安裝 nginx 負載均衡器 nginx+keepalived 監控Nginx 安裝1.安裝PCRE軟件包tar zxvf pcre-8.10.tar.gzcd pcre-8.10./configuremake && make install2.安裝Nginx軟件包tar zxvf nginx

基於layu美化的分頁,面向過程

cal roo 每天 image end mes sel lang layer 一共兩個文件: 直接上代碼,不啰嗦: index.php頁面: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

Mybatis之基於XML的調用存儲過程

count put state pri parameter 創建 oca 基於 XML 一、返回單個值 1、存儲過程準備 這裏先創建一個存儲過程,傳入參數為age,傳出參數為count。然後先測試一下是否正確。 CREATE DEFINER=`root`@`localh

UI設計教程分享:關於海報的合成過程

一張好的產品創意合成海報,能瞬間提升商品價值感,同時場景和相關元素的融入,讓消費者瞬間明白商品屬性及內涵。同時為商品營造的使用場景擁有更強的代入感,從而刺激轉化。好的創意合成海報能為消費者帶來視覺衝擊的同時,加深對產品的印象。   以一款脣膏為例:炫彩水潤脣膏。通過對產品重點炫彩、水潤的使用場景

【資訊科技】【2002.04】基於區域性分割的數字影象處理

本文為澳大利亞莫納什大學(作者:Torsten Seemann)的博士論文,共300頁。 本文提出了一種實現“區域性分割”的低層次影象處理的統一思想。區域性分割提供了一種檢查並理解現有演算法的方式,以及建立新演算法的範例。區域性分割可以應用於重要的影象處理任務。利用傳統的強度閾值分割技

Android原始碼解析之應用程式資源管理器(Asset Manager)的建立過程分析

轉載自:https://blog.csdn.net/luoshengyang/article/details/8791064 我們分析了Android應用程式資源的編譯和打包過程,最終得到的應用程式資源就與應用程式程式碼一起打包在一個APK檔案中。Android應用程式在執行的過程中,是通過一個

AngularJS進階(三十九)基於專案實戰解析ng啟動載入過程

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

如何用基於resnet的Unet進行影象分割 基於Pytorch-0.5版本

1、關於Unet       Unet主要用於醫學影象的很多論文中,以及Kaggle競賽和一些其他競賽中“少類別”的影象分割。從我做實驗的經驗來說,像VOC這種類別比較多的分割任務,不容易收斂,效果較為差。 2、Resnet34   &n

VRay 3.4 for SketchUp | 全景影象渲染結果總是出錯?

作者 | 活力網Caigle 全景影象隨著版本的更新 設定將變得更加的簡單 基本一鍵設定 這個過程中,由於每個人的設定習慣不同 導致顯示結果未必能準確 正確的顯示結果如下 而你的渲染結果卻如下 將導致最終無法合成完整的全景影象 這裡是因為大部分使用者基於過去的經驗習慣

surfaceflinger 合成過程解析

用 [TOC]來生成目錄: 整體流程 handleMessageInvalidate handleMessageRefresh 1. preComposition 2. rebuildLaye

Qt影象合成原理

Qt影象合成原理 若對C++語法不熟悉,建議參閱《C++語法詳解》一書,電子工業出版社出版,該書語法示例短小精悍,對查閱C++知識點相當方便,並對語法原理進行了透徹、深入詳細的講解。 需要用到的QPainter類中的函式如下  CompositionMode compositi

Spring原始碼閱讀——bean的載入過程解析

前言 在上一節中,我們已經瞭解過Spring對bean從XML中提取,並且以BeanDefinition型別解析註冊到Spring的DefaultListableBeanFactory中取了,那麼,接下來就應該來看下我們在Spring中獲取一個例項過程中,bean是如何載入成為我們需