Knowledge/Vision

Fisheye camera model(KB, UCM, DS 모델)

침닦는수건 2022. 12. 7. 14:22
반응형

Introduction

 

fisheye 카메라는 일반적으로 광각을 넘어서 180도 이상을 촬영하는 경우까지 포함하기 때문에 직관적으로 이해하기가 어렵다. 이미지 sensor는 앞을 보고 있는 평면이기 때문에 물리적으로 180도 이상은 담을 수가 없는데 분명 이미지에는 뒤에서 온 빛도 맺혀있기 때문이다.

 

애초에 말이 안되는 상황을 다양한 렌즈의 조합으로 억지로 만들어내는 카메라이다 보니 fisheye 카메라를 우리가 흔히 다루는 pinhole 카메라와 비슷한 수준으로 단순화하는데는 직관적이기보다 상상의 나래를 편 독특한 아이디어들이 필요했다.

 

이러한 독특한 아이디어는 실제 물리적인 부분과 매칭이 잘 되지 않고 가정으로 시작하는 부분이 있기 때문에 직관적으로 이해가 잘되지 않는다. 그래서 방법론에서 설명하는 수식 자체를 이해하는 것은 필요하지만 이것의 물리적인 의미가 무엇인지 떠올릴 필요까지는 없을 것 같다. 즉, 이해보다 그대로 받아들인다는 느낌에 가깝다.

 

본문에 앞서, 그대로 받아들일 준비를 위해 캘리브레이션의 의미를 짚어보도록 하자. 

(*편의 상, intrinsic calibration == calibration이라고 칭하겠다.)

 

캘리브레이션이라 함은 카메라를 단순화하는 것이다.

 

예를 들어, 요즘 일반 FoV 카메라들도 렌즈는 기본으로 달려있고 다중렌즈의 조합으로 이루어진 경우가 많다. 그래서 실제로 카메라의 모델은 장착되어있는 렌즈들의 굴절률, 두께, 각도 등 광학적 특성을 전부 반영한 굉장히 복잡한 모델임이 틀림없다. 

 

하지만 캘리브레이션을 하는 순간, focal length와 principal axis, 그리고 조금 더 치면 distortion이 튀어나오면서, 복잡한 모델을 아주 단순한 형태의 "빛이 일직선으로 직접 이미지 센서에 찍힌다고 가정"하는 pinhole 모델로 치환된다.

 

즉, 그 복잡한 모델과 수학적으로 최대한 비슷한 의미를 갖는 pinhole 카메라 모델을 찾아 퉁치는 것이다. 오차가 분명있지만 무시할 수준이라고 믿으면서 말이다.

 

fisheye 카메라 역시 비슷하다. fisheye 카메라는 pinhole 모델 가정이 통하지 않기 때문에 다른 모델을 사용해야할 뿐, fisheye camera calibration 역시 최대한 단순화된 모델을 찾아 퉁치는 작업이다. 

 

fisheye도 180도가 넘는 각도에서 오는 빛을 담기 위해 온갖 렌즈들이 복잡하게 얽혀있는 모델이지만 "빛이 ???하게 이미지 센서에 찍힌다고 가정"하는 ??? 모델로 치환한다는 느낌으로 받아들이면 좋을 것 같다.

 

하나 아쉬운 점은 pinhole 모델이 가정한 "빛이 일직선으로 직접 이미지 센서에 찍힌다"는 원래 그런 것이기 때문에 직관적으로 이해가 팍 되고 왜 이런 모델을 가정했는지 이해 + 받아들이기가 가능한데 fisheye 용 모델의 가정은 그게 좀 어렵다. 

 

따라서 앞으로 fisheye 카메라를 단순화하기 위한 모델이 어떤 것이 제안되어 왔는지 이야기를 할텐데 직관적으로 이해가 안되더라도, 그냥 최대한 단순화해서 퉁칠 수 있는 모델을 만들기 위해서 저런 가정을 했구나 정도로 받아들이면 될 것 같다. 왜 그런 가정을 했느냐라는 의문이 들면 대충 풀어보니 오차가 무시할 수준이었으니 그렇다라고 받아들이면 되겠다.

 

어떤 파라미터들로 표현될 수 있도록 단순화했는지만 보면 되겠다.

 

