특히 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
디= ( x1− x2)2+ ( y1− y2)2+ ( z1− z2)2−−−−−−−−−−−−−−−−−−−−−−−−−−−−√
( 2000 년2)
실제로 일치하는 항목을 찾을 수 있는지 여부에 관계없이 이러한 모든 항목을 계산해야 하므로이 단계에서 가장 가까운 이웃에만 관심이 있기 때문에 메모리가 있으면 최적화 된 알고리즘을 사용하여 이러한 값을 미리 계산하는 것이 좋습니다 . Delaunay 또는 Pitteway 삼각 측량 과 같은 것인데 , 대상의 모든 점이 가장 가까운 이웃에 연결됩니다. 그것들을 테이블에 저장하고, 소스 삼각형을 목표 삼각형 중 하나에 맞추려고 할 때 각 점을 찾으십시오.
많은 계산이 필요하지만, 데이터에 대해서만 작동하기 때문에 비교적 빠르며, 이는 부피 데이터의 상호 상관을 포함하는 것처럼 의미없는 0을 곱하는 것이 아니라 드문 경우입니다. 점의 중심을 먼저 찾아 좌표 세트로 저장하면 2D 경우에도 동일한 아이디어가 적용됩니다.