探秘SLAM之RANSAC演算法

2021-08-21 22:40:31 字數 3222 閱讀 2771

隨機抽樣一致演算法(random sample consensus),簡稱ransac演算法,採用迭代的方式從一組包含離群的被觀測資料中估算出數學模型的引數。其廣泛應用在計算機視覺領域和數學領域,例如直線擬合、平面擬合、計算影象或點雲間的變換矩陣、計算基礎矩陣等方面。

ransac演算法基本思想:

從資料集中隨機選出一組局內點(其數目要保證能夠求解出模型的所有引數),計算出一套模型引數。

用得到的模型去測試其他所有的資料點,如果某點的誤差在設定的誤差閾值之內,就判定其為局內點,否則為局外點,只保留目前為止局內點數目最多的模型,將其記錄為最佳模型。

重複執行1,2步足夠的次數(即達到預設的迭代次數)後,使用最佳模型對應的局內點來最終求解模型引數。

最後可以通過估計局內點與模型的錯誤率來評估模型。

為了更好的理解我們舉個栗子:

如下圖有很多離散的點,我們打算擬合出一條直線。

首先隨機取兩個點,計算直線模型,根據設定的誤差閾值判斷局內點和局外點。

重複上面過程,達到一定迭代次數後,將最佳模型作為問題的解。

如果想要對ransac演算法有更多了解請參見維基百科。

這裡我們用ransac演算法實現對特徵點匹配的優化。

#include 

#include "opencv2/opencv.hpp"

#include "opencv2/core/core.hpp"

#include "opencv2/features2d/features2d.hpp"

#include "opencv2/highgui/highgui.hpp"

using

namespace cv;

using

namespace

std;

int main(int argc, char** argv)

vector

img_1_keypoints, img_2_keypoints;

mat img_1_descriptors, img_2_descriptors;

ptrdetector=orb::create(); //採用orb演算法提取特徵點

//檢測fast角點位置

detector->detect(img_1, img_1_keypoints);

detector->detect(img_2, img_2_keypoints);

//根據角點位置計算brief描述子

detector->compute(img_1, img_1_keypoints, img_1_descriptors);

detector->compute(img_2, img_2_keypoints, img_2_descriptors);

//漢明距離做為相似度度量

bfmatcher matcher(norm_hamming, true);

vector

matches;

matcher.match(img_1_descriptors, img_2_descriptors, matches);

mat match_img;

drawmatches(img_1, img_1_keypoints, img_2, img_2_keypoints, matches, match_img);

imshow("所有匹配", match_img);

//採用ransac演算法優化

//儲存匹配對序號

vector

queryidxs(matches.size()), trainidxs(matches.size());

for (size_t i = 0; i < matches.size(); i++)

mat homography_matrix; //變換矩陣

vector

points1; keypoint::convert(img_1_keypoints, points1, queryidxs);

vector

points2; keypoint::convert(img_2_keypoints, points2, trainidxs);

int ransacreprojthreshold = 5; //拒絕閾值

homography_matrix = findhomography(mat(points1), mat(points2), cv_ransac, ransacreprojthreshold);

vector

matchesmask(matches.size(), 0);

mat points1t;

perspectivetransform(mat(points1), points1t, homography_matrix);

for (size_t i = 0; i < points1.size(); i++) //儲存『局內點』

}mat match_img2; //濾除『局外點』後

drawmatches(img_1, img_1_keypoints, img_2, img_2_keypoints, matches, match_img2, scalar(0, 0, 255), scalar::all(-1), matchesmask);

imshow("優化後的匹配", match_img2);

waitkey(0);

return

0;}

這裡在opencv的findhomography函式中使用ransac來優化。在vs上面執行結果如下:

特徵點匹配的還可以按照漢明距離小於最小漢明距離兩倍的篩選原則優化。

RANSAC演算法詳解

另參考 給定兩個點p1與p2的座標,確定這兩點所構成的直線,要求對於輸入的任意點p3,都可以判斷它是否在該直線上。初中解析幾何知識告訴我們,判斷乙個點在直線上,只需其與直線上任意兩點點斜率都相同即可。實際操作當中,往往會先根據已知的兩點算出直線的表示式 點斜式 截距式等等 然後通過向量計算即可方便地...

RANSAC演算法詳解

另參考 給定兩個點p1與p2的座標,確定這兩點所構成的直線,要求對於輸入的任意點p3,都可以判斷它是否在該直線上。初中解析幾何知識告訴我們,判斷乙個點在直線上,只需其與直線上任意兩點點斜率都相同即可。實際操作當中,往往會先根據已知的兩點算出直線的表示式 點斜式 截距式等等 然後通過向量計算即可方便地...

RANSAC演算法詳解

隨機抽樣一致演算法 random sample consensus,ransac 採用迭代的方式從一組包含離群的被觀測資料中估算出數學模型的引數。資料分兩種 有效資料 inliers 和無效資料 outliers 偏差不大的資料稱為有效資料,偏差大的資料是無效資料。如果有效資料佔大多數,無效資料只是...