Knowledge/Vision

Camera undistortion visualization(KB model, UCM, DS model)

침닦는수건 2022. 12. 29. 16:46
반응형

아래 두 글에서 열심히 공부하고 설명하고자 시도했던 undistortion은 꽤나 어려운 내용이다.

 

2022.12.20 - [Knowhow] - Camera undistortion (pinhole, KB model)

 

Camera undistortion (pinhole, KB model)

이전 글 2022.12.07 - [Knowhow] - Fisheye camera model(KB, UCM, DS 모델) 에서 다음과 같은 논문의 말이 이해가 안된다고 적은 바 있다. We propose the Double Sphere (DS) camera model that better fits cameras with fisheye lenses, has

jseobyun.tistory.com

2022.12.29 - [Knowhow] - Camera undistortion (UCM, DS model)

 

Camera undistortion (UCM, DS model)

2022.12.20 - [Knowhow] - Camera undistortion (pinhole, KB model)에 이어 UCM 카메라와 Double Sphere 카메라의 undistortion에 대해 설명해보고자 한다. 결론부터 말하자면, UCM 카메라와 DS 카메라는 distortion이 큰 의미가

jseobyun.tistory.com


DS 모델을 제외한 나머지 모델들은 distortion을 포함하고 있는데 고차 다항식 형태여서 정확히 inverse를 구할 수 없었고 approximation으로만 구할 수 있었다는 것이 핵심이었다. 또 그 approximation을 이해하고자 했었다.

이 글에서는 내가 구현해낼 수 있을 정도로 완벽히 이해했는지 확인하기 위해서 직접 코드를 짜보았고 그 결과를 시각화한 것을 자랑(?)할 것이다. 직관적으로 이해하기 좋은 자료인 것과 동시에 모델 선정에 도움이 될 것 같아 자랑하기로 했다.

pinhole 모델을 너무나 사소하고 opencv에도 잘 구현되어 있기 때문에 제외했다.

 

Introduction

 


아래 시각화를 조금 설명해보자면, 가상 공간에서 가상 카메라를 배치하고 calibration 모델을 변경해가면서 intrinsic calibration을 해두었다. 그리고 가상 카메라 2m 앞에 grid pattern을 생성했다.

제대로 구현했는지 확인하기 위해 해당 grid pattern을 projection해서 image point(흰색)을 얻고, image point(흰색)을 unprojection한 뒤 다시 projection한 결과(보라색)과 비교했다.

unprojection은 각 카메라 모델에서 제공하는 수식으로 간단히 구현했고 필요한 depth는 임의로 1m로 생성했다. 어차피 projection할 것이기 때문에 임의의 depth를 사용했다. unprojection 과정 안에 undistort가 포함되어 있다.

(unprojection과 undistort는 다른 것이지만 이미지로 만들기 위해선 unprojection까지 구현해야 했다. )

그리고 undistort가 approximation을 통해 이루어지는 모델의 경우, iteration이 돌고 있음을 보이고 그 iteration 수에 따라 성능이 다른다는 것을 보기 위해 iteration마다 결과를 그렸다.

1. KB 모델


undistortion을 하기 위해 gauss newton method를 쓴다는 것을 알고 미분을 풀 때 가장 길고 머리가 아팠던 모델이다.

 


광각을 distortion만으로 해결하는 모델이기 때문에 undistort 과정이 가장 극적으로 보여지는 모델이다. iteration을 충분히 돌아야 undistortion이 잘되는 편이기 때문에 가장 속도가 오래 걸리고 불안정하다고 볼 수 있겠다.

또, 기억해야 할 점은 속도가 오래 걸리는 것도 문젠데 중간 수식에 arctan2가 포함되어 있어 180도 넘어가는 FoV는 풀 수 없다는 것이다.

2. UCM

 


KB 모델 대비 광각을 구로 먼저 풀고 distortion으로 나머지를 해결하는 모델이기 때문에 iteration을 조금만 돌아도 undistortion이 잘되는 편이다. 확실히 초기값도 상당히 정확하다.

KB 모델보다는 안정적이고 속도 문제도 완화되는 듯 하다.

혹시 그림 상 reprojection error는 KB 모델이 더 낮지 않느냐라고 궁금증을 갖는 사람이 있을까봐 말하는데 위 KB 모델과 UCM의 카메라는 세팅이 다르다... 실험하다가 실수해서 다른 파라미터의 카메라를 써버렸다. 경향만 보길.

3. DS model


내가 가장 인상 깊었고 써야한다고 주장하는 모델이다. 일단 approximation을 통해 undistort할 필요가 없고 closed form으로 undistortion이 끝난다.

 


Reprojection error의 수준 또한 훨씬 정확하다.


Conclusion

카메라 모델에 대한 완벽한 이해를 한 것 같고 구현까지 해서 검증 완료했다. 그리고 다양한 모델을 비교 분석한 결과, 역시나 DS 모델이 가장 효과적인 모델이라는 것도 확인했다. 그냥 DS 모델 쓰면 될 것 같다.

확인 차 구현했던 코드들은 정리해서 github에 올려두도록 해야겠다.

반응형