1. OPENCV fisheye calibration (Kannala-Brandt camera model)

 

fisheye camera calibration을 검색하면 가장 먼저 보이는 OPENCV fisheye가 첫번째 모델이다. 정확한 이름은 Kannala-Brandt camera model이다. 워낙 유명한 OPENCV이다보니 fisheye 카메라를 당연히 다루고 있는데 OPENCV는 위 모델을 선정해서 구현해두었다. 

 

줄여서 KB 모델의 기본 가정은 fisheye도 pinhole model로 단순화될 수 있다는 것이다. 다만 distortion이 굉장히 심할 뿐이라는 가정을 한다. 즉, fisheye 카메라도 pinhole 모델인데 distortion이 극심하다는 것이다. 

 

위 그림과 같이 어떤 3차원의 점(★)이 fisheye camera를 통해 2차원의 점(*)로 투영될 때, 똑같이 직선적으로 투영되는데 왜곡 때문에 다른 위치에 투영되는 것이라고 가정한다. 그리고 하나 더 다른 위치로 투영되는 오차(왜곡)는 3차원의 점(★)이 카메라 optical axis와 이루는 각에 비례한다고 가정한다. theta가 클수록 d(theta)가 크다는 것이다.

 

x,y,z가 3차원 좌표를 의미한다고 봤을 때 각도에 따라 특정 비율의 왜곡이 발생하는데 그만큼 늘어지다보면 fisheye camera로 촬영한 것처럼 보인다는 것이다. 여기서 k1~k4는 최적화를 통해 추정한다.

 

하나 의문이 들 것이다. "아니 왜...?" . 근데 그냥 이렇게 가정하고 풀어보니 대충 맞게 나오더라가 이유다. 

 

그래도 잘 된다고 보여지기 때문에 OPENCV에 채택되고 구현되어 있지 않을까?

 

*Note*

 

내가 직접 써보니 OPENCV fisheye camera calibration이 제대로 동작 안할 때가 있다. 내가 분석한 이유는 OPENCV에서 위 수식을 구현할 때 atan 을 사용했기 때문으로 보인다. 아래 사진 참고.

 

 

이렇게 되면 atan은 범위가 -90~90도 한정되는 함수기 때문에 90도가 넘어갈 때 singular case가 발생한다. 즉, 양쪽으로 보았을 때 FoV가 180도가 넘어가면 터진다는 것이다. 

 

실제로 내가 갖고 있는 카메라는 FoV가 180도 이상인데 아래 사진과 같이 제대로 캘리브레이션 되지 않는 것을 볼 수 있다. reprojection error로 보나 undistortion 결과로 보나 제대로 되지 않은 것이 확실하다. 

타 논문에서도 이와 같은 이슈를 언급한 부분이 있는데 KB 모델은 180도 이상인 fishey camera에는 활용되기 어려운 것으로 보인다. 180도 이상일 때는 뒤에 설명할 다른 모델을 쓰자!

 

 

2. UCM, Unified camera model

 

두번째는 UCM 모델이다. Mei라는 사람이 유명해서 Mei 모델이라고 불리는 것 같기도 하다.

 

이 모델은 모든 빛이 일단 구(sphere)에 맺힌 뒤, 이 구에 맺힌 빛을 다시 한 번 pinhole camera로 촬영한 것이라고 가정한다. (말이 어렵다..)

 

쉬운 이해를 위해 논문에 있는 그림을 편집해보았는데, 원래 3차원의 점 (빨간색)이 일단 반지름이 1인 구 위로 일단 투영되어 3차원의 점 (녹색)이 된다. 그리고 구의 중심축 선 상에 어딘진 모르겠지만 Cp에 센터를 둔 pinhole 카메라로 이를 촬영해서  이미지 상의 점 (파란색)이 된다고 본다. 

 

다행히 나는 이 가정이 살짝 직관적으로 이해가 되긴 했다. 냅다 pinhole camera인데 distortion만으로 fisheye camera를 근사하겠다는 KB 접근보다는 일단 빛이 전방향에서 오니 구면으로 옮긴 뒤에 시작하는 것이 합리적이라는 생각이다. 

 논문의 그림이 설명을 위해 그리다보니 실제 이미지 평면의 위치가 수치와 다른 위치에 있는 듯하여, 내가 다시 그려보았는데 위 그림으로 보면 조금은 직관적으로도 이해가 될 듯하다. (빨간점은 카메라 센터, 녹색점은 이미지 포인트이다.)

 

