카메라 렌즈 캘리브레이션 개요

카메라 캘리브레이션 플러그인에 포함된 툴 및 알고리즘에 대해 알아봅니다.

Choose your operating system:

Windows

macOS

Linux

언리얼 엔진에서 CG 렌더 및 라이브 비디오에서 정확한 컴포지션을 생성하려면 현실 세계에서 비디오 영상을 캡처하는 데 사용된 물리적 카메라를 정확하게 시뮬레이션하는 버추얼 카메라가 필요합니다. 버추얼 카메라의 위치 및 방향은 물리적 카메라와 완전히 일치해야 하며, 트래킹 정보는 비디오 피드의 정확한 타이밍과 일치하여 각 비디오 프레임이 매 순간마다 카메라의 위치에 정확하게 동기화되도록 해야 합니다.

카메라 캘리브레이션(Camera Calibration) 플러그인은 에디터에서 카메라 및 렌즈를 캘리브레이션할 수 있는 간소화된 툴과 워크플로를 제공합니다. 이 캘리브레이션 프로세스는 버추얼 카메라를 물리적 카메라의 공간 내 위치와 정확하게 일치시키고 물리적 카메라의 렌즈 디스토션을 모델링하는 데 필요한 데이터를 생성합니다. 이 플러그인은 카메라 및 렌즈에 대한 모든 캘리브레이션 데이터를 캡슐화하는 렌즈 파일 에셋 유형을 채택하고 있습니다.

또한 카메라 캘리브레이션 플러그인은 캘리브레이션된 디스토션 데이터를 취해 정확한 포스트 프로세스 이펙트를 CG 렌더에 적용하는 강력한 렌즈 디스토션 파이프라인을 포함합니다. 디스토션 포스트 프로세스 이펙트는 무비 렌더 큐(Movie Render Queue)에서 사용 가능한 시네 카메라(CineCamera) 액터 또는 컴포셔(Composure)의 CG 레이어에 직접 적용될 수 있습니다.

플러그인의 툴 및 프레임워크는 확장성이 뛰어나고 유연하여 다양한 렌즈 및 워크플로를 지원합니다.

카메라 렌즈 캘리브레이션

초점 및 조리개 매핑

카메라 캘리브레이션 플러그인은 렌즈 파일 에셋을 사용하여 원시 초점 및 조리개 값을 시네 카메라 컴포넌트에서 사용되는 물리적 단위로 변환합니다. 예를 들어 원시 입력 값은 라이브 링크(Live Link)를 통해 외부 디바이스로부터 스트리밍되는 인코더 위치(절대 위치 또는 정규화된 위치)를 포함할 수 있습니다. 또한 이 값은 적절한 단위로 변환이 가능하지만 정확성을 더 높이려면 정밀한 미세 조정이 필요합니다.

캘리브레이션된 데이터

캘리브레이션된 렌즈 데이터는 카메라의 초점 및 줌에 따라 달라질 수 있습니다. 따라서 캘리브레이션의 퀄리티를 높이려면 종종 여러 초점 및 줌 포인트를 사용하여 캘리브레이션해야 합니다. 디스토션 파라미터, 카메라 내재, 노달 포인트 오프셋은 모두 관련된 초점 및 줌 값과 함께 렌즈 파일에 저장됩니다. 저장된 초점 및 줌 포인트 간에 보간하여 모든 초점 및 줌 위치에 대해 캘리브레이션된 렌즈 파일을 평가할 수 있습니다.

디스토션 파라미터

카메라 캘리브레이션 플러그인은 물리적 렌즈 모델에 대해 정의된 정확한 렌즈 디스토션 포스트 프로세스 이펙트를 지원합니다. 이 렌즈 모델은 렌즈의 다양한 위치에서 디스토션을 계산하는 데 사용되는 디스토션 파라미터 세트를 정의합니다.

플러그인은 5개의 디스토션 파라미터(K1, K2, P1, P2, K3)를 사용하는 Brown-Conrady 모델을 바탕으로 구형 디스토션 모델을 지원합니다. 이 파라미터는 단위가 없으며 캘리브레이션 프로세스의 일환으로 계산됩니다. 이 플러그인은 확장 가능하며 다른 파라미터를 사용하는 모델에 대한 지원을 추가할 수 있습니다.

카메라 내재

