좌표계 및 센서 융합 이해 - Amazon SageMaker

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

좌표계 및 센서 융합 이해

포인트 클라우드 데이터는 항상 좌표계에 있습니다. 이 좌표계는 차량 또는 주변 환경을 감지하는 디바이스에 대해 로컬이거나 세계 좌표계일 수 있습니다. Ground Truth 3D 포인트 클라우드 레이블 지정 작업을 사용할 경우, 모든 주석이 입력 데이터의 좌표계를 사용하여 생성됩니다. 일부 레이블 지정 작업 태스크 유형 및 기능의 경우 세계 좌표계에 데이터를 제공해야 합니다.

이 주제에서는 다음 내용을 학습합니다.

  • 세계 좌표계 또는 전역 참조 프레임에서 입력 데이터를 제공해야 하는 경우

  • 세계 좌표는 무엇이며 포인트 클라우드 데이터를 세계 좌표계로 변환하는 방법.

  • 센서 융합을 사용할 때 센서와 카메라 외부 행렬을 사용하여 포즈 데이터를 제공하는 방법.

레이블 지정 작업을 위한 좌표계 요구 사항

포인트 클라우드 데이터 가 로컬 좌표계로 수집된 경우 데이터를 수집하는 데 사용된 센서의 외부 행렬을 사용하여 세계 좌표계 또는 전역 참조 프레임으로 변환할 수 있습니다. 포인트 클라우드 데이터에 대한 외부 행렬을 얻을 수 없고 결과적으로 세계 좌표계에서 포인트 클라우드를 얻을 수 없는 경우, 3D 포인트 클라우드 객체 감지 및 의미 체계 분할 태스크 유형에 대해 로컬 좌표계에 포인트 클라우드 데이터를 제공할 수 있습니다.

객체 추적을 위해서는 세계 좌표계에서 포인트 클라우드 데이터를 제공해야 합니다. 왜냐하면 여러 프레임에서 객체를 추적할 때 ego 차량 자체가 세계 좌표계에서 움직이므로 모든 프레임에 참조 포인트가 필요하기 때문입니다.

센서 융합을 위한 카메라 데이터를 포함하는 경우 3D 센서와 동일한 세계 좌표계 (예: Li DAR 센서) 에서 카메라 포즈를 제공하는 것이 좋습니다.

세계 좌표계에서 포인트 클라우드 데이터 사용

이 섹션에서는 글로벌 기준 프레임이라고도 하는 세계 좌표계 (WCS) 가 무엇인지 설명하고 세계 좌표계에서 포인트 클라우드 데이터를 제공하는 방법을 설명합니다.

세계 좌표계란 무엇입니까?

글로벌 기준 좌표계는 차량 및 센서 좌표계가 배치되는 고정된 범용 좌표계입니다. WCS 예를 들어, 두 센서에서 수집되어 여러 포인트 클라우드 프레임이 서로 다른 좌표계에 있는 경우 a를 사용하여 이러한 포인트 클라우드 프레임의 모든 좌표를 단일 좌표계로 WCS 변환할 수 있습니다. 여기서 모든 프레임의 원점은 동일합니다 (0,0,0). 이 변환은 변환 벡터를 사용하여 각 프레임의 원점을 원점으로 변환하고 회전 행렬을 WCS 사용하여 세 축 (일반적으로 x, y, z) 을 올바른 방향으로 회전하여 수행됩니다. 이러한 강체 변환을 동종 변환이라고 합니다.

세계 좌표계는 전역 경로 계획 시뮬레이션, 현지화 시뮬레이션, 매핑 시뮬레이션 및 주행 시나리오 시뮬레이션에서 중요합니다. Ground Truth는 ISO8855에 정의된 것과 같은 오른손 데카르트 세계 좌표계를 사용합니다. 예를 들어, x축은 자동차 이동 방향을 향하고, y축은 왼쪽, z축은 지면에서 위를 가리킵니다.

전역 참조 프레임은 데이터에 따라 다릅니다. 일부 데이터셋은 첫 번째 프레임의 Li DAR 위치를 원점으로 사용합니다. 이 시나리오에서는 모든 프레임이 첫 번째 프레임을 참조로 사용하고, 디바이스 헤딩 및 위치는 첫 번째 프레임의 원점 근처에 있습니다. 예를 들어 KITTI 데이터셋에는 첫 번째 프레임이 세계 좌표의 참조로 사용됩니다. 이외의 데이터 세트에서는 원점과 다른 디바이스 위치를 사용합니다.

