2013-05-19 8 views
10

해당 이미지의 모션을 기반으로 새 카메라 위치를 계산하려고합니다. 이미지는 핀홀 카메라 모델을 따릅니다.해당 이미지에서 카메라 모션

실제로 유용한 결과를 얻지 못하므로 절차를 설명하고 누군가가 나를 도울 수 있기를 바랍니다.

SIFT를 사용하여 해당 이미지의 기능을 일치시키고 OpenCV의 FlannBasedMatcher와 일치시키고 OpenCV의 findFundamentalMat (메소드 RANSAC)를 사용하여 기본 매트릭스를 계산합니다. 내가하려고 그런

SVD decomp = SVD(E); 
Matx33d W(0,-1,0, 
      1,0,0, 
      0,0,1); 
Matx33d Wt(0,1,0, 
      -1,0,0, 
      0,0,1); 
R1 = decomp.u * Mat(W) * decomp.vt; 
R2 = decomp.u * Mat(Wt) * decomp.vt; 
t1 = decomp.u.col(2); //u3 
t2 = -decomp.u.col(2); //u3 

:

Mat E = K.t() * F * K; 

내가 회전 및 번역 특이 값 분해로하는 필수 매트릭스를 분해 :

은 그 때 나는 카메라 고유 행렬 (K)에 의해 필수 행렬을 계산 삼각 측량에 의해 올바른 해결책을 찾으십시오. (이 부분은 http://www.morethantechnical.com/2012/01/04/simple-triangulation-with-opencv-from-harley-zisserman-w-code/입니다. 그래서 나는 그것이 올바르게 작동해야한다고 생각합니다.) new_pos & old_pos은 벡터 (3 ×)이다

new_pos = old_pos + -R.t()*t; 

는 R 회전 행렬 (× 3)하고 번역 벡터 (3 ×)을 T :

새로운 위치

이어서 계산된다.

유감스럽게도 유용한 결과가 없으므로 잘못된 정보가있을 수 있습니다. 여기

는 (단지의 경우 누군가가 그 중 하나는 확실히 잘못된 것을 확인할 수) 몇 가지 결과입니다

모든
F = [8.093827077399547e-07, 1.102681999632987e-06, -0.0007939604310854831; 
    1.29246107737264e-06, 1.492629957878578e-06, -0.001211264339006535; 
    -0.001052930954975217, -0.001278667878010564, 1] 

K = [150, 0, 300; 
    0, 150, 400; 
    0, 0, 1] 

E = [0.01821111092414898, 0.02481034499174221, -0.01651092283654529; 
    0.02908037424088439, 0.03358417405226801, -0.03397110489649674; 
    -0.04396975675562629, -0.05262169424538553, 0.04904210357279387] 

t = [0.2970648246214448; 0.7352053067682792; 0.6092828956013705] 

R = [0.2048034356172475, 0.4709818957303019, -0.858039396912323; 
    -0.8690270040802598, -0.3158728880490416, -0.3808101689488421; 
    -0.4503860776474556, 0.8236506374002566, 0.3446041331317597] 
+1

계산에 한 가지 더 실수가 있습니다. 'SVD decomp = SVD (E);'는 괜찮지 만 새로운'newE = U * diag (1,1,0) * Vt'를 계산해야만하고 다시'SVD decomp2 = SVD (newE) ;'. – who9vy

+0

흥미 롭습니다. 나는 그것에 대해 읽지 않았다. 그래서 저는 decomp2로 R과 t를 계산합니까? btw : 귀하의 자세한 답변 주셔서 감사합니다. 나는 모든 것을 점검하고 최대한 빨리 대응할 것입니다. – 3x14159265

+0

예, decomp2로 R과 t를 계산해야합니다. 자세한 설명은 여기 (pp 257-260) http://www.robots.ox.ac.uk/~vgg/hzbook/hzbook2/HZepipolar.pdf – who9vy

답변

10

먼저 확인해야 귀하의 포인트 대응 x'을위한

x' * F * x = 0 

경우 및 x. 이것은 물론 RANSAC를 사용한 기본 행렬 추정의 경우에만 해당됩니다.

그 이후에는 K' 번째 화상의 극한 카메라 행렬이고 x' 번째 화상의 점 어디이

xn = inv(K) * x 
xn' = inv(K') * x' 

같이 정규화 화상 좌표 (NCC)에 점 대응 변환한다. 나는 당신의 경우에 그것은 K = K'라고 생각합니다.

이러한 NCC를 사용하면 설명 된 것처럼 필수 매트릭스를 분해 할 수 있습니다. 표준화 된 카메라 좌표를 삼각형 화하고 삼각 분할 된 점의 깊이를 확인합니다. 그러나 문학에서 그들은 정확한 회전과 이동을 얻기에 한 점으로 충분하다고 말합니다. 내 경험에 비추어 볼 때, RANSAC 후에도 한 점이 이상치가 될 수 있으므로 몇 가지 점을 확인해야합니다.

