Robotics

동영상 렌즈 왜곡 없애기 - 손쉽게 자동으로 펴는 방법

콩지니어 2023. 5. 18. 17:30

여행하며 액션캠을 이용해 영상을 찍다 보면 편하고 성능은 좋은데 화각에서 고민이 될 때가 많습니다. GoPro를 기준으로, 렌즈 왜곡이 없는 Linear View, 광각인 Wide View 등 여러 옵션이 있는데, 이는 찍기 전에 정해야 하는 설정이고 찍고 나면 나중에 바꾸는 기능은 고프로에서 제공해주지 않습니다. 즉, 처음에 잘 골라야 하는 거죠.

당연히 찍다 보면 실수던 변심이던 여러 이유로 화각설정이 찍고 나서 보니 마음에 들지 않을 수 있습니다. 이런 경우를 위해 제가 프로그램을 하나 만들었는데, 이 프로그램을 이용하여 손쉽게 자동으로 광각 렌즈 왜곡을 없애는 방법을 소개해 드리고자 합니다.

(이해를 위해 개념소개를 먼저 적고 사용법은 하단에 적으니, 바로 사용을 원하시면 포스팅 아래쪽으로 바로 이동하시어 사용법 내용을 참고하시면 됩니다.)

 

렌즈 왜곡과 이를 없애는 원리

렌즈 왜곡을 없애는 방법을 이해하려면 우선 렌즈 왜곡이 왜 생기는지 알아야 합니다. 광각 렌즈 카메라에서 렌즈 왜곡이 발생하는 이유는 렌즈가 빛을 굴절시키는 방식 때문입니다. 광각 렌즈는 망원 렌즈보다 빛을 더 많이 굴절시키기 때문에 이미지가 왜곡됩니다. 이 왜곡은 특히 이미지의 가장자리에서 두드러집니다. 즉, 렌즈가 빛을 왜곡시키는 현상을 거꾸로 다시 적용하여 이미지를 재변형시켜야 왜곡을 없앨 수 있습니다. 이 과정에서 사각형이었던 영상이 기괴하게(?) 늘어나게 되기 때문에, 렌즈 왜곡을 없애면 필연적으로 바깥쪽 영상을 잘라낼 수밖에 없습니다.

렌즈 왜곡에는 두 가지 유형이 있습니다. 배럴 왜곡과 핀쿠션 왜곡입니다. 배럴 왜곡은 이미지의 가장자리가 안쪽으로 구부러지는 왜곡 유형입니다. 핀쿠션 왜곡은 이미지의 가장자리가 바깥쪽으로 구부러지는 왜곡 유형입니다.

예술적인 관점에서 보면, 렌즈 왜곡은 사진에 사실적이지 않은 느낌을 줄 수 있습니다. 그러나 창의적인 효과를 내기 위해 사용할 수도 있습니다. 예를 들어, 배럴 왜곡은 이미지를 더 넓고 광활하게 보이게 하는 데 사용할 수 있습니다. 핀쿠션 왜곡은 이미지를 더 압축되고 웅장하게 보이게 하는 데 사용할 수 있습니다.

렌즈 왜곡을 쉽게 제거하기 어려운 이유

렌즈 왜곡을 손쉽게 제거할 수 있는 툴이 있으면 좋겠으나, 기술적으로 어려운 점이 있습니다. 위에서 적은 바와 같이 렌즈에서 일어난 빛의 왜곡을 그대로 거꾸로 적용해야 렌즈 왜곡을 제거할 수 있는데, 이 말은 해당 렌즈의 특성을 미리 알 수 있어야 한다는 말입니다. 아쉽게도 렌즈는 그 특성이 렌즈마다 다 다릅니다.

렌즈의 종류마다 특성이 다름

카메라 렌즈는 그 크기와 굴곡에 따라 특성이 정해지는데, 당연히 그 특성이 다릅니다. 워낙 다양해서 모든 렌즈에 대해 미리 특성을 파악하여 프로그램에 넣어둘 수가 없습니다. 즉, 렌즈 종류가 너무 다양하고, 렌즈마다 특성이 달라한 렌즈의 특성으로 왜곡 제거를 시도하면 다른 렌즈를 이용한 영상은 일그러지게 됩니다.

