点群でのプロファイルマッチング


14

ポイントクラウドは、のために均一なランダム関数を使用して生成されます(x,y,z)。次の図に示すように、(正確ではないにしても)最適なターゲットプロファイルに一致する、つまり左下のコーナーで与えられる、平らな交差面(profile)が調査されています。だから、質問は次のとおりです。

1- 以下の注意事項/条件target 2D point mappoint cloud考慮することにより、このような一致を見つける方法は?
2-座標/方向/類似度などは何ですか?

注1:関心のあるプロファイルは、軸に沿って任意の回転が可能な場所であればどこでもかまいません。また、位置や向きに応じて、三角形、長方形、四角形などの異なる形状にすることもできます。次のデモンストレーションでは、単純な長方形のみが示されています。

注2:許容値は、プロファイルからのポイントの距離と見なすことができます。次の図のためにこれを実証するためには、許容範囲の仮定0.01最小寸法回(~1)そうにtol=0.01。したがって、残りを削除して、調査対象のプロファイルの平面上に残りのすべてのポイントを投影すると、ターゲットプロファイルとの類似性を確認できます。

注3:関連するトピックは、ポイントパターン認識にあります。

ここに画像の説明を入力してください


@Developer Offトピックですが、これらのプロットを生成するためにどのソフトウェアを使用していますか?
スペイシー

1
@Mohammad Iの使用Python+ MatPlotLib私の研究を行うためやグラフなどを生成する
開発者

@Developer Fantastic-Pythonを介していますが、「Python shell ala Matlab」とはどういう意味ですか?
スペイシー

点群はどのように保存されますか?各ポイントの中心の座標のセットとして、またはポイントの周りの座標にゼロ以外の値を持つボリュームデータセットとして?
エンドリス

@endolithすべてのポイントには、として関連付けられP:{x,y,z}た座標があります。それらは確かに無次元のポイントです。ただし、ある程度の近似を行うと、3D配列として1ピクセルの次元に離散化できます。また、座標に他の属性(ウェイトなど)を組み込むこともできます。
開発者

回答:


4

特に2000ポイントもの処理を行う場合は、常に多くの計算が必要になります。この種のパターンマッチングのための高度に最適化されたソリューションは既にあると確信していますが、それらを見つけるには何と呼ばれるかを理解する必要があります。

画像でなく点群(スパースデータ)について話しているので、私の相互相関法は実際には適用されません(計算上はさらに悪化します)。RANSACのようなものはおそらくすぐに一致を見つけますが、私はそれについてあまり知りません。

解決策での私の試み:

仮定:

  • 緩い一致または「おそらく正しい」一致だけでなく、最適な一致を見つけたい
  • 一致には、測定または計算のノイズによる若干の誤差があります
  • ソースポイントは同一平面上にあります
  • すべてのソース点がターゲットに存在している必要があり(= 任意の不一致点は、全体プロファイルのミスマッチです)

したがって、物事を失格にして計算時間を短縮することにより、多くのショートカットを使用できるようになります。要するに:

  1. ソースから3点を選ぶ
  2. ターゲットポイントを検索し、同じ形状の3つのポイントのセットを見つける
  3. 3点の一致が見つかったら、それらが定義する平面内の他のすべての点をチェックして、それらが近い一致であるかどうかを確認します。
  4. すべてのポイントの一致が複数見つかった場合、3D距離の誤差の合計が最小のものを選択します

より詳細な:

pick a point from the source for testing s1 = (x1, y1)
Find nearest point in source s2 = (x2, y2)
d12 = (x1-x2)^2 + (y1-y2)^2
Find second nearest point in source s3 = (x3, y3)
d13 = (x1-x3)^2 + (y1-y3)^2
d23 = (x2-x3)^2 + (y2-y3)^2

for all (x,y,z) test points t1 in target:
    # imagine s1 and t1 are coincident
    for all other points t2 in target:
        if distance from test point > d12:    
            break out of loop and try another t2 point
        if distance ≈ d12:
            # imagine source is now rotated so that s1 and s2 are collinear with t1 and t2
            for all other points t3 in target:
                if distance from t1 > d13 or from t2 > d23:
                    break and try another t3
                if distance from t1 ≈ d13 and from t2 ≈ d23:
                    # Now you've found matching triangles in source and target
                    # align source so that s1, s2, s3 are coplanar with t1, t2, t3
                    project all source points onto this target plane 
                    for all other points in source:
                        find nearest point in target
                        measure distance from source point to target point
                        if it's not within a threshold:
                            break and try a new t3
                        else:
                            sum errors of all matched points for this configuration (defined by t1, t2, t3)

