單應性矩陣計算函數與應用
OpenCV在通過特征描述子完成描述子匹配之后,會得到一些關鍵點對,我們會把這些關鍵點對分別添加到兩個vector對象中,作為輸入參數,調用單應性矩陣發現函數來發現一個變換矩陣H,函數findHomography就完成了這樣的功能,常見的調用代碼如下:
1//--Localizetheobject
2std::vectorobj_pts;
3std::vectorscene_pts;
4for(size_ti=0;i 5{
6//--Getthekeypointsfromthegoodmatches
7obj_pts.push_back(keypoints_obj[goodMatches[i].queryIdx].pt);
8scene_pts.push_back(keypoints_sence[goodMatches[i].trainIdx].pt);
9}
10MatH=findHomography(obj_pts,scene_pts,RHO);
有了變換矩陣H之后,我們就可以根據輸入圖像四點坐標,從場景圖像上得到特征匹配圖像的四點坐標,代碼實現如下:
1//--Getthecornersfromtheimage_1(theobjecttobe"detected")
2std::vectorobj_corners(4);
3obj_corners[0]=Point(0,0);obj_corners[1]=Point(box.cols,0);
4obj_corners[2]=Point(box.cols,box.rows);obj_corners[3]=Point(0,box.rows);
5std::vectorscene_corners(4);
6perspectiveTransform(obj_corners,scene_corners,H);
其中scene_corners為對象在場景圖像中的四點坐標,獲得坐標以后就可以繪制對應的矩形,從而在場景圖像中繪制對象的外接矩形區域。運行結果如下:
上述步驟中最重要的就是單應性矩陣H的計算,這里我們首先來看一下該函數與其各個參數解釋:
1Matcv::findHomography(
2InputArraysrcPoints,
3InputArraydstPoints,
4intmethod=0,
5doubleransacReprojThreshold=3,
6OutputArraymask=noArray(),
7constintmaxIters=2000,
8constdoubleconfidence=0.995
9)
參數解釋如下:
srcPoints:特征點集合,一般是來自目標圖像
dstPoints:特征點集合,一般是來自場景圖像
method:表示使用哪種配準方法,支持有四種方法(后續詳細說)
0 – 使用所有的點,比如最小二乘
RANSAC – 基于隨機樣本一致性
LMEDS – 最小中值
RHO –基于漸近樣本一致性
ransacReprojThreshold:該參數只有在method參數為RANSAC與RHO的時啟用,默認為3
mask:遮罩,當method方法為RANSAC 或 LMEDS可用
maxIters:最大迭代次數,當使用RANSAC方法
confidence:置信參數,默認為0.995
單應性矩陣H發現方法
首先簡單的解釋一下H的作用,假設在特征匹配或者對齊,視頻移動估算中有兩張圖像image1與image2,image1上有特征點(x1,y1)匹配image2上的特征點(x2,y2),現在我們需要在兩者之間建立一種視圖變換關系(透視變換),圖示如下(圖二):
其中H是一個3x3的矩陣
這樣為了求出H中的參數,需要兩個點對集合,就是findHomography函數中前兩個輸入參數,理想情況下,通過特征提取得到特征點會再下一幀或者場景圖像中保持不變,但是實際情況下,收到各種因素的影響,會額外產生很多特征點或者干擾點,如果正確的剔除這些干擾點,得到正確匹配的點,利用正確匹配點計算出H才是比較穩定的方式。
01
最小二乘擬合
很明顯,圖二所示的是一個過約束問題,如果沒有干擾點的話,就可以通過最小二乘進行直接擬合,求的參數,其中錯誤計算如下:
基于過約束方程計算得到錯誤,反向傳播不斷更新參數,直到兩次錯誤差值滿足要求閾值為止。
02
RANSAC
最小二乘方法在描述子匹配輸出的點對質量很好,理想情況下是圖像沒有噪聲污染與像素遷移與光線恒定,但是實際情況下圖像特別容易受到光線、噪聲導致像素遷移,從而產生額外的多余描述子匹配,這些點對可以分為outlier跟inlier兩類,基于RANSAC(Random Sample Consensus)可以很好的過濾掉outlier點對,使用合法的點對得到最終的變換矩陣H。RANSAC算法基本思想是,它會從給定的數據中隨機選取一部分進行模型參數計算,然后使用全部點對進行計算結果評價,不斷迭代,直到選取的數據計算出來的錯誤是最小,比如低于0.5%即可,完整的算法流程步驟如下:
選擇求解模型要求的最少要求的隨機點對
根據選擇隨機點對求解/擬合模型得到參數
根據模型參數,對所有點對做評估,分為outlier跟inlier
如果所有inlier的數目超過預定義的閾值,則使用所有inlier重新評估模型參數,停止迭代
如果不符合條件則繼續1~4循環。
通常迭代次數N會選擇一個比較高的值,OpenCV中默認迭代次數為200,確保有一個隨機選擇點對不會有outlier數據,
03
PROSAC(RHO)
注意有時候RANSAC方法不會收斂,導致圖像對齊或者配準失敗,原因在于RANSAC是一種全隨機的數據選取方式,完全沒有考慮到數據質量不同。對RANSAC算法的改進算法就是PROSAC(Progressive Sampling Consensus)即漸近樣本一致性,該方法采用半隨機方法,對所有點對進行質量評價計算Q值,然后根據Q值降序排列,每次只在高質量點對中經驗模型假設與驗證,這樣就大大降低了計算量,在RANSAC無法收斂的情況下,PROSAC依然可以取得良好的結果。OpenCV中的RHO方法就是基于PROSAC估算。
04
LMEDS
最小中值方法擬合,該方法可以看成是最小二乘法的改進,原因在于計算機視覺的輸入數據是圖像,一般都是各自噪聲,這種情況下最小二乘往往無法正確擬合數據,所以采用最小中值方法可以更好實現擬合,排除outlier數據。但是它是對高斯噪聲敏感算法。它的最主要步驟描述如下:
隨機選取很多個子集從整個數據集中
根據各個子集數據計算參數模型
使用計算出來的參數對整個數據集計算中值平方殘差
最終最小殘差所對應的參數即為擬合參數。
05
對比測試
最后看一下OpenCV中使用單應性矩陣發現對相同的特征點對,分別使用RANSAC、PROSAC、LMEDS進行參數矩陣H的求解結果對比,顯示如下:
總數446個匹配點對,三種評估方式生成的H矩陣(3x3)很明顯值都不盡相同。
一般情況下在,推薦大家使用RANSAC或者RHO。默認的0表示最小二乘方法,對圖像匹配在實際應用中一般都是翻車!LMEDS方法只有在inlier超過50%以上情況下才會擬合生成比較好的H參數,而RANSAC或者RHO不管outlier跟inlier比率是多少都會可以適用,可以大家也都注意到h33總是等于1,因為h33在這里作用是保持標準化尺度。在OpenCV中如果無法正確估算參數H,會返回空Mat對象。
單應性矩陣應用
圖像透視變換與對象匹配
圖像拼接
最后的話
我在2019年的文章匯總中說,2020年少寫廢話,但愿此篇不是廢話,我為了寫好它也是傷神很久,算是自己盡力了,也是回答了平時一些人總問我的問題,歡迎大家指正與反饋!如果覺得不錯,點個贊我就很滿足了!
-
圖像
+關注
關注
2文章
1085瀏覽量
40488 -
矩陣
+關注
關注
0文章
423瀏覽量
34563 -
函數
+關注
關注
3文章
4333瀏覽量
62686
原文標題:OpenCV單應性矩陣發現參數估算方法詳解
文章出處:【微信號:CVSCHOOL,微信公眾號:OpenCV學堂】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論