컴퓨터 비전에 대한 또 다른 질문입니다.카메라 매트릭스의 번역 찾기
카메라 행렬 (또한 투영 매트릭스라고도 함) 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.]
이라는 번역 벡터가 생깁니다. 우리는 똑같이해야합니다. 이것이 회전 행렬 때문인지 나는 모른다. 나는 또한 그것에 대한 도움을 주시면 감사하겠습니다.
감사합니다.
우수 답변. 권리! 나는 P [:, 3]에 대해 혼란스러워했다. 나는 네가 할 수 있다는 것을 몰랐다. [R | t] = [KR | Kt]. 그것에 대한 의견이 있으십니까? 다른 벡터에 관해서는 절대적으로 그렇지만 T를 사용하여 문제가 해결되었다고 생각했습니다. 나는 시험을했고 올바르게 작동했다. –
잘 K [R | t] = [KR | Kt]는 행렬 A * B를 곱하면 A * [b1 b2 .. bn] = [A * b1 .. A * bn]이라는 사실에서 유래합니다. 즉, A를 사용하여 B의 열 공간을 변환합니다. 즉, A * B의 열 n은 A의 모든 행의 내적을 B의 열 n으로 취하여 얻습니다. – cyon
모든 도움을 주셔서 감사합니다! –