주요 콘텐츠

움직임 기반 구조란?

움직임 기반 구조(SfM)는 2차원 영상 세트로부터 장면의 3차원 구조를 추정하는 과정입니다. SfM은 3차원 스캔, 증강현실, 시각 기반의 동시적 위치추정 및 지도작성(vSLAM) 등 다양한 응용 분야에 사용됩니다.

SfM은 다양한 방법으로 계산할 수 있습니다. 문제에 접근하는 방식은 사용된 카메라 대수와 유형, 영상 순서 지정 여부 등 다양한 요인에 따라 달라집니다. 보정된 단일 카메라로 촬영된 영상인 경우, 3차원 구조와 카메라 움직임을 스케일로만(up to scale) 복구할 수 있습니다. 스케일로만 복구한다는 것은 구조와 카메라 움직임의 크기를 다시 스케일링해도 관측 결과가 여전히 유지된다는 의미입니다. 예를 들어, 카메라를 객체에 가까이 놓으면 객체를 확대하고 카메라를 멀리 이동했을 때와 동일한 영상을 볼 수 있습니다. 세계 단위로 구조와 움직임의 실제 스케일을 계산하려면 다음과 같은 추가 정보가 필요합니다.

  • 장면 내 객체의 크기

  • 다른 센서(예: 주행거리계)에서 얻은 정보.

두 시점에서의 움직임 기반 구조

두 개의 고정된 카메라 또는 하나의 움직이는 카메라로 구성된 간단한 구조의 경우, 한 뷰는 카메라 1로 간주되고 다른 한 뷰는 카메라 2로 간주되어야 합니다. 이 시나리오에서 알고리즘은 카메라 1이 원점에 있고 카메라의 광학적 축이 z축을 따라 놓여 있다고 가정합니다.

  1. SfM에는 영상 간의 대응점이 필요합니다. 특징을 매칭시키거나 영상 1에서 영상 2까지 점을 추적하여 대응점을 찾습니다. KLT(Kanade-Lucas-Tomasi) 알고리즘과 같은 특징 추적 기술은 카메라가 서로 가까이 있을 때 적합합니다. 카메라가 서로 멀리 떨어질수록 KLT 알고리즘이 작동하지 않게 되며, 대신 특징 매칭이 사용될 수 있습니다.

    카메라 간 거리(기준선)대응점을 찾는 방법
    넓게matchFeatures를 사용하여 특징 매칭자동으로 영상 회전과 스케일 구하기
    좁게vision.PointTracker를 사용하여 특징 추적KLT 알고리즘을 사용한 얼굴 검출 및 추적

  2. 첫 번째 카메라를 기준으로 두 번째 카메라의 자세를 찾으려면 Fundamental 행렬을 계산해야 합니다. 이전 단계에서 찾은 대응점을 계산에 사용합니다. Fundamental 행렬은 두 카메라의 에피폴라 기하를 설명합니다. 한 카메라의 한 점을 다른 카메라의 에피폴라 선과 연결합니다. estimateFundamentalMatrix 함수를 사용하여 Fundamental 행렬을 추정합니다.

  3. Fundamental 행렬을 estrelpose 함수에 입력합니다. estrelpose 함수는 첫 번째 카메라의 좌표계에서 두 번째 카메라의 자세를 반환합니다. 위치는 해당 스케일로만 계산될 수 있으므로 두 카메라 사이의 거리는 1로 설정됩니다. 즉, 카메라 간의 거리는 1 단위로 정의됩니다.

  4. triangulate를 사용하여 매칭되는 점들의 3차원 위치를 확인합니다. 자세가 해당 스케일로만 확인되기 때문에, 구조를 계산할 때 형태는 정확하지만 크기는 실제와 다를 수 있습니다.

    triangulate 함수는 두 카메라의 행렬을 받으며, 이는 cameraProjection 함수를 사용하여 계산할 수 있습니다.

  5. 복원을 표시하려면 pcshow 또는 pcplayer를 사용합니다. 카메라 자세를 시각화하려면 plotCamera를 사용합니다.

