2012-10-20 4 views
3

컴퓨터 비전에 대한 또 다른 질문입니다.카메라 매트릭스의 번역 찾기

카메라 행렬 (또한 투영 매트릭스라고도 함) 3 차원 점 매핑 X (예 현실 세계)에 다음의 관계를 통해 (예를 들면, 사진의) 이미지 포인트 X 행 :

l **x** = P **X** 

P는 카메라의 외부 및 내부 특성 (방향, 위치 및 투영 특성)을 설명합니다. |

P = K [ R | t ] 

[R : 우리는 투영 특성을 참조 할 때, 우리는 K. 마찬가지로, R은 카메라의 회전을 나타내며, 그것의 번역을 t 캘리브레이션 매트릭스를 사용하여, 우리는 다음과 같이 P를 기록 할 t]는 행렬 R과 t의 연결을 의미합니다.

R is a matrix 3 X 3 
t is a vector 3 X 1 
K is a matrix 3 X 3 
[R | t ] is a matrix 3 X 4 
As a consequence, P is a matrix 3 X 4 

글쎄, 충분한 소개. 내가 P. 파이썬 책 컴퓨터 비전의 코드에 따라 카메라 행렬의 번역을 찾으려면, 다음과 같이 찾을 수 있습니다

def rotation_matrix(a): 
    """ Creates a 3D rotation matrix for rotation 
    around the axis of the vector a. """ 
    a = array(a).astype('float') 
    R = eye(4) 
    R[:3,:3] = linalg.expm([[0,-a[2],a[1]],[a[2],0,-a[0]],[-a[1],a[0],0]]) 
    return R 

tmp = rotation_matrix([0,0,1])[:3,:3] 
Rt = hstack((tmp,array([[50],[40],[30]]))) 
P = dot(K, Rt) 
K, R = linalg.rq(P[:,:3]) 

# This part gets rid of some ambiguity in the solutions of K and R 
T = diag(sign(diag(K))) 
if linalg.det(T) < 0: 
    T[1,1] *= -1 
    K = dot(K, T) 
    R = dot(T, R) # T is its own inverse 

t = dot(linalg.inv(K), P[:,3]) 

코드는 독립적이다. 여기에 우리는 Rt이고 매트릭스는 [R | t]입니다. P은 평소와 같이 계산되고 RQ 인수 분해가 수행됩니다. 그러나 나는 그 부분을 이해하지 못한다. 첫 번째 3 개의 열만 가져 오는 이유는 무엇입니까? 그런 다음 변환 벡터를 K^{-1}의 내적 값과 P의 처음 3 열로 구합니다. 이유는 무엇입니까? 나는 정당성을 찾지 못했지만 어쩌면 그것이 분명하지 않은 것일 수도 있습니다.

그건 그렇고, 코드는 약간 벗어난 것 같습니다. 실행하면 입력으로 사용한 array([[50],[40],[30]]) 대신에 [ 50. -40. 30.]이라는 번역 벡터가 생깁니다. 우리는 똑같이해야합니다. 이것이 회전 행렬 때문인지 나는 모른다. 나는 또한 그것에 대한 도움을 주시면 감사하겠습니다.

감사합니다.

답변

3

inv(K)의 곱하기의 4 번째 열로 변환 벡터를 계산합니다. 색인은 0에서 시작하기 때문에 P[:,3]이 투영 행렬의 네 번째 열이 P = [KR | Kt] 그래서 Kt가 4 열 때문에 다시 t이 예상되는지고 있음을 의미 인 경우 코드에서이

t = dot(linalg.inv(K), P[:,3]) 

을 말한다 것을 알 수 있습니다. inv(K) * Kt = t

보정 한 행렬 K 다시 회전 행렬에 RP[:,:3] 분해 RQ 수 있으므로 P = [KR | Kt] 교정 행렬은 상 삼각 행렬과 회전 직교 때문이다.

왜 내가 예상했던 것과 다른 번역 벡터를 얻는 지에 관해서는 QR decompositions이 일반적으로 고유하지 않기 때문일 수 있습니다. 위키 피 디아에 따르면, 그들은 R의 모든 대각선 요소가 양수 일 것을 요구할 때만 유일합니다. 여기 R은 위 삼각형 행렬이며, 경우에 따라 K입니다.

매트릭스에 K의 대각선에 음수 요소가있는 경우 QR 분해와 다른 K (한 기호 만 다를 수 있음)을 다시 가져올 수 있습니다. 이는 예상 한 t을 다시 얻지 못했음을 의미합니다.

+0

우수 답변. 권리! 나는 P [:, 3]에 대해 혼란스러워했다. 나는 네가 할 수 있다는 것을 몰랐다. [R | t] = [KR | Kt]. 그것에 대한 의견이 있으십니까? 다른 벡터에 관해서는 절대적으로 그렇지만 T를 사용하여 문제가 해결되었다고 생각했습니다. 나는 시험을했고 올바르게 작동했다. –

+0

잘 K [R | t] = [KR | Kt]는 행렬 A * B를 곱하면 A * [b1 b2 .. bn] = [A * b1 .. A * bn]이라는 사실에서 유래합니다. 즉, A를 사용하여 B의 열 공간을 변환합니다. 즉, A * B의 열 n은 A의 모든 행의 내적을 B의 열 n으로 취하여 얻습니다. – cyon

+0

모든 도움을 주셔서 감사합니다! –