참고로 이 IMU 좌표계는 일반적으로 z축을 따라 90도 회전하는GPS/좌표계가 아닙니다. 포인트 클라우드 데이터가GPS/IMU좌표계 (예: 오픈 소스 AV KITTI 데이터셋의 OxTS) 에 있는 경우 원점을 세계 좌표계 (일반적으로 차량의 기준 좌표계) 로 변환해야 합니다. 데이터에 변환 행렬(회전 행렬 및 평행 이동 벡터)을 곱하여 이 변환을 적용합니다. 이렇게 하면 데이터가 원래 좌표계에서 전역 참조 좌표계로 변환됩니다. 다음 단원에서는 이러한 변환에 대해 자세히 배우겠습니다.

3D 포인트 클라우드 데이터를 a로 변환 WCS

Ground Truth는 포인트 클라우드 데이터가 선택된 참조 좌표계로 이미 변환되었다고 가정합니다. 예를 들어 센서의 기준 좌표계 (예: LiDAR) 를 글로벌 기준 좌표계로 선택할 수 있습니다. 또한 다양한 센서에서 포인트 클라우드를 가져와 센서의 보기에서 차량의 참조 좌표계 보기로 변환할 수 있습니다. 회전 행렬과 변환 벡터로 구성된 센서의 외부 매트릭스를 사용하여 포인트 클라우드 데이터를 기준 프레임 WCS 또는 글로벌 기준 프레임으로 변환합니다.

변환 벡터와 회전 행렬을 총칭하여 외부 행렬을 구성할 수 있으며, 외부 행렬은 로컬 좌표계의 데이터를 a로 변환하는 데 사용할 수 있습니다. WCS 예를 들어, Li DAR 외부 행렬은 다음과 같이 구성될 수 있습니다. 여기서 R 는 회전 행렬이고 T 는 변환 벡터입니다.

LiDAR_extrinsic = [R T;0 0 0 1]

예를 들어 자율 주행 KITTI 데이터셋에는 각 프레임의 Li DAR 외부 변환 행렬에 대한 회전 행렬과 변환 벡터가 포함됩니다. pykitti python 모듈을 사용하여 데이터를 로드할 수 있으며, KITTI 데이터세트에서 Li는 i 번째 프레임에 대한 외부 변환을 dataset.oxts[i].T_w_imu 제공합니다. 이 DAR 외부 변환은 해당 프레임의 포인트와 곱하여 월드 프레임 -으로 변환할 수 있습니다. np.matmul(lidar_transform_matrix, points) Li DAR 프레임의 한 점에 Li DAR 외부 행렬을 곱하면 해당 점이 세계 좌표로 변환됩니다. 세계 프레임의 포인트와 카메라 외부 행렬을 곱하면 카메라의 참조 프레임에 포인트 좌표가 생깁니다.

다음 코드 예제는 데이터셋의 포인트 클라우드 프레임을 a로 변환하는 방법을 보여줍니다. KITTI WCS

import pykitti import numpy as np basedir = '/Users/nameofuser/kitti-data' date = '2011_09_26' drive = '0079' # The 'frames' argument is optional - default: None, which loads the whole dataset. # Calibration, timestamps, and IMU data are read automatically. # Camera and velodyne data are available via properties that create generators # when accessed, or through getter methods that provide random access. data = pykitti.raw(basedir, date, drive, frames=range(0, 50, 5)) # i is frame number i = 0 # lidar extrinsic for the ith frame lidar_extrinsic_matrix = data.oxts[i].T_w_imu # velodyne raw point cloud in lidar scanners own coordinate system points = data.get_velo(i) # transform points from lidar to global frame using lidar_extrinsic_matrix def generate_transformed_pcd_from_point_cloud(points, lidar_extrinsic_matrix): tps = [] for point in points: transformed_points = np.matmul(lidar_extrinsic_matrix, np.array([point[0], point[1], point[2], 1], dtype=np.float32).reshape(4,1)).tolist() if len(point) > 3 and point[3] is not None: tps.append([transformed_points[0][0], transformed_points[1][0], transformed_points[2][0], point[3]]) return tps # customer transforms points from lidar to global frame using lidar_extrinsic_matrix transformed_pcl = generate_transformed_pcd_from_point_cloud(points, lidar_extrinsic_matrix)

