利用 ransac 演算法擬合平面

2021-07-24 06:22:34 字數 2932 閱讀 2118

最近專案中遇到乙個問題, 老闆給了一組資料然後要求獲取其中處於同乙個平面上的資料點的資訊, 很明顯就是使用ransac 演算法進行處理。

這裡我們使用自己的理解來說明下這個演算法。

1. 首先我們從給定的資料集中隨機挑選幾組資料獲取乙個模型(最好可以保證隨機挑選的資料不重複)

2. 將這個擬合方程作用於所有的資料,根據閾值區分出模型的內點和外點資訊

3. 重複多次上述操作,挑選出其中包含內點數目最多的模型

具體的關於ransac 的演算法說明可以參考 random sample consensus

%% 利用ransac 方法從一組三維資料點中找到處於同乙個平面上的資料點

% @param w3 輸入資料點 4 x n

% @return [w, id_best, plane_best, inliner, outliner] 在同乙個平面上的物點,

% 挑選的物點在原始資料集中的標號, 最佳擬合平面表示形式(【a, b, c, d】: ax + by + cz + d = 0, 1 x 4),

% 在平面上的內點數目, 不再平面上的外點數目

%function

[w, id_best, plane_best, inliner_best, outliner_best] = simulateplane

(w3)

assert(size(w3, 1) == 4, 'please check your input for w3')

iterations = 0;

k = 500;

w3_len = size(w3, 2);

dis_limit_xishu = 1.3;

dis_limit = 0.015;

inliner_best = 0;

ids_set = ;

while iterations < k

%% 隨機 4 點獲取平面引數

while

1 ids = myrand4(1, w3_len);

% 去重

if ~ismember(ids, ids_set, 'rows')

ids_set = [ids_set; ids];

break;

endend a = w3(:, ids)';

[uu, dd, vv] = svd(a);

plane = vv(:,end);

plane = plane ./ plane(end);

plane = plane';

%% 計算內點

dis = abs(plane * w3);

% dis_limit_best = min(dis_limit_xishu * mean(dis), dis_limit_best);

% dis_limit_best = min(dis_limit_xishu * mean(dis), dis_limit);

dis_limit_best = dis_limit;

inliner = sum(dis < dis_limit_best);

outliner = sum(dis >= dis_limit_best);

if inliner > inliner_best

plane_best = plane;

inliner_best = inliner;

outliner_best = outliner;

end

iterations = iterations + 1;

end%% 找到 best_plane 上的內點

dis = abs(plane_best * w3);

id_best = find(dis < dis_limit_best);

w = w3(:, id_best);

endfunction

[ids] = myrand4

(minlimit, maxlimit)

ids = ;

count = 0;

while count < 4

id = randi([minlimit, maxlimit], 1, 1);

if ismember(id, ids)

continue

end ids = [ids, id];

count = count + 1;

endids = sort(ids);

end

相應的圖形繪製**:

參考資料:

close all

figure

plot3(w3(1, :), w3(2, :), w3(3, :), '*');

hold on

plot3(w(1, :), w(2, :), w(3, :), 'o');

hold on

x = min(w3(1, :)) : 0.5 : max(w3(1, :));

y = min(w3(2, :)) : 0.5 : max(w3(2, :));

[x,y] = meshgrid(x, y);

z = -(plane(1)*x + plane(2) * y + plane(4))/plane(3);

surf(x, y, z)

hold off

PCL 使用RANSAC擬合平面

二 示例 三 結果展示 隨機抽樣一致性演算法ransac random sample consensus 是一種迭代的方法來從一系列包含有離異值的資料中計算數學模型引數的方法。ransac演算法本質上由兩步組成,不斷進行迴圈 1 從輸入資料中隨機選出能組成數學模型的最小數目的元素,使用這些元素計算出...

matlab中實現RANSAC平面擬合

三維平面擬合 生成隨機資料 內點mu 0 0 0 均值 s 2 0 4 0 4 0 4 0 8 協方差 data1 mvnrnd mu,s,300 產生200個高斯分布資料 外點mu 2 2 2 s 8 1 4 1 8 2 4 2 8 協方差 data2 mvnrnd mu,s,100 產生100個...

Ransac演算法 直線擬合

ransac演算法 專案主頁 1 演算法簡介 隨機抽樣一致演算法 random sample consensus,ransac 它是一種迭代的方法,用來在一組包含離群的被觀測資料中估算出數學模型的引數。ransac是乙個非確定性演算法,在某種意義上說,它會產生乙個在一定概率下合理的結果,其允許使用更...