카메라 내재에는 초점 길이와 이미지 중앙이 포함되며, 카메라의 좌표계에서 3D 포인트가 어떻게 2D 이미지에 투사되는지 정의합니다. 카메라 및 렌즈를 정확하게 모델링하려면 이러한 내재도 캘리브레이션해야 합니다.

캘리브레이션 방법에 따라 초점 길이를 물리적 단위(밀리미터) 또는 픽셀 수를 사용하여 계산할 수 있습니다. 초점 길이는 종종 2D 벡터(Fx, Fy)로 표현되며 길이가 대체로 동일합니다. 표현을 일반화하기 위해 렌즈 파일은 이미지 센서 너비 및 높이(밀리미터) 또는 이미지 해상도(픽셀)로 나눈 정규화된 값으로 캘리브레이션된 초점 길이를 저장합니다.

정규화 후에 Fx 및 Fy는 서로 같지 않게 되지만 (Fy/ Fx)는 종횡비와 거의 같게 됩니다.

캘리브레이션된 이미지 중앙은 렌즈와 카메라 이미지 센서 간의 물리적인 정렬 불일치를 고려하지만 일반적으로는 이상적인 중앙에 가깝습니다. 이미지 중앙은 일반적으로 물리적 단위(밀리미터) 또는 픽셀로 계산되며 2D 벡터(Cx, Cy)로 표현됩니다. 초점 길이와 마찬가지로 이미지 중앙은 이미지 센서 너비 및 높이(밀리미터) 또는 이미지 해상도(픽셀)로 나눠서 정규화됩니다. 정규화 후에 이미지 중앙은 (0.5, 0.5)에 가깝게 됩니다.

노달 포인트 오프셋

렌즈의 노달 포인트는 광선이 수렴하는 지점입니다. 언리얼 엔진에서 버추얼 카메라는 이 노달 포인트에서 버추얼 월드에 배치되어 실제 오브젝트와 CG 오브젝트가 올바르게 정렬되게 해야 합니다.

노달 포인트 오프셋 캘리브레이션은 트래킹된 물리적 카메라의 포즈를 찾아 포즈와 트래킹 데이터 간의 오프셋을 계산하는 별도의 캘리브레이션 단계입니다. 이는 카메라가 움직일 때 버추얼 카메라의 트랜스폼이 계속 물리적 렌즈의 노달 포인트로 설정되게 해줍니다.

ST 맵

ST 맵은 각 픽셀 값이 UV 스페이스의 왜곡된 이미지 좌표에 대응하는 이미지입니다. ST 맵은 언리얼 엔진 외부의 캘리브레이션 툴을 사용하여 생성될 수 있으며, 포스트 프로세싱에서 사용되어 씬 텍스처 샘플링 시에 사용되는 UV를 변형할 수 있습니다.

이미 외부 툴에서 캘리브레이션 데이터를 생성한 사용자를 지원하기 위해 카메라 캘리브레이션 플러그인은 ST 맵을 렌즈 파일에 직접 입력할 수 있도록 지원합니다.

렌즈 파일 에셋 에디터

렌즈 파일 에셋 에디터(Lens File Asset Editor)는 캘리브레이션된 데이터로 렌즈 파일을 자동으로 채우는 다양한 캘리브레이션 툴을 제공합니다. 또한 이 에디터는 계산된 결과를 조정할 수 있는 커브 에디터를 제공합니다.

캘리브레이션 단계

언리얼 엔진에서 사용되는 캘리브레이션 단계는 스태틱 렌즈 정보 입력, 렌즈 디스토션 캘리브레이션, 이미지 중앙 조정, 노달 포인트 오프셋 캘리브레이션 단계를 포함합니다. 캘리브레이션 단계의 목록은 확장 가능하므로 프로그래머가 추가 캘리브레이션 툴을 구현하여 에디터에 추가할 수 있습니다.

렌즈 파일 에셋 에디터의 캘리브레이션 단계

렌즈 정보

렌즈 모델 이름과 일련 번호 등 스태틱 렌즈 데이터와 이미지 센서의 치수 등 카메라 데이터를 입력할 수 있습니다. 정확한 렌즈 정보를 사용하면 렌즈 디스토션 및 카메라 내재를 정확하게 캘리브레이션할 수 있습니다.

렌즈 디스토션