他のすべてのポイントの最小二乗誤差を持つ構成が最適です

3つの最近傍のテストポイントで作業しているため、ターゲットポイントの一致は、それらが一定の半径内にあるかどうかをチェックすることで単純化できます。たとえば、(0、0)から半径1を検索する場合、実際のユークリッド距離を計算せずにx1-x2に基づいて(2、0)を失格にして、少し高速化することができます。これは、減算が乗算よりも高速であることを前提としています。ありますより多くの任意の固定半径に基づいて最適化された検索は、あまりにも、。

function is_closer_than(x1, y1, z1, x2, y2, z2, distance):
    if abs(x1 - x2) or abs(y1 - y2) or abs(z1 - z2) > distance:
        return False
    return (x1 - x2)^2 + (y1 - y2)^2 + (z1 - z2)^2 > distance^2 # sqrt is slow

d=(x1x2)2+(y1y2)2+(z1z2)2

(20002)

実際には、一致を見つけるかどうかにかかわらず、これらすべてを計算する必要があり、このステップの最近傍のみを考慮するため、メモリがある場合は、最適化されたアルゴリズムを使用してこれらの値を事前計算することをお勧めします。DelaunayPittewayの三角測量のようなもので、ターゲット内のすべてのポイントがその最近傍に接続されています。それらをテーブルに保存し、ソース三角形をターゲット三角形のいずれかにフィットさせようとするときに、各ポイントを検索します。

多くの計算が含まれますが、ボリュームデータの相互相関が関係するような無意味なゼロを多数乗算するのではなく、データのみを処理するため、比較的高速です。ドットの中心を最初に見つけて、それらを座標のセットとして保存した場合、これと同じ考え方が2Dの場合にも機能します。


1
あなたの答えの最初の部分は、実際には、点群を通るすべての可能な平面の近くにある(閾値を考慮して)近くの点を探すブルートフォース法です。たとえば、わずか2000ポイントの場合、2,662,668,000,000 (式)の距離計算が必要になります。
開発者

@Developer:はい、特に何千ものポイントがある場合は、多くの計算が必要になります。はい、2000ポイントの場合、飛行機が見つからなければ、2,658,673,998,000の計算を行うことになります。おそらく、飛行機見つけると、十分なポイントが見つかったらすぐに停止するため、時間を短縮できます。しかし、とにかく、私はこれについて考えていて、おそらくより良いアイデアを持っているので、答えを変えます。
エンドリス

1
あなたは絶対に完全に正しい点を得ました。停止基準は適切な平面を見つけた後でも適用できないが、より良い一致がある可能性があるため、すべての可能な平面をチェックする必要があることを追加します。私はすでにこのアイデアを実装しておりFortran500ポイントを超える数の助けを借りても、PCを体験することは不可能になるでしょう。
開発者

2

RANSACの横にある代替ソリューションに@ mirror2imageの説明を追加します。ICPアルゴリズム(反復の最も近い点)を検討することができます。説明はここにあります

このICPを使用する際の次の課題は、独自のコスト関数と、3Dクラウドポイントデータに対するターゲットプレーンの開始ポーズを定義することだと思います。いくつかの実用的なアプローチは、反復中にデータにランダムノイズを導入して、誤った最小値への収束を回避することです。これは、設計する必要があると思うヒューリスティックな部分です。

更新:

簡略化された形式の手順は次のとおりです。

  1. 各入力ポイントに最も近いポイントを見つけます。
  2. 入力からターゲットへの変換を計算し、変換を使用して入力ポイントを移動します。
  3. 類似度関数を計算します(たとえば、各入力ポイントから対応するペアのターゲットポイントまでの距離)。
  4. 停止状態を確認してください。

ステップ1-4を繰り返します。

ここで検討できる利用可能なライブラリがあります!(まだ試していません)、登録部分に1つのセクションがあります(他の方法を含む)。


リンクと提案をありがとう。そのような有用なアイデアは、初心者の研究者として常に私たちがより早く物事を学ぶのに役立ちます。私はいつもより多くの説明に感謝します。
開発者
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.