센서 융합

Ground Truth는 최대 8개의 비디오 카메라 입력을 가진 포인트 클라우드 데이터의 센서 융합을 지원합니다. 이 기능을 사용하면 라벨링 담당자가 동기화된 비디오 프레임이 있는 3D 포인트 클라우드 프레임을 볼 수 side-by-side 있습니다. 센서 융합은 레이블 지정을 위한 시각적 컨텍스트를 제공할 뿐만 아니라 작업자가 3D 장면과 2D 이미지에서 주석을 조정할 수 있게 해주며, 이러한 조정은 다른 보기로 투영됩니다. 다음 동영상은 DAR Li와 카메라 센서 융합을 사용한 3D 포인트 클라우드 라벨링 작업을 보여줍니다.

DARLi와 카메라 센서 융합을 사용한 3D 포인트 클라우드 라벨링 작업을 보여주는 GIF.

센서 융합을 사용할 때 최상의 결과를 얻으려면 포인트 클라우드가 a WCS 안에 있어야 합니다. Ground Truth는 센서 (예: LiDAR), 카메라, 자아 차량 자세 정보를 사용하여 센서 융합을 위한 외부 및 고유 매트릭스를 계산합니다.

외부 행렬

Ground Truth는 센서 (예: LiDAR) 외부 및 카메라 외부 및 고유 매트릭스를 사용하여 카메라 기준 프레임에 대한 포인트 클라우드 데이터의 기준 프레임으로 또는 포인트 클라우드 데이터의 기준 프레임에서 물체를 투영합니다.

예를 들어 Ground Truth는 3D 포인트 클라우드의 레이블을 카메라 이미지 평면으로 투영하기 위해 DAR Li의 자체 좌표계에서 카메라 좌표계로 3D 포인트를 변환합니다. 이는 일반적으로 먼저 Li DAR 외부 행렬을 사용하여 DAR Li의 자체 좌표계에서 세계 좌표계 (또는 글로벌 기준 프레임) 로 3D 포인트를 변환하는 방식으로 이루어집니다. 그런 다음 Ground Truth는 카메라 역외부 매트릭스(포인트를 전역 참조 프레임에서 카메라의 참조 프레임으로 변환함)를 사용하여, 이전 단계에서 구한 세계 좌표계의 3D 포인트를 카메라 이미지 평면으로 변환합니다. Li DAR 외부 행렬을 사용하여 3D 데이터를 세계 좌표계로 변환할 수도 있습니다. 3D 데이터가 이미 세계 좌표계로 변환된 경우, 첫 번째 변환은 레이블 평행 이동에 아무런 영향을 미치지 않으며 레이블 평행 이동은 카메라의 역 외부 변환에 따라서만 결정됩니다. 보기 행렬은 투영된 레이블을 시각화하는 데 사용됩니다. 이러한 변환 및 보기 행렬에 대한 자세한 내용은 Ground Truth 센서 융합 변환 단원을 참조하세요.

Ground Truth는 사용자가 제공한 DAR Li와 카메라 포즈 데이터 (쿼터니언 단위:,,,), heading (qxqyqz,) 를 사용하여 이러한 외부 행렬을 계산합니다. qw position x y z 차량의 경우 일반적으로 헤딩 및 위치는 세계 좌표계의 차량 참조 프레임에 설명되어 있으며, 이를 ego 차량 포즈라고 합니다. 각 카메라 외부 행렬에 대해 해당 카메라에 대한 포즈 정보를 추가할 수 있습니다. 자세한 내용은 포즈 단원을 참조하십시오.

내부 행렬

Ground Truth는 카메라 외부 및 내부 매트릭스를 사용하여 보기 지표를 계산함으로써 레이블을 3D 장면에서 카메라 이미지로 변환합니다. Ground Truth는 사용자가 제공한 카메라 초점 거리(fx, fy) 및 광학 중심 좌표(cx,cy)를 사용하여 카메라 내부 매트릭스를 계산합니다. 자세한 내용은 내부 행렬 및 왜곡 단원을 참조하십시오.

