포인트 클라우드에서 프로파일 매칭


14

에 대한 균일 랜덤 함수를 사용하여 점 구름 이 생성됩니다 (x,y,z). 다음 그림에서 볼 수 있듯이 평면 교차면 ( profile )을 대상 프로파일 중 가장 일치하는 (정확하지는 않지만) 왼쪽 하단 모서리에 일치 하는 평면 교차 평면 ( profile )을 조사하고 있습니다. 따라서 질문 은 다음과 같습니다.

1- 다음 참고 사항 / 조건 target 2D point mappoint cloud고려하여 주어진 일치 항목을 찾는 방법은 무엇입니까?
2- 그러면 좌표 / 방향 / 유사도 등은 무엇입니까?

참고 1 : 관심있는 프로파일은 축을 따라 회전하는 위치에 상관없이 위치 및 방향에 따라 삼각형, 사각형, 사각형 등의 다른 모양 일 수도 있습니다. 다음 데모에서는 간단한 사각형 만 표시됩니다.

참고 2 : 공차 값은 프로파일에서 점의 거리로 간주 될 수 있습니다. 다음 그림이를 증명하는 것은 허용 오차 가정 0.01가장 작은 치수 시간 (~1)정도 tol=0.01. 따라서 나머지를 제거하고 조사중인 프로파일 평면에 나머지 모든 점을 투영하면 대상 프로파일과의 유사성을 확인할 수 있습니다.

참고 3 : 관련 주제는 포인트 패턴 인식 에서 찾을 수 있습니다 .

여기에 이미지 설명을 입력하십시오


@Developer Off 주제이지만 이러한 플롯을 생성하기 위해 어떤 소프트웨어를 사용하고 있습니까?
Spacey

1
@Mohammad 저는 Python+ MatPlotLib를 사용 하여 연구를하고 그래프 등을 생성합니다.
Developer

@Developer Fantastic-그것은 파이썬을 통한 것이지만 'Python shell ala Matlab'은 무엇을 의미합니까?
Spacey

포인트 클라우드는 어떻게 저장됩니까? 각 점의 중심에 대한 좌표 세트 또는 점 주위 좌표에 0이 아닌 값을 갖는 체적 데이터 세트로?
endolith

@endolith 모든 점은와 관련된 좌표를 갖습니다 P:{x,y,z}. 그들은 실제로 차원이없는 점입니다. 그러나 근사치가 있지만 3 차원 배열로 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

=(엑스1엑스2)2+(와이1와이2)2+(12)2

(2000 년2)

실제로 일치하는 항목을 찾을 수 있는지 여부에 관계없이 이러한 모든 항목을 계산해야 하므로이 단계에서 가장 가까운 이웃에만 관심이 있기 때문에 메모리가 있으면 최적화 된 알고리즘을 사용하여 이러한 값을 미리 계산하는 것이 좋습니다 . Delaunay 또는 Pitteway 삼각 측량 과 같은 것인데 , 대상의 모든 점이 가장 가까운 이웃에 연결됩니다. 그것들을 테이블에 저장하고, 소스 삼각형을 목표 삼각형 중 하나에 맞추려고 할 때 각 점을 찾으십시오.

많은 계산이 필요하지만, 데이터에 대해서만 작동하기 때문에 비교적 빠르며, 이는 부피 데이터의 상호 상관을 포함하는 것처럼 의미없는 0을 곱하는 것이 아니라 드문 경우입니다. 점의 중심을 먼저 찾아 좌표 세트로 저장하면 2D 경우에도 동일한 아이디어가 적용됩니다.


1
답의 첫 번째 부분은 실제로 점 구름을 통해 가능한 모든 평면 주위에서 (임계 값을 계산하여) 근처 점을 찾는 무차별 대입 방법입니다. 예를 들어 2000 포인트에 대해서만 2,662,668,000,000 (수식) 거리 계산이 필요합니다.
개발자

@Developer : 그렇습니다. 특히 수천 점이 있다면 많은 계산이 필요합니다. 예, 2000 포인트의 경우 비행기를 찾지 못하면 결국 2,658,673,998,000 개의 계산을 수행하게됩니다. 아마도 비행기를 찾을 것입니다. 비행기는 충분한 포인트를 찾으면 멈추기 때문에 시간이 줄어 듭니다. 어쨌든, 나는 이것에 대해 생각하고 있었고 아마도 더 좋은 아이디어를 가지고 있으며, 대답을 바꿀 것입니다.
endolith

1
당신은 절대적으로 요점을 완전히 알았습니다. 적절한 기준면을 찾은 후에도 정지 기준을 적용 할 수없고 일치하는 것이 훨씬 더 좋을 수 있으므로 가능한 모든 평면을 확인해야합니다. 나는 이미이 아이디어를 구현했으며 포인트 Fortran보다 많은 숫자 500를 사용하더라도 PC 경험이 불가능하다는 것을 알았습니다.
개발자

2

RANSAC 옆에있는 대체 솔루션에 @ mirror2image 설명을 추가하고 ICP 알고리즘 (가장 가까운 점)을 고려할 수 있습니다. 설명은 여기 에서 찾을 수 있습니다 !

이 ICP를 사용할 때의 다음 도전은 자신의 비용 함수와 3D 클라우드 포인트 데이터에 대한 대상 평면의 시작 포즈를 정의하는 것입니다. 실제 접근 방식은 반복 중에 데이터에 임의의 노이즈를 도입하여 허위 최소값으로 수렴하지 않도록하는 것입니다. 이것은 휴리스틱 부분으로 디자인해야 할 것 같습니다.

최신 정보:

단순화 된 형태의 단계는 다음과 같습니다.

  1. 각 입력 지점에 가장 가까운 지점을 찾으십시오.
  2. 입력에서 대상으로 변환을 계산 한 다음 변환을 사용하여 입력 포인트를 이동합니다.
  3. 유사성 기능을 계산합니다 (예 : 각 입력 지점 wrt와 해당 쌍 대상 지점의 거리).
  4. 정지 상태를 확인하십시오.

1-4 단계를 반복하십시오.

여기에서 고려할 수있는 라이브러리가 있습니다 ! (아직 시도하지 않았습니다) 등록 부분에 다른 섹션이 하나 있습니다 (다른 방법 포함).


링크와 제안에 감사드립니다. 이러한 유용한 아이디어는 초보자 연구원으로서 항상 더 빨리 학습하는 데 도움이됩니다. 나는 항상 더 많은 설명을 주셔서 감사합니다.
개발자
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.