전방향에서 오는 빛을 이미지로 담을 수 있는 설정인데, 카메라 센터를 왼쪽 그림처럼 구 표면 상 혹은 구 내부에 두면 이미지 평면은 구의 정중앙 혹은 북반구를 가로지르게 된다. 그러면 이미지 평면으로 잘린 작은 윗뚜껑 부분이 이미지 평면에 맺히므로 일반적인 FoV 이미지를 담거나 협각 이미지를 표현할 수 있을 것이다. 

 

반대로 카메라 센터를  구 외부로 보내버리면, 이미지 평면이 남반구를 자르게 되는데 이미지 평면으로 잘린 윗뚜껑(뚜껑이라고 보기엔 너무 커져서 요강을 엎어놓은 모양이지만...)은 FoV 180도 이상의 거대한 영역을 담고 있다. 이 거대한 영역이 카메라 센터를 향해 투영된다고 보면 fisheye camera처럼 광역에서 빛을 담는 경우를 모델링할 수 있을 것처럼 보인다. 그리고 빛이 구 형태를 띄고 있기 때문에 빛이 전방향에서 오는 특성을 담기에 대충 유리한 것 같다.

 

물론 잘린 가장자리(절단면) 부분에서는 이미지 평면 상 같은 점에 맺힐 수 있을 것 같은데 이부분은 distortion parameter로 풀 여지가 남아있다고 본다. 

 

따라서 UCM 모델은 직관적으로 약간 이해가 되는 것 같다...(?)

 

UCM 모델의 수식은 위와 같은데, pinhole 모델과 굉장히 유사하다. xi가 0일 경우에는 pinhole model과 완전히 동일한 형태다. 그도 그럴 것이, 애초에 3차원 점을 구면에 투영하는 1스텝이 추가된 설정일 뿐 pinhole 카메라로 촬영한다는 설정은 동일하기 때문이다. (참고로, 그렇기 때문에 이 모델로 pinhole camera calibration도 가능하다.) 나머지 파라미터들도 표기법만 다를 뿐, pinhole camera의 focal length와 principal axis와 같다.

 

                         

이 모델은 상당히 잘된다.

 

*Note*

찾아보면 EUCM (Extended unified camera model)이라는 것도 있다. 이것 역시 UCM과 동일한데 UCM은 구와 distortion만으로 풀었다면 EUCM은 구가 아니라 타원체면 더 정확하지 않을까? 라는 생각에서 시작한 것이다. 실제로 구에 mapping한 뒤에 distortion으로 나머지 영향을 커버하는 것보다 타원체 mapping한 뒤 distortion으로 나머지를 커버하면 표현력이 커질 여지가 있기 때문이다. 다음 그림을 보면 대충 느낌이 올 것 같다.

 

 3. Double sphere camera model

마지막으로 소개할 모델은 Double sphere camera model이다. 가장 최신의 모델이며 논문 수치 상에선 역시나 이전 소개한 방법보다 정확도가 높다고 주장한다. 

 

이름에서도 약간 예상할 수 있듯이 2개의 구를 사용한다. UCM에서 1개의 구에, EUCM에서는 1개의 타원체에 투영했다면 DS에서는 1개의 구에 투영을 한 뒤, 중심이 다른 또 1개의 구에 다시 투영하는 스텝을 추가했다. 

 

We propose the Double Sphere (DS) camera model that better fits cameras with fisheye lenses, has a closed-form inverse, and does not require computationally expensive trigonometric operations.

 

논문에서 위와 같이 장점을 말하긴 하는데 단어도 잘 모르겠다. 나는 그냥 이전 방법도 그러려니 했으니 이또한 그렇게 넘어가기로 했다. 구 2개를 쓰면 더 좋은가보다. 좋다더라.

 