이미지 왜곡

이미지 왜곡은 여러 가지 이유로 발생할 수 있습니다. 예를 들면 배럴 효과 또는 어안 효과 때문에 이미지가 왜곡될 수 있습니다. Ground Truth는 왜곡 계수와 함께 고유 파라미터를 사용하여 3D 포인트 클라우드 레이블 지정 작업 생성 시 제공되는 이미지의 왜곡을 해제합니다. 카메라 이미지가 이미 왜곡 해제되지 않은 경우 모든 왜곡 계수를 0으로 설정해야 합니다.

Ground Truth가 이미지의 왜곡을 해제하기 위해 수행하는 변환에 대한 자세한 내용은 카메라 보정: 외부, 내부 및 왜곡을(를) 참조하세요.

Ego 차량

자율 주행 애플리케이션을 위한 데이터를 수집하기 위해 포인트 클라우드 데이터를 생성하는 데 사용되는 측정은 차량 또는 ego 차량에 장착된 센서에서 가져옵니다. 3D 장면 및 2D 이미지를 종착점 또는 시작점으로 삼아 레이블 조정을 투영하려면, Ground Truth의 세계 좌표계에 자아 차량 포즈를 적용해야 합니다. ego 차량 포즈는 위치 좌표와 방향 4원수로 구성됩니다.

Ground Truth는 자아 차량 포즈를 이용하여 회전 매트릭스 및 변환 매트릭스를 계산합니다. 3차원의 회전은 일련의 축을 중심으로 3 회전 시퀀스로 나타낼 수 있습니다. 이론적으로는 3D 유클리드 공간에 걸친 세 축이면 충분합니다. 실제로 회전 축은 기본 벡터에 대해 선택됩니다. 3번의 회전이 전역 참조 프레임(외부)에서 이뤄질 것으로 예상됩니다. Ground Truth는 회전 상태의 객체에 연결되고 해당 객체와 함께 움직이는 본체 중심 참조 프레임(내부)을 지원하지 않습니다. 객체를 추적하려면 Ground Truth가 모든 차량이 이동하는 전역 참조로 측정을 수행해야 합니다. Ground Truth 3D 포인트 클라우드 레이블 지정 작업을 사용할 경우, Z는 회전축(외부 회전)으로 지정되고 편주각 및 오일러각은 라디안(회전각)으로 지정됩니다.

포즈

Ground Truth는 3D 시각화 및 센서 융합에 포즈 정보를 사용합니다. 매니페스트 파일을 통해 입력한 포즈 정보는 외부 행렬을 계산하는 데 사용됩니다. 외부 행렬이 이미 있는 경우 이를 사용하여 센서 및 카메라 포즈 데이터를 추출할 수 있습니다.

예를 들어 자율 주행 KITTI 데이터세트에서 pykitti python 모듈을 사용하여 데이터를 로드할 수 있습니다. KITTI 데이터세트에서 Li는 i 번째 프레임에 대한 DAR 외부 변환을 dataset.oxts[i].T_w_imu 제공하며, 이를 포인트와 곱하여 월드 프레임 (-) 으로 가져올 수 있습니다. matmul(lidar_transform_matrix, points) 입력 매니페스트 파일 형식에 따라 이 변환을 DAR Li의 위치 (변환 벡터) 및 제목 (쿼터니언 단위) 으로 변환할 수 있습니다. JSON i 프레임 내 cam0에 대한 카메라 외부 변환은 inv(matmul(dataset.calib.T_cam0_velo, inv(dataset.oxts[i].T_w_imu)))(으)로 계산할 수 있으며, cam0에 대한 방향과 위치로 변환할 수 있습니다.

import numpy rotation = [[ 9.96714314e-01, -8.09890350e-02, 1.16333982e-03], [ 8.09967396e-02, 9.96661051e-01, -1.03090934e-02], [-3.24531964e-04, 1.03694477e-02, 9.99946183e-01]] origin= [1.71104606e+00, 5.80000039e-01, 9.43144935e-01] from scipy.spatial.transform import Rotation as R # position is the origin position = origin r = R.from_matrix(np.asarray(rotation)) # heading in WCS using scipy heading = r.as_quat() print(f"pose:{position}\nheading: {heading}")
위치

