사진/360 파노라마

360 파노라마 카메라의 시차(Parallax)

하늘이푸른오늘 2018. 4. 6. 11:50

파노라마 사진을 촬영할 때 반드시 고려해야 하는 것이 시차(Parallax) 문제입니다. 360*180 파노라마를 촬영하는 분들이 사용하는 Cubicpan과 같은 파노라마 헤드(Panorama head)는 이 시차를 없애기 위한 목적의 장비입니다.

Cubicpan 파노라마 헤드

이 글에는 시차를 없앨 수 있는 무시차점(NPP : Non Parallax Point)를 찾기위한 방법이 기술되어 있는데, 어렵지는 않아도 꽤나 귀찮은 작업입니다. 그럼에도 불구하고, 이와 같은 방법이 필요한 것은 파노라마 사진을 정확히 촬영하려면 아래 사진들과 같이 무시차점을 중심으로 사진을 촬영해야 하기 때문입니다. (참고 : 파노라마사진의 원리와 촬영방법

파노라마사진기파노라마 사진기의 원리

하지만, 요즘 나오는 Gear360과 같은 일체형 360 카메라의 경우, 이것이 불가능합니다. 어안렌즈가 달린 두개의 카메라로 동시에 촬영하기 때문에 무시차점을 일치시킬 수 없기 때문입니다. 로드뷰나 구글 스트릿뷰에서 가끔 머리와 몸통이 따로 놀거나 아래와 같이 겹쳐져 보이는 것도, 모두 동일한 문제 때문에 발생하는 것입니다. 

이러한 시차 오류는 거리에 따라 달라집니다. 거리가 멀다면 거의 눈에 띄지 않지만, 거리가 가까울수록 오류가 크게 나타납니다. 

그런데... 이런 시차 오류가 얼마나 크게 발생할까요? 사실 예전부터 궁금했는데, 이번에 기어360을 사용해서 Cupix.com의 자동360VR을 만드는 서비스를 테스트해보다 보니 좀더 정확히 파악하고 싶어졌습니다.

기어360 등의 360 액션캠은 모두 화각이 180도 이상되는 어안렌즈(fish-eye)를 사용하고 있습니다. 이 어안렌즈의 기하학적인 원리는 영문 위키백과 Fish-eye 문서중 Mapping Function을 보시면 되는데, 저는 그냥 이해하기 쉽도록 equidistant 모델을 사용하는 걸로 가정하겠습니다. equidistant 모델은 카메라 렌즈에서 물체를 바라볼 때의 각도 차이와 사진상에 촬영되는 이미지의 거리와 비례하는 것을 말합니다.

즉, 카메라 정면에서 1도 차이가 사진상에 10pixel 차이가 난다고 가정하면, 45도 위치에 있는 물체든, 90도 위치에 있는 물체든 모두 1도 차이는 사진상에 10pixel 차이가 난다고 가정한다는 것입니다. (물론 이런 Mapping Function을 사용하는 어안렌즈가 오히려 드물고, 대부분 equisolidangle 방식을 사용한다고 합니다만...)  

그리고, 어안렌즈의 화각은 정확히 180도 이고, 위의 오른쪽과 같이 CMOS에 꽉차도록 촬영한다고 가정하겠습니다. 물론 어안렌즈의 화각은 모두 180도보다 크고, 꽉 차게 촬영할 지 좀 벗어나게 촬영할지는 카메라 메이커에 따라 달라지지만, 그냥 계산이 편하도록 이렇게 가정합니다. 

CMOS는 SONY IMX 377의 스펙을 참조하여, 4000x3000 픽셀짜리를 사용한다고 가정하겠습니다. 따라서 180도가 3000픽셀이므로 1도 차이가 약 16.7 pixel을 차지하는 셈이네요. 센서의 크기는 1/2.3" 입니다. 6.16x4.62mm 라니, 4.62mm에 3000 픽셀이 들어 있습니다.

다음으로 어안렌즈가 아래와 같이 배치되어 있다고 가정하겠습니다. 아래쪽에 있는 위치는 무시차점의 위치입니다. 원래 여기에 배치해야 하지만, 카메라의 구조상 d 만큼 벗어나게(앞으로 튀어나오게) 배치했다고 생각하겠습니다. 여기에서 계산하고자 하는 것은 이 거리 d와 중심에서 벗어난 각도 θ에 따라, 촬영된 각도의 차이 δ가 얼마나 발생하느냐 하는 것입니다. (두 카메라에서 벗어난 각도는 약간씩 다르고, 카메라 중심에서 물체까지의 거리도 조금 다르지만, d 가 S에 비해 상당히 작다고 가정하고 무시합니다.)

여기에서 d 는 대략 2cm 에서 4cm 정도로 두면 될 것 같습니다. 제가 이번에 여러 기기들을 가져와서 대충 재어본 결과입니다. (정확하지는 않습니다.)

이제 계산을 해보겠습니다. 다음은 d=20mm  일때, 즉 렌즈간 간격이 20mm 일 때의 각도오류입니다. 예를 들어, 아래 주황색 0.88 이란, 정면에서 50도 벗어난 곳에 1미터 지점에 있는 물체는 원래 촬영되어야 할 위치에서 0.88 도 벗어난 곳에 촬영된다는 의미입니다.

d20
theta1002005001000200050001000050000
00.000.000.000.000.000.000.000.00
101.990.990.400.200.100.040.020.00
203.921.960.780.390.200.080.040.01
305.732.861.150.570.290.110.060.01
407.373.681.470.740.370.150.070.01
508.784.391.760.880.440.180.090.02
609.924.961.980.990.500.200.100.02
7010.775.382.151.080.540.220.110.02
8011.295.642.261.130.560.230.110.02
9011.465.732.291.150.570.230.110.02


이것을 pixel 수로 환산하면 아래와 같습니다. 예를 들어, 정면에서 90도 방향으로 1 미터 떨어져 있는 물체는 양쪽 센서에 약 20 픽셀정도 차이난 위치에 촬영된다는 뜻입니다. 더 가까운 곳에 있는 물체들은 당연히 볼 필요도 없고, 적어도 5미터는 떨어져 있어야만 스티칭하는데 별 문제가 발생하지 않는다고 보아야겠네요.

픽셀수3000각도180
1도당픽셀
16.67
theta1002005001000200050001000050000
00.000.000.000.000.000.000.000.00
1033.1616.586.633.321.660.660.330.07
2065.3232.6613.066.533.271.310.650.13
3095.4947.7519.109.554.771.910.950.19
40122.7661.3824.5512.286.142.461.230.25
50146.3073.1529.2614.637.322.931.460.29
60165.4082.7033.0816.548.273.311.650.33
70179.4789.7335.8917.958.973.591.790.36
80188.0894.0437.6218.819.403.761.880.38
90190.9995.4938.2019.109.553.821.910.38


d=40일 경우는 아래와 같습니다. 그냥 위의 표에 2배이니 구지 필요하지는 않겠지만요. ㅎㅎ

픽셀수3000각도180
1도당픽셀
16.67
theta1002005001000200050001000050000
00.000.000.000.000.000.000.000.00
1066.3333.1613.276.633.321.330.660.13
20130.6465.3226.1313.066.532.611.310.26
30190.9995.4938.2019.109.553.821.910.38
40245.53122.7649.1124.5512.284.912.460.49
50292.61146.3058.5229.2614.635.852.930.59
60330.80165.4066.1633.0816.546.623.310.66
70358.94179.4771.7935.8917.957.183.590.72
80376.17188.0875.2337.6218.817.523.760.75
90381.97190.9976.3938.2019.107.643.820.76

===

이상입니다. 흠... 계산은 계산이니까... 하긴 했습니다만, 이것말고도 고려할 요소가 많을 것 같은데... 싶네요~~ ㅠㅠ

민, 푸른하늘