간혹 영상 프로그램에서 왜곡을 없애는 기능을 주는 경우가 있는데, 수동으로 잘 맞추는 것이 정말 어렵습니다.

같은 렌즈도 조금씩 다름

광학부품인 렌즈는 똑같이 만들려면 정말 많은 노력과 좋은 장비가 필요한데, 이 말은 돈이 많이 든다는 말이겠죠. 전문가용이면 모르겠지만, 액션캠 수준의 장비에 들어가는 렌즈는 어느 정도 비슷만 하면 되기 때문에 그렇게까지 정밀도에 신경을 쓰지 않는 경우가 많습니다. 즉, 같은 모델의 두 카메라라도 렌즈가 아주 살짝이나마 다른 경우가 있습니다.

카메라 조립 과정에서 오차

카메라, 특히 액션캠 같은 제품은 조립 과정에서 제품 간 오차에 많은 노력을 기울이기 어렵습니다. 당연히 문제가 될 정도로 오차가 나는 것은 아닐 것이고, 그렇다고 모든 제품이 완벽에 가깝게 똑같이 조립하는 것 역시 아닐 것 같습니다. 여기서 나오는 오차 중에는 렌즈와 이미지센서 간 'misalingnment'도 있는데, 간단히 말해 렌즈와 이미지 센서의 센터가 약간 안 맞게 조립될 수 있다는 말입니다.

조립 과정에서 발생되는 오차에 의한 misalignment

위와 같은 이유로 인해 다른 카메라는 물론, 같은 모델의 카메라라고 해도 필연적으로 조금씩 특성이 다르기 때문에, 미리 한 카메라를 기준으로 잡아 둔 설정으로 다른 카메라의 영상까지 펴는 게 잘 안될 때가 많이 있으며, 수정 프로그램을 통해 사람 손으로 여러 값을 조정하며 수동으로 펴는 작업 역시 만만치 않습니다.

수동으로도 어려운 작업이니 더 이론적인 접근이 필요한데, 이때 필요한 정보가 카메라 특성 (intrinsic parameter)이라고 하며, 이 값을 알아내는 작업을 전문 용어로 'Camera Calibration'이라고 합니다. 언뜻 어렵고 특수장비가 있어야 할 것 같은 이 과정을 집에서 평면 모니터 하나만으로 손쉽게 자동으로 할 수 있는 방법을 아래에서 소개해드립니다.

 

동영상에서 렌즈 왜곡 제거하기

원론적으로 가장 제대로 왜곡을 없애려면 아래 두 과정을 거쳐야 합니다.

1. 카메라 및 렌즈 특성을 측정하기 (최초 1회만)
2. 측정된 정보를 이용해 동영상의 모든 프레임을 수정

이 두 가지를 조금의 프로그래밍만으로 할 수 있도록 OpenCV라는 영상처리 라이브러리가 주 기능을 제공하고 있어, [OpenCV] [FFmpeg]를 이용하여 동영상에서 렌즈 왜곡을 없이는 자동 프로그램을 만들어 보았습니다.

자세한 사용법 소개는 저의 유튜브 채널에 영상으로도 올려두었으니, 영상을 참고해 주시면 더 정확히 확인하실 수 있습니다.

 

프로그램 다운로드

Windows 전용이며, 설치는 필요 없는 무설치 프로그램입니다. 아래 Github 링크로 들어가시면 다운로드하실 수 있습니다.

 

GitHub - jeeho-ahn/OpenCV_Camera_Calibration_Undistort_Video: Camera Calibration / Undistort Tool from Video using OpenCV - Rele

Camera Calibration / Undistort Tool from Video using OpenCV - Release from WalkWithMe - GitHub - jeeho-ahn/OpenCV_Camera_Calibration_Undistort_Video: Camera Calibration / Undistort Tool from Video ...

github.com

들어가시면 우측 상단에 초록색 버튼을 확인할 수 있고, 클릭 후 나오는 메뉴 중 'Download ZIP' 버튼을 누르시면 됩니다.

이후 압축을 풀면 준비는 완료입니다.

카메라 특성 측정하기