입력 매니페스트 파일에서 position은 세계 프레임과 관련된 센서의 위치를 나타냅니다. 장치 위치를 세계 좌표계에 배치할 수 없는 경우 로컬 좌표가 있는 Li DAR 데이터를 사용할 수 있습니다. 마찬가지로, 탑재된 비디오 카메라의 경우 세계 좌표계에서 위치와 헤딩을 지정할 수 있습니다. 카메라에서 위치 정보가 없는 경우 (0, 0, 0)를 사용하세요.

위치 객체의 필드는 다음과 같습니다.

  1. x(부동 소수점) - 자아 차량, 센서 또는 카메라 위치의 X좌표(단위: m)입니다.

  2. y(부동 소수점) - 자아 차량, 센서 또는 카메라 위치의 Y좌표(단위: m)입니다.

  3. z(부동 소수점) - 자아 차량, 센서 또는 카메라 위치의 Z좌표(단위: m)입니다.

다음은 position JSON 객체의 예시입니다.

{ "position": { "y": -152.77584902657554, "x": 311.21505956090624, "z": -10.854137529636024 } }
Heading

입력 매니페스트 파일에서 heading는 세계 프레임에 대한 디바이스의 방향을 나타내는 객체입니다. 헤딩 값은 4원수이어야 합니다. 4원수는 측지선 구형 속성과 일치하는 방향을 표현한 것입니다. 센서 헤딩을 세계 좌표로 설정할 수 없는 경우에는 ID 4원수 (qx = 0, qy = 0, qz = 0, qw = 1)을 사용하세요. 마찬가지로 카메라의 경우 헤딩을 4원수로 지정합니다. 외부 카메라 보정 파라미터를 얻을 수 없는 경우 ID 4원수도 사용하세요.

heading 객체의 필드는 다음과 같습니다.

  1. qx(부동 소수점) - ego 차량, 센서 또는 카메라 방향의 x 구성 요소.

  2. qy(부동 소수점) - ego 차량, 센서 또는 카메라 방향의 y 구성 요소.

  3. qz(부동 소수점) - ego 차량, 센서 또는 카메라 방향의 z 구성 요소.

  4. qw(부동 소수점) - ego 차량, 센서 또는 카메라 방향의 w 구성 요소.

다음은 heading JSON 객체의 예시입니다.

{ "heading": { "qy": -0.7046155108831117, "qx": 0.034278837280808494, "qz": 0.7070617895701465, "qw": -0.04904659893885366 } }

자세한 내용은 방향 4원수 및 위치 계산을 참조하십시오.

방향 4원수 및 위치 계산

Ground Truth에 대해 모든 방향 데이터를 4원수로 제공해야 합니다. 4원수는 회전을 근사화하는 데 사용할 수 있는 측지선 구형 속성과 일치하는 방향을 표현한 것입니다. 오일러 각도와 비교하여 구성하기가 더 쉽고 짐벌락(gimbal lock) 문제를 피할 수 있습니다. 회전 행렬과 비교하여 크기가 더 작고 수치적으로 더 안정적이며, 더 효율적입니다.

회전 행렬 또는 변환 행렬에서 4원수를 계산할 수 있습니다.

단일 4x4 강체 변환 행렬 대신 세계 좌표계에 회전 행렬(축 회전으로 구성됨)과 평행 이동 벡터(또는 원점)가 있는 경우, 회전 행렬 및 평행 이동 벡터를 직접 사용하여 4원수를 계산할 수 있습니다. scipypyqaternion 같은 라이브러리가 도움이 될 수 있습니다. 다음 코드 블록은 이러한 라이브러리를 사용하여 회전 행렬에서 4원수를 계산하는 예제를 보여줍니다.

import numpy rotation = [[ 9.96714314e-01, -8.09890350e-02, 1.16333982e-03], [ 8.09967396e-02, 9.96661051e-01, -1.03090934e-02], [-3.24531964e-04, 1.03694477e-02, 9.99946183e-01]] origin = [1.71104606e+00, 5.80000039e-01, 9.43144935e-01] from scipy.spatial.transform import Rotation as R # position is the origin position = origin r = R.from_matrix(np.asarray(rotation)) # heading in WCS using scipy heading = r.as_quat() print(f"position:{position}\nheading: {heading}")

