PHOTOGRAMMETRY

공선방정식(Collinearity equation) 예제 파이썬 코딩하기

유병혁 2015. 6. 17. 08:56

본 글에서는 KOCW '공선방정식의 이해' 강의 예제를 파이썬으로 코딩해 보겠습니다.

아래 식들은 'Daum 수식편집기'를 사용하였습니다(관련 글: http://blog.daum.net/geoscience/780).

 

강의: http://www.kocw.net/home/search/kemView.do?kemId=991961

 

공선방정식(collinearity equation)은 사진측량학에서 가장 중요한 공식으로써 간단히 표현하면,

특정한 지상점을 특정한 위치와 방향에서 찍었을 때 '사진상의 어느 위치에 찍히는가'를 계산해주는 식입니다.

 

공선방정식의 보다 자세한 개념은 별도의 글로 정리하도록 하고,

본 글에서는 강의에서 소개된 예제를 파이썬 코딩으로 풀어보도록 하겠습니다

 

공선방정식 예제는 아래와 같은데요,

카메라 위치는 0, 0, 1000m, 카메라 방향을 나타내는 회전각은 1˚, -1˚, 30˚입니다.

주점위치가 0.01, 0.02mm, 초점거리가 100mm인 카메라로 사진을 직었을 때,

1000, 500, 20m 위치의 지상점이 사진상의 어느 위치에 찍히는가를 계산해 보도록 하겠습니다.

 

 

먼저, 지상 좌표계와 카메라 좌표계 사이의 회전변환을 위해, 회전행렬(R, rotation matrix)를 계산합니다.

 

 

파이썬 코드인데요, 카메라 자세를 각각 om, ph, kp라는 변수로 선언하고 Degree를 Radian으로 변환하였습니다.

 

NumPy는 파이썬에서 과학적 컴퓨팅을 위한 필수적인 패키지입니다.

공식 홈페이지: http://www.numpy.org/

NumPy를 이용하여 앞서 소개된 회전행렬 R을 아래와 같이 정의합니다.

 

 

이제 지상점 좌표에서 카메라 투영 중심좌표를 빼서 이동변환을 해주는데요,

 

 

이 식을 파이썬으로 코딩하면 아래와 같습니다.

 

아래 식과 같이 회전행렬 R과, 지상점 벡터와 카메라 투영 중심 벡터의 차를 곱해 표현할 수 있겠는데요, 

 

위 식에서 R*(P-C)를 파이썬 코딩에서 RPC로 정의했는데요, 3*3 행렬과 3*1 행렬의 곱이므로, 결과값은 3*1행렬이 됩니다.  

 

이제 공선방정식을 살펴 보면 아래와 같은데요,

위에서 좌측 행렬의 세번째 식을 유도해서 사진의 축적에 해당되는 '스케일(람다)'를 구해줍니다.

아래와 같이 결과치가 계산되었는데요, 사진의 1mm가 지상에서는 9526.7mm로 표현된다는 의미가 되겠습니다.

 

이제 스케일과 사진의 촛점의 위치를 더해줘서 지상점 좌표가 사진상의 어느 위치에 해당되는지 계산해줍니다.

 

 

이렇게 해서 1000, 500, 20m 위치의 3차원 지상점이 66.459, 99.717mm 위치의 2차원 사진 상에 투영됨을 계산하였습니다.

collinearity_equation.py
0.0MB
collinearity_equation-1.py
0.0MB