opencv求两张图像光流_OpenCV单应性矩阵发现参数估算方法详解
點(diǎn)擊上方藍(lán)字關(guān)注我們
微信公眾號:OpenCV學(xué)堂
關(guān)注獲取更多計算機(jī)視覺與深度學(xué)習(xí)知識
單應(yīng)性矩陣計算函數(shù)與應(yīng)用
OpenCV在通過特征描述子完成描述子匹配之后,會得到一些關(guān)鍵點(diǎn)對,我們會把這些關(guān)鍵點(diǎn)對分別添加到兩個vector對象中,作為輸入?yún)?shù),調(diào)用單應(yīng)性矩陣發(fā)現(xiàn)函數(shù)來發(fā)現(xiàn)一個變換矩陣H,函數(shù)?findHomography?就完成了這樣的功能,常見的調(diào)用代碼如下:
1//--?Localize?the?object2std::vector?obj_pts; 3std::vector?scene_pts; 4for?(size_t?i?=?0;?i? 5{ 6?????????//--?Get?the?keypoints?from?the?good?matches 7?????????obj_pts.push_back(keypoints_obj[goodMatches[i].queryIdx].pt); 8?????????scene_pts.push_back(keypoints_sence[goodMatches[i].trainIdx].pt); 9}10Mat?H?=?findHomography(obj_pts,?scene_pts,?RHO);
有了變換矩陣H之后,我們就可以根據(jù)輸入圖像四點(diǎn)坐標(biāo),從場景圖像上得到特征匹配圖像的四點(diǎn)坐標(biāo),代碼實現(xiàn)如下:
1//--?Get?the?corners?from?the?image_1?(?the?object?to?be?"detected"?)2std::vector?obj_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::vector?scene_corners(4);6perspectiveTransform(obj_corners,?scene_corners,?H);
其中scene_corners為對象在場景圖像中的四點(diǎn)坐標(biāo),獲得坐標(biāo)以后就可以繪制對應(yīng)的矩形,從而在場景圖像中繪制對象的外接矩形區(qū)域。運(yùn)行結(jié)果如下:
上述步驟中最重要的就是單應(yīng)性矩陣H的計算,這里我們首先來看一下該函數(shù)與其各個參數(shù)解釋:
1Mat?cv::findHomography???????(???????2?????InputArray??????srcPoints,
3?????InputArray??????dstPoints,
4?????int???method?=?0,
5?????double????ransacReprojThreshold?=?3,
6?????OutputArray???mask?=?noArray(),
7?????const?int?????????maxIters?=?2000,
8?????const?double??confidence?=?0.995
9)
參數(shù)解釋如下:srcPoints:特征點(diǎn)集合,一般是來自目標(biāo)圖像dstPoints:特征點(diǎn)集合,一般是來自場景圖像method:表示使用哪種配準(zhǔn)方法,支持有四種方法(后續(xù)詳細(xì)說)
0 – 使用所有的點(diǎn),比如最小二乘
RANSAC – 基于隨機(jī)樣本一致性
LMEDS – 最小中值
RHO –基于漸近樣本一致性
ransacReprojThreshold:該參數(shù)只有在method參數(shù)為RANSAC與RHO的時啟用,默認(rèn)為3mask:遮罩,當(dāng)method方法為RANSAC 或 LMEDS可用maxIters:最大迭代次數(shù),當(dāng)使用RANSAC方法confidence:置信參數(shù),默認(rèn)為0.995
單應(yīng)性矩陣H發(fā)現(xiàn)方法
首先簡單的解釋一下H的作用,假設(shè)在特征匹配或者對齊,視頻移動估算中有兩張圖像image1與image2,image1上有特征點(diǎn)(x1,y1)匹配image2上的特征點(diǎn)(x2,y2),現(xiàn)在我們需要在兩者之間建立一種視圖變換關(guān)系(透視變換),圖示如下(圖二):
其中H是一個3x3的矩陣
這樣為了求出H中的參數(shù),需要兩個點(diǎn)對集合,就是findHomography函數(shù)中前兩個輸入?yún)?shù),理想情況下,通過特征提取得到特征點(diǎn)會再下一幀或者場景圖像中保持不變,但是實際情況下,收到各種因素的影響,會額外產(chǎn)生很多特征點(diǎn)或者干擾點(diǎn),如果正確的剔除這些干擾點(diǎn),得到正確匹配的點(diǎn),利用正確匹配點(diǎn)計算出H才是比較穩(wěn)定的方式。
01
最小二乘擬合
很明顯,圖二所示的是一個過約束問題,如果沒有干擾點(diǎn)的話,就可以通過最小二乘進(jìn)行直接擬合,求的參數(shù),其中錯誤計算如下:
基于過約束方程計算得到錯誤,反向傳播不斷更新參數(shù),直到兩次錯誤差值滿足要求閾值為止。
02
RANSAC
最小二乘方法在描述子匹配輸出的點(diǎn)對質(zhì)量很好,理想情況下是圖像沒有噪聲污染與像素遷移與光線恒定,但是實際情況下圖像特別容易受到光線、噪聲導(dǎo)致像素遷移,從而產(chǎn)生額外的多余描述子匹配,這些點(diǎn)對可以分為outlier跟inlier兩類,基于RANSAC(Random Sample Consensus)可以很好的過濾掉outlier點(diǎn)對,使用合法的點(diǎn)對得到最終的變換矩陣H。RANSAC算法基本思想是,它會從給定的數(shù)據(jù)中隨機(jī)選取一部分進(jìn)行模型參數(shù)計算,然后使用全部點(diǎn)對進(jìn)行計算結(jié)果評價,不斷迭代,直到選取的數(shù)據(jù)計算出來的錯誤是最小,比如低于0.5%即可,完整的算法流程步驟如下:
選擇求解模型要求的最少要求的隨機(jī)點(diǎn)對
根據(jù)選擇隨機(jī)點(diǎn)對求解/擬合模型得到參數(shù)
根據(jù)模型參數(shù),對所有點(diǎn)對做評估,分為outlier跟inlier
如果所有inlier的數(shù)目超過預(yù)定義的閾值,則使用所有inlier重新評估模型參數(shù),停止迭代
如果不符合條件則繼續(xù)1~4循環(huán)。
通常迭代次數(shù)N會選擇一個比較高的值,OpenCV中默認(rèn)迭代次數(shù)為200,確保有一個隨機(jī)選擇點(diǎn)對不會有outlier數(shù)據(jù),
03
PROSAC(RHO)
注意有時候RANSAC方法不會收斂,導(dǎo)致圖像對齊或者配準(zhǔn)失敗,原因在于RANSAC是一種全隨機(jī)的數(shù)據(jù)選取方式,完全沒有考慮到數(shù)據(jù)質(zhì)量不同。對RANSAC算法的改進(jìn)算法就是PROSAC(Progressive Sampling Consensus)即漸近樣本一致性,該方法采用半隨機(jī)方法,對所有點(diǎn)對進(jìn)行質(zhì)量評價計算Q值,然后根據(jù)Q值降序排列,每次只在高質(zhì)量點(diǎn)對中經(jīng)驗?zāi)P图僭O(shè)與驗證,這樣就大大降低了計算量,在RANSAC無法收斂的情況下,PROSAC依然可以取得良好的結(jié)果。OpenCV中的RHO方法就是基于PROSAC估算。
04
LMEDS
最小中值方法擬合,該方法可以看成是最小二乘法的改進(jìn),原因在于計算機(jī)視覺的輸入數(shù)據(jù)是圖像,一般都是各自噪聲,這種情況下最小二乘往往無法正確擬合數(shù)據(jù),所以采用最小中值方法可以更好實現(xiàn)擬合,排除outlier數(shù)據(jù)。但是它是對高斯噪聲敏感算法。它的最主要步驟描述如下:
隨機(jī)選取很多個子集從整個數(shù)據(jù)集中
根據(jù)各個子集數(shù)據(jù)計算參數(shù)模型
使用計算出來的參數(shù)對整個數(shù)據(jù)集計算中值平方殘差
最終最小殘差所對應(yīng)的參數(shù)即為擬合參數(shù)。
05
對比測試
最后看一下OpenCV中使用單應(yīng)性矩陣發(fā)現(xiàn)對相同的特征點(diǎn)對,分別使用RANSAC、PROSAC、LMEDS進(jìn)行參數(shù)矩陣H的求解結(jié)果對比,顯示如下:
總數(shù)446個匹配點(diǎn)對,三種評估方式生成的H矩陣(3x3)很明顯值都不盡相同。
一般情況下在,推薦大家使用RANSAC或者RHO。默認(rèn)的0表示最小二乘方法,對圖像匹配在實際應(yīng)用中一般都是翻車!LMEDS方法只有在inlier超過50%以上情況下才會擬合生成比較好的H參數(shù),而RANSAC或者RHO不管outlier跟inlier比率是多少都會可以適用,可以大家也都注意到h33總是等于1,因為h33在這里作用是保持標(biāo)準(zhǔn)化尺度。在OpenCV中如果無法正確估算參數(shù)H,會返回空Mat對象。
單應(yīng)性矩陣應(yīng)用
圖像透視變換與對象匹配
圖像拼接
最后的話
我在2019年的文章匯總中說,2020年少寫廢話,但愿此篇不是廢話,我為了寫好它也是傷神很久,算是自己盡力了,也是回答了平時一些人總問我的問題,歡迎大家指正與反饋!如果覺得不錯,點(diǎn)個贊我就很滿足了!
讀書欲精不欲博
用心欲專不欲雜
?推薦閱讀?
?2019原創(chuàng)技術(shù)文章匯總
2018年原創(chuàng)技術(shù)文章匯總
OpenCV實戰(zhàn) | 噪聲生成與圖像加噪聲
OpenCV4系統(tǒng)化學(xué)習(xí)路線圖-視頻版本!
總結(jié)
以上是生活随笔為你收集整理的opencv求两张图像光流_OpenCV单应性矩阵发现参数估算方法详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dva的用法_dva.js 用法详解:列
- 下一篇: f5 会话保持 负载均衡_四层负载均衡和