3D 회전 변환기와 같은 UI 도구도 유용할 수 있습니다.

4x4 외부 변환 매트릭스가 있는 경우, 변환 매트릭스는 [R T; 0 0 0 1] 형태로 이루어져 있습니다. 여기서 R은(는) 회전 매트릭스이고 T은(는) 원점 평행 이동 벡터입니다. 즉, 다음과 같이 변환 행렬에서 회전 행렬과 평행 이동 벡터를 추출 할 수 있습니다.

import numpy as np transformation = [[ 9.96714314e-01, -8.09890350e-02, 1.16333982e-03, 1.71104606e+00], [ 8.09967396e-02, 9.96661051e-01, -1.03090934e-02, 5.80000039e-01], [-3.24531964e-04, 1.03694477e-02, 9.99946183e-01, 9.43144935e-01], [ 0, 0, 0, 1]] transformation = np.array(transformation ) rotation = transformation[0:3][0:3] translation= transformation[0:3][3] from scipy.spatial.transform import Rotation as R # position is the origin translation position = translation r = R.from_matrix(np.asarray(rotation)) # heading in WCS using scipy heading = r.as_quat() print(f"position:{position}\nheading: {heading}")

사용자가 직접 설정하면 자아 이동체의 Li DAR 센서에 대한GPS/IMU위치 및 방향 (위도, 경도, 고도 및 회전, 피치, 편요각) 을 사용하여 외부 변환 행렬을 계산할 수 있습니다. 예를 들어, KITTI 원시 데이터에서 포즈를 pose = convertOxtsToPose(oxts) 계산하여 oxts 데이터를 4x4 고정 변환 행렬로 지정된 로컬 유클리드 포즈로 변환할 수 있습니다. 그런 다음 세계 좌표계의 참조 프레임 변환 행렬을 사용하여 이러한 포즈 변환 행렬을 전역 참조 프레임으로 변환할 수 있습니다.

struct Quaternion { double w, x, y, z; }; Quaternion ToQuaternion(double yaw, double pitch, double roll) // yaw (Z), pitch (Y), roll (X) { // Abbreviations for the various angular functions double cy = cos(yaw * 0.5); double sy = sin(yaw * 0.5); double cp = cos(pitch * 0.5); double sp = sin(pitch * 0.5); double cr = cos(roll * 0.5); double sr = sin(roll * 0.5); Quaternion q; q.w = cr * cp * cy + sr * sp * sy; q.x = sr * cp * cy - cr * sp * sy; q.y = cr * sp * cy + sr * cp * sy; q.z = cr * cp * sy - sr * sp * cy; return q; }

Ground Truth 센서 융합 변환

다음 섹션에서는 사용자가 제공한 포즈 데이터를 사용하여 수행하는 Ground Truth 센서 융합 변환에 대해 자세히 설명합니다.

LiDAR: 외인성

Ground Truth는 3D Li DAR 장면을 2D 카메라 이미지로 투영하기 위해 Ego Vehicle 자세와 방향을 사용하여 엄격한 변환 투영 메트릭을 계산합니다. Ground Truth는 간단한 회전 및 평행 이동 시퀀스를 수행하여 세계 좌표의 회전 및 3D 평면으로의 평행 이동을 계산합니다.

Ground Truth는 다음과 같이 방향 4원수를 사용하여 회전 지표를 계산합니다.

방정식: Ground Truth 포인트 클라우드 회전 지표

여기서는 heading JSON 객체의 파라미터에 [x, y, z, w] 해당합니다[qx, qy, qz, qw]. Ground Truth는 평행 이동 열 벡터를 T = [poseX, poseY, poseZ](으)로 계산합니다. 이제 외부 행렬은 다음과 같습니다.

LiDAR_extrinsic = [R T;0 0 0 1]

카메라 보정: 외부, 내부 및 왜곡

기하학적 카메라 보정카메라 리섹션이라고도 하며, 이미지 또는 비디오 카메라의 렌즈 파라미터 및 이미지 센서 파라미터를 추정합니다. 이러한 파라미터를 사용하여 렌즈 왜곡을 보정하거나, 객체 크기를 세계 단위로 측정하거나, 장면에서 카메라 위치를 결정할 수 있습니다. 카메라 파라미터에는 내부 행렬 및 왜곡 계수가 포함됩니다.

