pcl中ransac提取直线_复杂场景中的一个图像配准思路
在很多時候,我們可能需要使用到圖像的識別與配準工作,來判斷某個特征或者是劃出某個特定特征的位置。現在的深度學習已經能夠比較好地解決這個問題,比如常見的YOLO,可以利用幾行設定代碼就能夠劃出所需要識別的位置。但是精準度可能會有所偏差,因為在訓練過程中使用的樣例往往是被經過卷積處理學習的,許多特征點在這過程中可能會消失,并且池化之后以另一種方式進行學習和識別。也就是說許多模式識別的方法重在識別,所以在細節匹配上可能不太適用(例如通過匹配LOGO上的某一點來推算出其位置)。而本文所分享的是一種較為精確的配準方式,可以通過先驗條件來推導諸如LOGO在場景中的具體坐標等問題。
關鍵詞:機器視覺 機器學習 圖像配準
1 類模型的構建思路
1.1????? 圖像特征的提取算子
目前常用的三種提取特征的方法有surf算子,fast算子和sift算子,在目前版本的opencv中還集成了orb算子,但是這種算子主要是對fast算法的一種優化版本,所以不再討論。其中論運算速度而言,fast>surf>sift,但是sift算子的提取特性最好,能擁有比較好的尺度一致性和旋轉一致性,能夠較好的保留特征,但是在很多情況下作為sift算法的改良版本surf算法也可以替代sift,以提高運算效率。但是為了實現思路的可行性驗證,先使用了效果最好的SIFT算法進行項目的運用。
Sift算法的核心是構建了比例空間(Scalespace),來保證了尺度一致性,這也是它提取特征優于別的算法,運行速度相對較慢的主要原因。而它所運用的尺度空間是通過構造高斯金字塔來進行構造的,通過對比金字塔上下左右的像素塊來進行特征像素的提取,并且運用了泰勒展開的來進行插值擬合真正的特征像素值和位置。隨后去除不穩定的邊緣響應,最后對于每一個特征點都存在有八個方向的梯度大小,利用尺度空間和高斯分布提取到特征點在其他尺度空間的八個方向的梯度大小,組成了一個描述子,這個描述子為4*4*8 = 128個數字向量。
SIFT的詳細原理可以參考博客:
https://blog.csdn.net/u010440456/article/details/81483145
作為SIFT的優化算法,SURF的原理可以參考博客:
https://blog.csdn.net/dcrmg/article/details/52601010
1.2????? 圖像特征的配準
在配準中所使用的算法在opencv中也有集成,常用的主要有Brute Force,又稱為暴風算法,以及FLANN算法,即最鄰近尋找法。
暴風算法是將兩幅圖中所有的描述子都盡可能地進行比對,選出最具接近的兩個描述子進行配對,但是這樣的做法會更慢。FLANN算法是SIFT算法的提出者Lowe提出的,FLANN算法則是找出與描述子最接近的兩個描述子進行比對,當次近距離大于最近距離的某個比例閾值時,則認為其中最近的描述子與原圖描述子配對成功,并且在進行開發的時候,這種算法更具有可操作性,能夠修改閾值或者是調用源碼來與其他函數進行交互。所以在項目中使用了FLANN作為核心的匹配算法。
FLANN的核心在于聚類,聚類是機器學習中一個比較重要的領域。而FLANN所用到的聚類則是基于隨機k-d樹,和kmeans方法。K-d樹在于隨機將描述子進行劃分,而kmeans則在于將描述子與最近的節點進行歸類,這種方法相較于單純的kmeans而言會更加具有效率。
關于FLANN算法的具體原理和基礎使用可以參考博客:
https://blog.csdn.net/cshilin/article/details/52107580
1.3 類模型的描述
這里所說的類模型指的是用于作為匹配的原圖LOGO,也就是說,在項目中會使用該模型與場景相比對,來匹配出場景中的LOGO。這個機器學習的思路參考論文:《Logo localization and recognition in natural images using homographic class graphs》
在這個思路中,我們需要訓練處這樣一個類模型。在這之中,訓練集主要來源于視頻中截取下來的logo或者是線下拍攝的logo,并且注意要從不同角度進行拍攝以提供學習,同時注意在拍攝過程中,相鄰角度不宜變化太大,也就是說當想要拍攝小角度時,需要從大角度的視角多采集幾組圖片變化到小角度,否則會影響到學習的效率。
根據不同的兩張圖片,它們之間從理論上而言,存在有一個透視矩陣將其連接起來,并且理想情況下,它們的相互變換的兩個透視矩陣應互相為逆矩陣,將一張圖片映射到另一張圖片上的透視矩陣稱為單應性矩陣(homograph matrix),這個矩陣為一個3×3的矩陣,對應著旋轉、平移和透視,并且右下腳的元素為1,所以在進行透視變換的時候需要有四對點來進行單應性矩陣的求解。而這四對點則主要是通過FLANN成功配對的四對點,而為了降低錯誤匹配帶來的誤差,同時使用了RANSAC算法來進行矩陣的求解,同時進一步篩選掉FLANN中錯誤的點。
RANSAC為隨機一致性采樣,核心在于迭代隨機選擇4對特征點來進行直接的線性變化(DLT)來確定單應性矩陣,通過不斷地迭代,將FLANN所匹配出來的點分為內點和外點。拿二維采樣變量x,y來舉例子,RANSAC相當于不停地對x,y進行擬合,最后擬合出一條直線,并且將遠離直線的點判斷為外點,貼近直線的點為內點。
RANSAC的原理可以參考博客:
https://blog.csdn.net/weixin_43795395/article/details/90751650?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param
在匹配訓練模型的時候,將匹配閾值設置得小一些,以匹配出更具有代表性的點。利用兩兩圖片之間的單應性矩陣,可以判斷出兩張圖片之間是否相連,也就是是否能夠互相進行投影變換,在進行程序操作之后,有可能出現兩張圖片之間不存在單應性矩陣的情況。將圖片進行兩兩連接,保證每張圖都能夠相互連接上之后,繪制出logo之間的互連圖,選取連接數最多的圖像作為中心圖像,然后找出各個圖像離中心圖像的最短路徑,并且需要遍歷所有logo,以確定所有的logo都與中心圖像能夠直接或者間接的連接(注意路徑不宜太長,否則會累計誤差,在測試中的最長路徑為3,此時已經產生了較大的誤差)。
將經過RANSAC之后被確定為的內點稱為‘好點’,將‘好點’通過路徑映射到中心圖像上,構成類模型,同時注意要將這些‘好點’的描述子進行統計和綜合。
最后的匹配結果如下:
在視頻中的某幀表現:
可以看見這種方式對匹配確實有著較好的效果,同時在調試過程中發現,訓練過程中LOGO越大,訓練效果越好,描述子更清晰,特征更明顯;匹配過程中,場景圖像的尺寸越大,匹配效果越好,能夠匹配更清晰的特征。同時當角度太小或者光照弱時,很可能無法配對成功,會出現誤匹配。
同時在光照很弱的時候,對比度不清晰的時候,需要對logo區域進行圖像增強處理,在調試過程中主要嘗試了線性變換、直方圖正規化、伽馬變化、全局直方圖均衡、自適應直方圖均衡化和拉普拉斯圖像銳化,其中使用直方圖正規化結合線性變換的效果最好,并且能夠進行循環處理。
2 官方logo模型
除了自己拍攝的一些圖像之外,利用一些較為準確的官方LOGO圖像,能夠更加精確地算出logo上的匹配點到邊框的距離,能夠更精準地換算出機器人的位置。
同時參考上述訓練的思路,利用官方LOGO進行各種角度的透視變換,能夠減少由于路徑長度而導致單應性矩陣誤差累積的情況,對于不同模型上的映射點能夠更準確地投射到中心模型上,而此處的中心模型選用所提供的官方LOGO正視圖。
得到類模型如下:
最后將上圖中不同LOGO圖片中檢測到的特征點整合到了官方的LOGO圖上,得到了官方logo模型。但是這個模型上特征點太多,容易出現場景的誤匹配。可以在檢測的時候對于每個LOGO的圖片都只保留特征最明顯的前幾個點來減少模型上的特征點。
3????? 場景區域檢測范圍優化
在匹配過程中會發現,對場景的檢測會很慢,主要是攝取場景的清晰度高、尺寸大、特征點較多,而框選出一定的區域來進行檢測和匹配能夠大幅提升特征檢測速度和匹配速度。
可以根據卡爾曼濾波或者是其他方式來綜合修正矩形框的位置,或者是改變所截取的模板,例如做出灰度直方圖來將除框選出來的范圍外,填充上框內的平均灰度值以降低框的邊緣對于檢測的影響,也可以增加匹配的準確率。
總結
以上是生活随笔為你收集整理的pcl中ransac提取直线_复杂场景中的一个图像配准思路的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 迁西是哪个省的哪个市(河北省唐山市迁西县
- 下一篇: 打雷的时候可以玩电脑吗(打雷玩电脑的注意