논문에 실린 그림이 직관적이어서 그대로 가져왔는데 직관적으로, 표현력 자체는 크게 다르지 않을 것 같은데 이미지 외곽에서는 조금 장점이 있을 것 같다는 느낌이다. 뭔소리냐면,

 

 

 위 UCM 그림에서 보았을 때, 빨간 점선으로 표시된 부분의 빛들은 이미지 평면으로 내려찍었을 때 겹칠 수 있는 위험이 있을 것 같다고 생각했다. 같은 픽셀에 여러 방향에서 온 빛이 맺힐 위험이 있는게 분명한데 이를 그냥 distortion으로 풀어버리거나 버리는 그런 느낌이라고 이해했었다. 

 

하지만 위처럼 반지름이 서로 다른 구를 중심축 위치만 다르게 2개를 써버리면, 측면에서 오는 빛은 2개의 구 간의 큰 표면 곡률 차이로 굴절이 더 많이 될테고 이미지 평면에 조금은 안전하게 (같은 픽셀에 안 겹치게) 맺힐 수 있을 것 같다는 생각이다. (틀릴 수도 있다. 그냥 내 직관적 이해일 뿐이다. )

 

수식은 조금 더 복잡해졌다. UCM 과 달리 xi가 의미하는 바가 사용된 2개의 구 사이의 거리가 되었고, alpha라는 파라미터가 새로 생겨 첫번째구와 카메라 센터 사이의 거리를 새롭게 표현한다. 수식은 설명하기 어려우니, 위의 컨셉을 받아들였다면 곱씹어보면서 이해해보면 좋을 것 같다.

 

Conclusion

 

fisheye camera 어렵다. 하지만 어떤 모델이든 사용해서 캘리브레이션하면 단순히 위에 적힌 수식만 사용해서 단순화할 수 있기 때문에 무서워할 것까진 없을 것 같다. 이해하는데 시간이 조금 걸리더라도 시간을 갖고 받아들이려고 노력하다보면 어느 순간 이해가 되는 것 같다. 

 

위 그림은 내가 새로 그린 것들도 있지만 대부분 논문에서 가져온 것들이고 그 논문들의 제목은 다음과 같다.

 

1) The Double Sphere Camera Model

2) Single View Point Omnidirectional Camera Calibration from Planar Grids

 

나의 해석이 들어간 글을 보고 이해에 도움이 되었다면 다행이지만 아니라면 논문을 직접 읽어보는 것만큼 좋은 것은 없으니 꼭 읽어보길 바란다. 

 

Tips

 

위 모델 중 KB를 써보고 싶다면 OPENCV를 쓰면 되지만 UCM과 DS 모델은 없다. 그리고 모델을 이해한 것과 별개로 이를 이용한 캘리브레이션 최적화 코드를 작성하는 것은 또 난이도가 있는 일이다.

 

만약 UCM 모델을 쓰고 싶다면 https://github.com/hengli/camodocal

 

GitHub - hengli/camodocal: CamOdoCal: Automatic Intrinsic and Extrinsic Calibration of a Rig with Multiple Generic Cameras and O

CamOdoCal: Automatic Intrinsic and Extrinsic Calibration of a Rig with Multiple Generic Cameras and Odometry - GitHub - hengli/camodocal: CamOdoCal: Automatic Intrinsic and Extrinsic Calibration of...

github.com

 

만약 DS 모델을 쓰고 싶다면 https://github.com/VladyslavUsenko/basalt-mirror

 

GitHub - VladyslavUsenko/basalt-mirror: Mirror of the Basalt repository. All pull requests and issues should be sent to https://

Mirror of the Basalt repository. All pull requests and issues should be sent to https://gitlab.com/VladyslavUsenko/basalt - GitHub - VladyslavUsenko/basalt-mirror: Mirror of the Basalt repository. ...

github.com

위 두 링크를 참고하는 것을 추천한다!

 

Update

basalt-mirror에서도 PINHOLE, UCM, EUCM, KB4, DS 전부 다 지원하지만 distortion calibration 부분이 미흡하므로 DS만 사용하는 것을 권장한다. 

 

PINHOLE 역시 distortion parameter를 뺀 상태로 calibration 되는데 --cam-types pinhole-radtan8과 같이 넣어야 그나마 계산할 수 있다. 보통 사용하는 k1, k2, p1, p2, k3 총 5개로 구하지 않고 k4, k5, k6까지 총 8개로 구하기 때문에 과하다. 

 

distortion parameter가 필요한 경우에는 basalt를 쓰지 말자. double sphere만 basalt 쓰자.

 

반응형