복원 스케일을 복구하려면 추가 정보가 필요합니다. 스케일을 복구하는 한 가지 방법은 장면에서 크기를 알고 있는 객체를 검출하는 것입니다. 두 시점에서의 움직임 기반 구조 예제에서는 장면의 포인트 클라우드에서 크기를 알고 있는 구를 검출하여 스케일을 복구하는 방법을 보여줍니다.

여러 시점에서의 움직임 기반 구조

로보틱스나 자율주행과 같은 대부분의 응용 분야에서 SfM은 세 개 이상의 뷰를 사용합니다.

두 개의 뷰를 사용하는 SfM 방식을 여러 뷰를 사용하는 방식으로 확장할 수 있습니다. SfM에 사용되는 여러 뷰 세트는 순서가 있을 수도 있고 없을 수 있습니다. 여기서 선택한 방식은 순서가 있는 뷰 시퀀스를 가정합니다. 여러 뷰를 사용하는 SfM은 여러 영상 간의 대응점, 즉 트랙이 필요합니다. 일반적인 접근 방식은 쌍별 대응점으로부터 트랙을 계산하는 것입니다. imageviewset를 사용하여 쌍별 대응점을 관리하고 트랙을 찾을 수 있습니다. 각 트랙은 장면의 3차원 점에 대응됩니다. 트랙에서 3차원 점을 계산하려면 triangulateMultiview를 사용하십시오. 3차원 점은 worldpointset 객체에 저장될 수 있습니다. worldpointset 객체는 카메라 뷰의 3차원 점과 2차원 영상 점 간의 대응점도 저장합니다.

두 개의 뷰를 사용하는 SfM 방식을 사용하면, 카메라 1을 기준으로 카메라 2의 자세를 찾을 수 있습니다. 이를 여러 뷰를 사용하는 방식으로 확장하려면, 카메라 2를 기준으로 카메라 3의 자세를 찾는 식으로 단계를 반복하면 됩니다. 상대 자세는 공통 좌표계로 변환되어야 합니다. 일반적으로 모든 카메라 자세는 카메라 1을 기준으로 계산되어 모든 자세가 동일한 좌표계에 있게 됩니다. imageviewset를 사용하여 카메라 자세를 관리할 수 있습니다. imageviewset 객체는 뷰와 함께 뷰 간의 연결을 저장합니다.

한 뷰에서 다음 뷰로 넘어갈 때마다 각 카메라 자세 추정에 오차가 포함됩니다. 이러한 오차는 영상에서의 부정확한 점 위치추정, 잡음이 있는 매칭, 부정확한 보정으로 인해 발생합니다. 오차는 뷰 개수가 증가함에 따라 누적되며, 이 효과를 드리프트라고 합니다. 드리프트를 줄이는 한 가지 방법은 카메라 자세와 3차원 점 위치를 미세 조정하는 것입니다. 미세 조정에는 번들 조정이라고 하는 비선형 최적화 알고리즘을 사용하며, 이 알고리즘은 bundleAdjustment 함수로 구현되어 있습니다. bundleAdjustmentMotion을 사용하여 3차원 점 위치를 고정하고 카메라 자세만 미세 조정할 수 있습니다. 또한 bundleAdjustmentStructure를 사용하여 카메라 자세를 고정하고 3차원 위치만 미세 조정할 수도 있습니다.

드리프트를 줄이는 또 다른 방법은 imageviewset 객체에 대해 자세 그래프 최적화를 사용하는 것입니다. 루프 폐쇄가 감지되면 imageviewset 객체에 새 연결을 추가하고 optimizePoses 함수를 사용하여 상대 자세로 제한되는 카메라 자세를 미세 조정합니다.

두 시점에서의 움직임 기반 구조 예제에서는 2차원 뷰 시퀀스에서 3차원 장면을 복원하는 방법을 보여줍니다. 이 예제에서는 카메라 보정기 앱을 사용하여 뷰를 촬영하는 카메라를 보정합니다. imageviewset 객체를 사용하여 각 뷰와 연관된 데이터를 저장하고 관리합니다.

Monocular Visual Simultaneous Localization and Mapping 예제에서는 단안 카메라의 영상 데이터를 처리하여 실내 환경 맵을 작성하고 카메라 움직임을 추정하는 방법을 보여줍니다.

참고 항목

함수

객체

참고 항목

도움말 항목