特に2000ポイントもの処理を行う場合は、常に多くの計算が必要になります。この種のパターンマッチングのための高度に最適化されたソリューションは既にあると確信していますが、それらを見つけるには何と呼ばれるかを理解する必要があります。
画像ではなく点群(スパースデータ)について話しているので、私の相互相関法は実際には適用されません(計算上はさらに悪化します)。RANSACのようなものはおそらくすぐに一致を見つけますが、私はそれについてあまり知りません。
解決策での私の試み:
仮定:
- 緩い一致または「おそらく正しい」一致だけでなく、最適な一致を見つけたい
- 一致には、測定または計算のノイズによる若干の誤差があります
- ソースポイントは同一平面上にあります
- すべてのソース点がターゲットに存在している必要があり(= 任意の不一致点は、全体プロファイルのミスマッチです)
したがって、物事を失格にして計算時間を短縮することにより、多くのショートカットを使用できるようになります。要するに:
- ソースから3点を選ぶ
- ターゲットポイントを検索し、同じ形状の3つのポイントのセットを見つける
- 3点の一致が見つかったら、それらが定義する平面内の他のすべての点をチェックして、それらが近い一致であるかどうかを確認します。
- すべてのポイントの一致が複数見つかった場合、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=(x1−x2)2+(y1−y2)2+(z1−z2)2−−−−−−−−−−−−−−−−−−−−−−−−−−−−√
( 20002)
実際には、一致を見つけるかどうかにかかわらず、これらすべてを計算する必要があり、このステップの最近傍のみを考慮するため、メモリがある場合は、最適化されたアルゴリズムを使用してこれらの値を事前計算することをお勧めします。DelaunayやPittewayの三角測量のようなもので、ターゲット内のすべてのポイントがその最近傍に接続されています。それらをテーブルに保存し、ソース三角形をターゲット三角形のいずれかにフィットさせようとするときに、各ポイントを検索します。
多くの計算が含まれますが、ボリュームデータの相互相関が関係するような無意味なゼロを多数乗算するのではなく、データのみを処理するため、比較的高速です。ドットの中心を最初に見つけて、それらを座標のセットとして保存した場合、これと同じ考え方が2Dの場合にも機能します。