디스토션 파라미터 및 카메라 내재를 계산하는 데 사용되는 캘리브레이션 알고리즘을 선택할 수 있습니다. 플러그인은 다음과 같은 알고리즘을 포함하며, 이러한 알고리즘은 3D-2D 포인트 대응 세트를 사용하여 렌즈를 캘리브레이션할 때 OpenCV에 의존합니다.

  • 체커보드(Checkerboard): 코너를 자동으로 탐지할 수 있는 리지드 체커보드 그리드를 사용합니다.

  • 포인트 메서드(Points Method): 캘리브레이션 오브젝트를 식별 가능한 캘리브레이션 패턴과 함께 사용하며, 기능을 사용하려면 수동으로 클릭해야 합니다.

이 단계는 확장 가능하므로 프로그래머가 UCameraLensDistortionAlgo 클래스를 상속하여 추가 알고리즘을 구현할 수 있습니다.

이미지 중앙

렌즈를 캘리브레이션한 후 이미지 중앙의 위치를 수동으로 조정할 수 있습니다. 이는 캘리브레이션된 초점과 줌 포인트 간의 보간된 이미지 중앙이 정확하지 않을 때 또는 온도 등 외부 요인이 카메라 렌즈에 다소 영향을 미칠 때 유용합니다.

노달 오프셋

노달 포인트 오프셋 계산에 사용할 캘리브레이션 알고리즘 및 캘리브레이터 오브젝트를 선택할 수 있습니다. 이 플러그인은 다음과 같은 알고리즘을 포함합니다.

  • 포인트 메서드: 트래킹된 캘리브레이터 오브젝트를 하나 이상의 식별 가능한 기능(LED 마커 등)과 함께 사용하여 캘리브레이터을 카메라 뷰의 다양한 위치에 배치하고 시뮬캠 뷰포트에서 클릭하여 캘리브레이터의 현재 3D 및 2D 위치를 캡처할 수 있습니다. 충분한 수의 포인트를 수집한 뒤 캡처된 포인트의 재투영 오류를 최소화함으로써 노달 오프셋을 추정합니다.

  • ArUco 마커(ArUco Marker): 이미지 프로세싱을 사용하여 위에 인쇄된 ArUco 패턴을 통해 트래킹된 캘리브레이터의 2D 위치를 캡처하는 특수 포인트 메서드입니다.

  • 체커보드: 이미지 프로세싱을 사용하여 위에 인쇄된 체커보드 패턴을 통해 트래킹된 캘리브레이터의 2D 위치를 캡처하는 특수 포인트 메서드입니다.

  • 광학 축(Optical Axis): 캘리브레이터 오브젝트를 사용하여 모두 렌즈의 정중앙으로 투영되는 카메라의 여러 위치에서 적은 수의 포인트를 캡처할 수 있습니다. 이 포인트 간의 선은 광학 축을 나타냅니다. 노달 포인트는 축을 따라 입사동 위치가 발견될 때까지 버추얼 카메라를 수동으로 움직여서 찾을 수 있습니다.

이 단계는 확장이 가능하므로 프로그래머가 UCameraNodalOffsetAlgo 클래스를 상속하여 추가 알고리즘을 구현할 수 있습니다.

뷰포트 세팅

'뷰포트 세팅'을 수정하여 렌즈 파일 에셋 에디터의 뷰포트에서 표시할 항목을 변경할 수 있습니다. '뷰포트 세팅(Viewport Settings)'에는 다음과 같은 파라미터가 포함됩니다.

  • 투명(Transparency): 미디어 및 CG 레이어의 컴포짓을 조정하는 슬라이더입니다. 0.0은 100% 미디어입니다. 1.0은 100% CG입니다.

  • 카메라(Camera): CG 레이어 렌더링에 사용되는 버추얼 카메라 액터입니다. 캘리브레이션 단계를 수행하려면 이 카메라는 라이브 링크 카메라 서브젝트로 초점, 조리개, 줌 값을 구동해야 하며, 이 렌즈 파일 에셋을 할당해야 합니다.

  • 미디어 소스(Media Source): 미디어 레이어를 렌더링하는 데 사용된 미디어 프로파일입니다.

  • 오버레이(Overlay): 뷰포트에 오버레이를 적용하는 옵션입니다. 없음(None) 또는 조준선(Crosshair) 중에서 선택할 수 있습니다. 자체 커스텀 오버레이 머티리얼을 플러그인 세팅에 추가할 수도 있습니다.

뷰포트 세팅

디스토션 파이프라인