카메라 외부 변환

카메라 포즈가 지정된 경우, Ground Truth는 3D 평면에서 카메라 평면으로의 강체 변환을 기반으로 카메라 외부 변환을 계산합니다. 이러한 계산은 Ground Truth가 카메라 포즈(positionheading) 사용 및 역외부 변환 계산을 수행하지 않는 경우 LiDAR: 외인성에 사용된 계산과 동일합니다.

camera_inverse_extrinsic = inv([Rc Tc;0 0 0 1]) #where Rc and Tc are camera pose components

내부 행렬 및 왜곡

일부 카메라(예: 핀홀 카메라 또는 어안 카메라)는 사진의 심각한 왜곡을 일으킬 수 있습니다. 이러한 왜곡은 왜곡 계수와 카메라 초점 거리를 이용하여 보정할 수 있습니다. 자세한 내용은 OpenCV 설명서의 OpenCV를 이용한 카메라 보정을 참조하세요.

Ground Truth가 보정할 수 있는 왜곡은 2가지 유형, 즉 방사형 왜곡과 접선형 왜곡으로 나뉩니다.

방사형 왜곡은 광선이 광학 중심에서 렌즈 엣지 근처에서 더 많이 구부러질 때 발생합니다. 렌즈가 작을수록 왜곡이 커집니다. 방사 왜곡의 존재는 배럴 효과 또는 어안 효과의 형태로 나타나며, Ground Truth가 공식 1을 사용하여 이 왜곡을 해제합니다.

공식 1:

공식 1: 방사형 왜곡을 해제하기 위한 x_ {보정} 및 y_ {정정} 방정식

접선형 왜곡은 이미지 촬영에 사용된 렌즈가 이미지 평면과 완벽하게 평행하지 않아서 발생합니다. 이것은 공식 2로 수정할 수 있습니다.

공식 2:

공식 2: 접선 왜곡을 보정하기 위한 x_ {정정} 및 y_ {보정} 방정식

입력 매니페스트 파일에서 왜곡 계수를 제공할 수 있으며, Ground Truth가 이미지의 왜곡을 해제합니다. 모든 왜곡 계수는 부동 소수점입니다.

  • k1, k2, k3, k4 – 방사형 왜곡 계수입니다. 어안 및 핀홀 카메라 모델 모두에 지원됩니다.

  • p1 ,p2 – 접선형 왜곡 계수입니다. 핀홀 카메라 모델에 지원됩니다.

이미지가 이미 왜곡 해제된 경우, 입력 매니페스트에서 모든 왜곡 계수가 0이어야 합니다.

Ground Truth는 보정된 이미지를 올바르게 재구성하기 위해 초점 거리를 기준으로 이미지의 단위 변환을 수행합니다. 공통 초점 거리가 두 축에 대해 주어진 종횡비(예: 1)와 함께 사용되는 경우, 상위 공식에 단일 초점 거리가 포함됩니다. 이러한 4개의 파라미터를 포함하는 행렬을 카메라 내부 보정 행렬이라고 합니다.

카메라 내부 고유 보정 매트릭스.

왜곡 계수는 사용된 카메라 해상도에 관계없이 동일하지만 보정된 해상도에서 현재 해상도로 배율을 조정해야 합니다.

다음은 부동 소수점 값입니다.

  • fx - X 방향의 초점 거리.

  • fy - Y 방향의 초점 거리.

  • cx - 주점의 x 좌표입니다.

  • cy - 주점의 y 좌표입니다.

Ground Truth는 다음 코드 블록에 나온 대로, 카메라 외부 매트릭스 및 카메라 내부 매트릭스를 사용하여 보기 지표를 계산함으로써 3D 장면과 2D 이미지 간의 레이블을 변환합니다.

def generate_view_matrix(intrinsic_matrix, extrinsic_matrix): intrinsic_matrix = np.c_[intrinsic_matrix, np.zeros(3)] view_matrix = np.matmul(intrinsic_matrix, extrinsic_matrix) view_matrix = np.insert(view_matrix, 2, np.array((0, 0, 0, 1)), 0) return view_matrix