OpenCV - 캘리브레이션

카메라 영상을 보면 가끔 휘어보이는 현상이 있습니다. 왜곡이라고 하는데 이 왜곡를 해결하기 위한 방법으로 캘리브레이션이 필요합니다.

캘리브레이션을 위해선 내부, 외부 파라미터를 알아야 합니다.

* 외부 파라미터 
    - 카메라의 설치 높이, 방향 등 카메라와 외부 공간과의 기하적인 관계(촬영 환경이라 생각하면 될 것 같습니다.)

* 내부 파라미터
    - 초점거리(focal length) : fx, fy
    - 주점(principal point) : cx, cy
    - 비대칭계수(skew coefficient) : skew_c = tan()

* 초점거리 - 렌즈 중심과 이미지센서(CCD, CMOS)의 거리
* 주점 - 카메라 렌즈의 중심, 핀홀에서 이미지 센서에 내린 수선의 발의 영상좌표
* 비대칭 계수 - 이미지 센서의 y축이 기울어진 정도

쉽게 사용할 수 있는 프로그램은 CML C++ Camera Calibration Toolbox가 있습니다.

캘리브레이션은 OpenCV에서 기본 예제로 작성되어 있습니다.
아래의 이미지를 이용하여 진행하면 됩니다. 


위 이미지를 찍은 파일들을 가지고 XML로 만들어서 해주시면 됩니다.
사이트에 가보시면 xml파일이랑 함께 있습니다. 수정해서 동작시키면 됩니다.
체크판 사이즈는 실제 칸수에서 -1 씩 해야합니다.

추가로 소스코드에서 아래의 부분에 파일이 있는 경로를 입력해주시면 됩니다.

1
const string inputSettingsFile = argc > 1 ? argv[1] : "./cali_ex/in_VID5.xml";

하지만 충분한 체크보드 사진이 없었고 사진을 또 찍을 수 없는 상황이라면 어느정도 예상해서 작성해야합니다.
주점이야 뭐 영상의 중점이라 생각하고 영상크기만큼으로 계산하면 되지만 이제 초점거리가 어렵습니다.
거리라서 cm 같은 단위가 아니라 pixel 단위이기 때문입니다. 

정확하진 않지만 어느정도 예상할 수 있습니다. 하지만 아셔야할 것은 이미지센서의 크기를 아셔야합니다.
기본적으로 < 35mm , 35mm > 이미지센서 일때 평균적으로 8mm의 초점거리가 나오게 됩니다. 
그러면 이제 현재 사용하는 카메라의 이미지센서크기를 알면 비례식으로 어느정도 비슷?한 결과를 얻으실 수도 있습니다.

아니면 카메라 메트릭스와 k1,2~ 값을 변경하시면 서 확인하는 방법이 있습니다. 

그래도 제일 좋은건 체크보드로 확인하는 것이 좋습니다.


(ref)





댓글

이 블로그의 인기 게시물

파이썬을 이용한 image to pdf 변환 프로그램

젯슨 나노 - GPIO