렌즈 디스토션 파이프라인은 카메라 및 렌즈 데이터를 사용하여 최종 렌더에 적용되는 정확한 디스토션 이펙트를 생성합니다.

현실 세계의 렌즈 디스토션을 모델링하는 데 사용되는 다음과 같은 세 가지 유형의 주요 입력 데이터가 있습니다.

  • 프레임별 디스토션 파라미터 및 카메라 내재를 스트리밍하는 라이브 링크 렌즈 소스

  • 카메라 FIZ를 스트리밍하여 렌즈 파일 에셋을 평가하는 라이브 링크 카메라 소스

  • 카메라 액터의 현재 초점 및 줌을 사용하는 렌즈 파일 에셋 평가

입력 데이터를 받고 디스토션 스테이트를 산출하는 기반 오브젝트를 렌즈 디스토션 핸들러(lens distortion handler) 라고 합니다. 입력 데이터를 핸들러에 제공하는 오브젝트는 디스토션 데이터의 프로듀서(producer) 라고 합니다. 출력 디스플레이스먼트 맵을 핸들러에서 받고 이를 이미지에 적용하는 오브젝트는 디스토션 데이터의 컨슈머(consumer) 라고 합니다.

렌즈 디스토션 핸들러는 디스토션 파라미터 및 카메라 내재를 입력으로 받고 디스토션 UV 디스플레이스먼트 맵 및 디스플레이스 맵을 참조하는 포스트 프로세스 머티리얼을 생성합니다. 디스플레이스먼트 맵 해상도는 프로젝트 세팅에서 지정할 수 있으며, 최종 렌더 해상도(예: 128 x 128)와 비교하면 상대적으로 작을 수 있습니다.

디스토션 데이터 프로듀서

프레임별 디스토션 파라미터 및 카메라 내재를 스트리밍하는 라이브 링크

기본 카메라 위치 및 방향 외에 자체 프로토콜을 사용하여 캘리브레이션된 렌즈 디스토션 정보를 제공하는 서드 파티 카메라 트래킹 벤더가 있습니다. 이 렌즈 데이터와 디스토션 파라미터, 카메라 내재는 각 프레임마다 스트리밍되며 렌즈 파일 에셋 없이 디스토션을 계산하는 데 사용될 수 있습니다. 이 데이터를 언리얼 엔진으로 스트리밍하기 위해 에픽게임즈는 라이브 링크 렌즈 역할 및 렌즈 컨트롤러를 제공합니다.

렌즈 컨트롤러는 새 렌즈 디스토션 핸들러를 초기화하고 라이브 링크 소스에서 받은 데이터를 스트리밍합니다. 초기화된 핸들러 유형은 렌즈 모델에 따라 다르며, 이는 라이브 링크 소스에 의해 스태틱 데이터로 지정되어야 합니다.

카메라 FIZ를 스트리밍하여 렌즈 파일 에셋을 평가하는 라이브 링크

언리얼 엔진 내에서 카메라 캘리브레이션을 수행하는 사용자를 위해 라이브 링크 컨트롤러에 렌즈 파일 에셋을 추가했습니다. 렌즈 파일이 있으면 카메라 컨트롤러는 라이브 링크를 통해 스트리밍된 초점 및 줌 위치에서 렌즈 파일을 평가합니다. 이 평가는 렌즈 파일에서 가장 가까운 캘리브레이션된 포인트 간에 보간하여 현재 프레임에 대한 디스토션 파라미터, 카메라 내재, 노달 포인트 오프셋을 생성합니다.

렌즈 파일에 ST 맵이 포함된 경우, ST 맵 또한 라이브 링크를 통해 스트리밍되는 초점 및 줌을 기반으로 보간됩니다.

스태틱 카메라 FIZ 및 렌즈 파일 에셋

일부 사용자는 라이브 카메라 데이터를 라이브 링크를 통해 스트리밍하지 않을 수도 있으므로 파이프라인은 버추얼 카메라의 현재 포커스 및 줌 세팅을 사용한 렌즈 파일 평가도 지원합니다.

카메라 캘리브레이션 플러그인은 시네 카메라 액터에 추가할 수 있는 렌즈 디스토션 컴포넌트를 채택하고 있습니다. 이 컴포넌트는 현재 카메라 세팅을 기반으로 렌즈 파일을 직접 평가할 수 있습니다.

블루프린트

