2012-02-11 8 views
5

평면을 최소 제곱 법으로 설정된 3D 포인트에 맞추고 있습니다. 이미 알고리즘을 가지고 있지만 가중치가 최소 인 사각형을 사용하도록 수정하려고합니다. 의미는 각 포인트에 대한 가중치 (더 큰 가중치, 더 가깝게는 포인트에 있어야 함)입니다. (가중치 없음)가중치 최소 제곱 - 평면을 3D 포인트 세트에 맞 춥니 다

현재 알고리즘은 다음과 같다 :

계산 합계 :

for(Point3D p3d : pointCloud) { 
    pos = p3d.getPosition(); 
    fSumX += pos[0]; 
    fSumY += pos[1]; 
    fSumZ += pos[2]; 
    fSumXX += pos[0]*pos[0]; 
    fSumXY += pos[0]*pos[1]; 
    fSumXZ += pos[0]*pos[2]; 
    fSumYY += pos[1]*pos[1]; 
    fSumYZ += pos[1]*pos[2]; 
} 

행렬하게보다 :

double[][] A = { 
    {fSumXX, fSumXY, fSumX}, 
    {fSumXY, fSumYY, fSumY}, 
    {fSumX, fSumY, pointCloud.size()} 
}; 

double[][] B = { 
    {fSumXZ}, 
    {fSumYZ}, 
    {fSumZ} 
}; 
도끼 = B 해결보다

및 3 솔루션의 구성 요소는 맞는 평야의 계수입니다 ...

S 오, 무게를 사용하기 위해 이것을 수정하는 법을 제발 도와 주실 수 있습니까? 감사!

+4

FYI - 많은 점수 (> 20 점)를 가질 수 있고 좌표에 큰 오프셋이있는 경우 통계를 계산하지 마십시오 (원본 위치의 제곱의 합계를 취함)) - 수치 오류에 대한 민감도가 낮습니다. 최소한 X/Y/Z 좌표의 평균값을 뺀 다음 처리를 수행 한 다음 끝에 오프셋을 다시 추가하십시오. 이 작업을 수행하는 다른 알고리즘 별 방법이 있지만 알고리즘이 최소 제곱을 사용하는 방식을 정확히 이해할 수 없으므로 그 이상을 해결할 수는 없습니다. –

+0

오프셋이란 무엇입니까? (죄송합니다,이 문맥에서 그것을 이해하지 마십시오). –

+2

간단한 예 : 점 p1 = (10001, 10002, 10003), p2 = (10005, 10006, 10007), p3 = (10009, 10004, 10008). 평균값은 (10005, 10004, 10006)입니다. 따라서 포인트 좌표를이 양과 반대로 오프셋 (변환)하여 p1 '= (-4, -2, -3), p2'= (0,2,1), p3 '= (4,0, 2). 그런 다음 계산을 한 다음 오프셋에서 다시 추가하십시오. –

답변

10

직관

정상 n에 의해 정의 된 평면과 평면 p 순종의 점에 점 x : n.(x - p) = 0. 점 y이 평면에 있지 않으면 n.(y -p)은 0이 아니므로 비용을 정의하는 유용한 방법은 |n.(y - p)|^2입니다. 이것은 평면에서 점 y의 제곱 된 거리입니다. 동일한 무게와

, 당신은 점을 통해 합산하면 총 제곱 오차를 최소화하는 n를 찾으려면 :

f(n) = sum_i | n.(x_i - p) |^2 

지금이 우리가 비행기에 놓여 일부p을 알고 가정합니다. 중심점 (centroid)을 쉽게 계산할 수 있습니다. 중심점은 단순히 점 구름에서 점의 구성 요소 중심 평균이며 항상 최소 자승 평면에 놓입니다.

솔루션

가의 각 행이 ithx_i 마이너스 중심 c입니다 매트릭스 M을 정의 할 수 있습니다, 우리가 할 수있는 다시 쓰기 :

f(n) = | M n |^2 

당신은 너 자신을 설득 할 수 있어야한다 이 행렬 곱셈 버전은 이전 방정식의 합과 같습니다.그런 다음 Msingular value decomposition를 취할 수

하고 n 그런 다음 작은 특이 값에 해당 M의 오른쪽 특이 벡터에 의해 주어진다합니다.

가중치를 통합하려면 각 점에 대해 가중치를 w_i 정의하기 만하면됩니다. 포인트의 가중 평균으로 c을 계산하고 sum_i | n.(x_i - c) |^2sum_i | w_i * n.(x_i - c) |^2으로, 매트릭스 M을 비슷한 방식으로 변경하십시오. 이전처럼 해결하십시오.

+0

결국 당신이 옳았습니다. 고맙습니다! –

2

각 단어의 각 단어에 해당 가중치를 곱하십시오. 예를 들어 : pointCloude.size() 이후

fSumZ += weight * pos[2]; 
fSumXX += weight * pos[0]*pos[0]; 

모든 점에 대한 1의 합은, 모든 가중치의 합으로 대체되어야한다.

+0

나는 각 용어에 체중을 곱하면 충분하다고 생각했지만, 확실하지 않았습니다 ... 나는 그것을 시도하고 돌아올 것입니다. 감사. –

0

최소 제곱 오차 계산을 재정의하는 것으로 시작하십시오. 수식은 오류의 제곱의 합을 최소화하려고 시도합니다. 거리에 따라 감소하는 두 점의 함수로 제곱 오차를 곱하십시오. 그런 다음 제곱 된 오류의 가중치 합을 최소화하고 그로부터 계수를 유도하십시오.

관련 문제