필수 매트릭스를 분해하기 전에 E=U*diag(1,1,0)*Vt을 확인하십시오. 이 조건은 투영 행렬의 네 가지 가능한 선택에 대해 올바른 결과를 얻기 위해 필요합니다.

올바른 회전 및 평행 이동이 이루어지면 모든 점 대응 (RANSAC을 사용한 기본 행렬 추정의 인레이)을 삼각형화할 수 있습니다. 그런 다음 reprojection error을 계산해야합니다. 첫째, 당신은 X는 계산 (균일) 3D 위치 인이

xp = K * P * X 
xp' = K' * P' * X 

같은 투영 된 위치를 계산한다. PP'은 3x4 투영 매트릭스입니다. 투영 행렬 P은 일반적으로 ID로 지정됩니다. P' = [R, t]은 첫 번째 3 열과 행의 회전 행렬과 네 번째 열의 변환에 의해 주어 지므로 P은 3x4 행렬입니다. 3D 위치를 homogeneous coordinates으로 변환하면 3x1이 아닌 4x1 벡터로 변환됩니다. 그런 다음 xpxp'은 해당 점의 (재 투영 된) 2D 위치를 나타내는 동질 좌표입니다.

난 당신 만 old_pos 번역의

new_pos = old_pos + -R.t()*t; 

이 우선하기 때문에 잘못 생각하고 당신이 그것을 회전하지 않고 둘째, 당신은 잘못 벡터로 변환합니다. 위에서 올바른 방법이 제공됩니다.

따라서 재 투영 된 점을 계산 한 후에 재 투영 오류를 계산할 수 있습니다. 동질적인 좌표로 작업 할 때 좌표를 정규화해야합니다 (xp = xp/xp(2), 마지막 좌표로 나눕니다).

error = (x(0)-xp(0))^2 + (x(1)-xp(1))^2 

오류가 10^2와 같이 큰 경우 내장 카메라 보정 또는 회전/평행 이동이 잘못되었습니다 (둘 다 가능할 수 있습니다). 좌표계에 따라 투영 행렬을 반전시킬 수 있습니다. 그 이유는 3x4 행렬을 뒤집을 수 없기 때문에 동질적인 좌표로 변환해야하기 때문입니다. 따라서 네 번째 행 [0 0 0 1]을 추가하고 역수를 계산하고 네 번째 행을 제거하십시오.

재 투영 오류가 한 가지 더 있습니다. 일반적으로 재 투영 오차는 원래의 점 대응 (각 이미지에서)과 재 투영 된 위치 사이의 제곱 거리입니다. 두 점 사이의 유클리드 거리를 구하려면 제곱근을 취할 수 있습니다.

+0

은 방정식'x '* F * x = 0'입니다. 실제로 정확히 0 도요? 1,12345 * e^-14와 같은 값이 여전히 유효합니까? NCC 계산 전에 모든 아웃 라이어를 폐기 할 수 있다고 맞습니까? – 3x14159265

+0

당신이 설명하고 프로젝션 매트릭스로 끝내는 것들을 시도했습니다. 재 투영 오류는 <10^2입니다. 하지만 내가 얻지 못하는 것은 세계 좌표계에서 카메라 위치를 이동하는 방법입니다.카메라가 움직이는 방향 (x, y, z)을 계산하고 싶습니다. 나는 이것이 new_pos = old_pos + -R.t() * t;에 의해 행해진다고 생각했다. 그게 틀렸다고 했으니, 내가 어떻게 투영 행렬로 그걸 할 수 있는지 아세요? – 3x14159265

+2

하나의 카메라는'(0, 0, 0)'에 있고 다른 카메라는't'에 있습니다. 또한, 제 2 카메라는 'R'만큼 회전한다. 'R'과 't'로 구성된 행렬 'P'(projection matrix)는 단위 행렬에 의해 표현 된 좌표계로부터 각 3 차원 점 'p'를 'P'로 표현 된 좌표계로 변환하는 강체 변환이다 . 변환은'newp = P * p'에 의해 행해지 며,'P'는 3x4 또는 4x4 행렬이고'p '는 균질 3D 점, 즉 4- 벡터입니다. 일반적으로 'p'의 마지막 구성 요소는 1과 같습니다. – who9vy

0

카메라 위치를 업데이트하려면 먼저 변환을 업데이트 한 다음 회전 행렬을 업데이트해야합니다. T_REF 및 R_ref 카메라 상태, R 및 t이다

t_ref += lambda * (R_ref * t); 
R_ref = R * R_ref; 

새로운 계산 된 카메라 회전 및 번역을, 그리고 람다 스케일 요인이다.