블루프린트를 사용하여 렌즈 디스토션 핸들러 오브젝트를 생성하고 렌즈 파일을 지정할 필요 없이 디스토션 상태를 구동할 수 있습니다. 이 워크플로는 CG 엘리먼트를 라이브 비디오와 컴포짓하기 위해 고안된 것은 아니지만 디스토션 룩이 선호되는 CG 전용 프로젝트에 사용될 수 있습니다.

디스토션 데이터 컨슈머

렌즈 디스토션 컴포넌트를 갖춘 시네 카메라

렌즈 디스토션 컴포넌트를 시네 카메라 액터에 추가하여 씬의 모든 프로듀서에서 디스토션 데이터를 받을 수 있습니다.

컴포넌트 세팅에서 디스토션 소스를 선택할 수 있습니다. 디스토션 소스가 선택되어 있는 경우 포스트 프로세스 머티리얼이 타깃 카메라 컴포넌트에 자동으로 추가되며, 이는 선택된 디스토션 소스에 의해 생성된 디스토션 디스플레이스먼트 맵을 수신합니다.

디스토션 이펙트를 카메라에 적용하는 것은 카메라를 타기팅할 수 있는 컴포셔 CG 레이어에 영향을 미치지 않습니다.

컴포셔 CG 레이어

컴포셔 CG 레이어 세팅에서 디스토션 소스를 지정할 수 있습니다. 사용 가능한 소스 목록은 CG 레이어가 타기팅하는 카메라에 대한 디스토션 데이터를 현재 생성하고 있는 레벨 내 프로듀서를 바탕으로 채워집니다.

디스토션 소스가 선택되어 있는 경우 포스트 프로세스 머티리얼이 CG 레이어의 씬 캡처 컴포넌트에 자동으로 추가됩니다. 이 머티리얼은 선택한 디스토션 소스에 의해 생성된 디스토션 디스플레이스먼트 맵을 수신합니다. 여기에서 타깃 카메라는 시네 카메라 액터여야 합니다.

디스토션 이펙트를 CG 레이어에 적용하는 것은 타깃 카메라의 렌더링된 출력에 영향을 미치지 않습니다.

오버스캔

CG 이미지를 적절하게 왜곡하기 위해서는 왜곡되지 않은 원본 렌더보다 더 많은 입력 픽셀이 필요한 경우가 많습니다. 왜곡된 이미지가 모든 픽셀에서 유효한 데이터를 갖도록 하기 위해서는 왜곡되지 않은 렌더를 오버스캔(overscan) 하여 씬에서 적은 수의 추가 렌더를 생성해야 합니다.

오버스캔에 필요한 추가 픽셀의 비율은 현재 디스토션 상태를 바탕으로 렌즈 디스토션 핸들러가 계산합니다. 그런 다음 디스토션 컨슈머가 오버스캔 인수(Overscan Factor) 를 사용하여 왜곡되지 않은 렌더의 필드 오브 뷰(FOV)를 보강한 다음에 포스트 프로세스 디스토션 머티리얼을 적용합니다. 이를 통해 왜곡되지 않은 이미지가 보다 넓은 씬 뷰로 생성되며, 그럼에도 불구하고 왜곡되지 않은 원본 이미지와 동일한 타깃 이미지 해상도를 갖게 됩니다.

오버스캔 배수는 디스토션 프로듀서 세팅에서도 지정할 수 있습니다 여기에서 계산된 오버스캔을 얼마나 적용할지 0x~2x 범위에서 지정할 수 있습니다.

언디스토션

렌즈 디스토션 핸들러는 언디스토션 디스플레이스먼트 맵을 계산하며, 언디스토션 디스플레이스먼트 맵은 블루프린트에서 액세스할 수 있습니다. 이는 커스텀 포스트 프로세스 머티리얼을 생성하고 생성된 머티리얼을 적용하여 들어오는 미디어 소스에서 디스토션을 반전할 수 있게 해줍니다.

OpenCV

카메라 렌즈 캘리브레이션 툴은 알고리즘에 OpenCV를 사용합니다. OpenCV는 OpenCV 플러그인을 통해 직접 사용할 수 있습니다. 이 플러그인은 OpenCV 버전 4.5.4를 포함하며 ArUco 마커 트래킹, 체스보드 트래킹 등을 위한 새 블루프린트 노드를 추가합니다. 블루프린트 노드에 대한 자세한 내용은 다음의 블루프린트 API 레퍼런스를 참고하세요.