1

相対法線に基づいてポイントを分類するのに少し問題があります。私がやりたいのは、以下で得た情報を使用して、ある程度90度の角度にバイアスをかけて、単純化されたポリゴンをポイントにフィットさせることです。

各ポイントの大まかな(あまり正確ではありませんが)法線がありますが、ポイントの近さと法線の近さでデータベースを分離する方法がわかりません。法線が実際の面にうまく適合しない場合があるため、各面のポイントをチャンク化した後、線形回帰を実行する予定です(ただし、各面は互いに近接しています)。

例: 代替テキストhttp://a.imageshack.us/img842/8439/ptnormals.png

理想的には、このデータの周りに長方形を収めることができるようにしたいと思います。ただし、ポリゴンは凸面である必要はなく、軸と位置合わせする必要もありません。

このようなことを達成する方法についてのヒントは素晴らしいでしょう。

前もって感謝します

4

3 に答える 3

2

これがあなたが探しているものであるかどうかはわかりませんが、私が理解した問題を解決するための私の試みは次のとおりです。

法線ベクトルの角度を使用して、長方形の各辺(左、右、上、下)に属する点を見つけ、それぞれに線を合わせます。

%# create random data (replace those with your actual data)
num = randi([10 20]);
pT = zeros(num,2);
pT(:,1) = rand(num,1);
pT(:,2) = ones(num,1) + 0.01*randn(num,1);
aT = 90 + 10*randn(num,1);

num = randi([10 20]);
pB = zeros(num,2);
pB(:,1) = rand(num,1);
pB(:,2) = zeros(num,1) + 0.01*randn(num,1);
aB = 270 + 10*randn(num,1);

num = randi([10 20]);
pR = zeros(num,2);
pR(:,1) = ones(num,1) + 0.01*randn(num,1);
pR(:,2) = rand(num,1);
aR = 0 + 10*randn(num,1);

num = randi([10 20]);
pL = zeros(num,2);
pL(:,1) = zeros(num,1) + 0.01*randn(num,1);
pL(:,2) = rand(num,1);
aL = 180 + 10*randn(num,1);

pts = [pT;pR;pB;pL];                 %# x/y coords
angle = mod([aT;aR;aB;aL],360);      %# angle in degrees [0,360]

%# plot points and normals
plot(pts(:,1), pts(:,2), 'o'), hold on
theta = angle * pi / 180;
quiver(pts(:,1), pts(:,2), cos(theta), sin(theta), 0.4, 'Color','g')
hold off

%# divide points based on angle
[~,bin] = histc(angle,[0 45 135 225 315 360]);
bin(bin==5) = 1;                     %# combine last and first bin

%# fit line to each segment
hold on
for i=1:4
    %# indices of points in this segment
    idx = ( bin == i );

    %# x/y or y/x
    if i==2||i==4, xx=1; yy=2; else xx=2; yy=1; end

    %# fit line
    coeff = polyfit(pts(idx,xx), pts(idx,yy), 1);
    fit(:,1) = 0:0.05:1;
    fit(:,2) = polyval(coeff, fit(:,1));

    %# plot fitted line
    plot(fit(:,xx), fit(:,yy), 'Color','r', 'LineWidth',2)
end
hold off

プロット

于 2010-08-16T01:37:14.973 に答える
1

次のことを試してみます

  1. 近接度と同様の角度に基づいてポイントをクラスター化します。エッジがいくつあるかが事前にわからないため、単一リンケージ階層クラスタリング( MatlabではLINKAGE )を使用します。単一のリンケージは線形構造を優先します。これはまさにあなたが探しているものです。2点間の距離基準として、点座標間のユークリッド距離に、角度がたとえば20度または30度を超えるとすぐに非常に急激に増加する角度の関数を掛けたものを使用できます。
  2. データに対して(ロバストな)線形回帰を実行します。法線を使用すると、役立つ場合と役に立たない場合があります。私の推測では、彼らはあまり役に立たないでしょう。簡単にするために、最初は法線を無視することをお勧めします。
  3. 線の間の交点を見つけます。
  4. 必要に応じて、たとえば反対側の線を平行に制限するなどして、いつでもフィットを改善することができます。

それが失敗した場合は、このペーパーでアプローチを実装してみてください。これにより、一度に複数の直線をフィットさせることができます。

于 2010-08-16T00:14:13.817 に答える
0

各辺のX座標とY座標の平均値を取得し、それに基づいて線を作成することができます。

于 2010-08-16T00:16:34.840 に答える