카메라를 왜곡 제거를 원하는 영상 촬영 시와 동일한 화각과 해상도로 설정하고, 동영상 stabilization (안정화) 기능은 끕니다. (안정화 기능이 있으면 제대로 측정이 어렵습니다.) 예를 들어, 4k 영상을 Wide View로 찍었다면, 똑같이 4k Vide View로 설정하고 안정화 (고프로의 경우 HyperSmooth) 기능을 끄면 됩니다. 추가로, 셔터스피드를 1/160 이상 빠르게 (1/250 정도) 설정합니다. (모션블러를 줄이기 위함)  

그다음, 압축을 푼 폴더에 있는 [Checkerboard-A4-25mm-10x7.pdf] 파일을 엽니다. 체크보드 패턴인데, 이를 모니터에 크게 띄우고, 화면에 다른 빛이 반사되는 것을 최소화하기 위해 주면 조명은 꺼줍니다. 

그리고 카메라로 체크보드가 모두 보이는 범위에서 이리저리 왔다 갔다 하며 20~30초 정도 녹화합니다. (YouTube 영상 참고)

대략 이런 상태에서 좌우, 위아래, 앞뒤 천천히 왔다갔다 하면 됩니다.

녹화가 완료되면, 녹화된 파일을 PC로 가져옵니다. 녹화 파일을 앞서 압축을 푼 폴더 내 [opencv_video_calib.exe] 아이콘 위에 드래그&드롭합니다. 그러면 검정 터미널창이 뜨며 카메라/렌즈 특성 측정을 진행하게 됩니다.

측정이 완료되면 [calib_data] 폴더 안에 파일이 하나 생성되고, 동일한 설정에서 촬영한 영상은 이 파일을 이용하여 모두 처리할 수 있습니다.

참고로, [Result] 폴더 안에는 방금 찍은 영상에서 왜곡이 제거된 결과도 저장이 되니, 이를 재생하여 측정이 잘 되었는지 확인할 수 있습니다. 만약 영상이 잘 안 펴졌다면 다시 측정과정을 반복하는 것이 좋습니다.

동영상 별 렌즈 왜곡 제거하기

이제 측정이 완료되었으니 과거에 찍어 둔 영상에서 왜곡을 제거할 차례입니다. 사용법은 아주 간단하게 동영항 파일을 [opencv_video_undistort.exe] 아이콘 위에 드래그&드롭하면 됩니다. 위와 마찬가지로 검정 터미널창이 뜨며 영상 처리가 시작되며, 영상 길이와 PC 성능에 따라 다소 시간이 걸릴 수 있습니다.

처리가 완료되면 [Result] 폴더 안에 [원본이름_undistorted.MP4] 파일이 생성되고, 이 파일이 왜곡을 제거한 영상입니다.

단, 기술적인 이유로 소리는 제거된 상태이니, 소리가 필요하신 분은 원본 영상에서 소리만 추출하여 사용하셔야 할 것 같습니다.

 

결과물

카메라/렌즈 특성 측정에 문제가 없었다면, 렌즈 왜곡이 있는 원본과 비교하여 잘 펴진 새 영상을 [Result] 폴더 내에서 확인할 수 있습니다.

왼쪽이 원본, 오른쪽이 처리 후 펴진 결과 예시

 

정리

이번 포스팅에서는 의외로 어려운 영상 렌즈 왜곡 제거를 OpenCV와 FFmpeg 라이브러리를 이용해 제가 만든 프로그램을 이용해 손쉽게 할 수 있는 방법을 소개해 드렸습니다. 아무래도 체크보드를 띄워놓고 카메라 특성을 측정하는 Calibration 과정이 비전문가에게는 익숙한 과정이 아니다 보니 처음엔 잘 안될 수도 있는데, 한두 번만 해보시면 그리 어렵지 않다고 느끼게 되실 것 같습니다.

측정값은 동일한 해상도/화각 설정으로 찍은 영상에만 해당되므로 같은 화각이라도 해상도가 다른 등 다른 설정으로 촬영한 영상에 대해서는 측정을 한번 해야 합니다.

제가 Mac에서는 프로그래밍을 해본 적이 없어 부득이하게 Windows 버전만 있는 점 양해 부탁드립니다.