Ladybug 카메라를 사용한 기하학적 비전

카메라 시스템의 6개 센서에 의해 생성된 화상의 효과적인 왜곡 및 스티칭은 센서의 물리적 위치 및 방향과 렌즈의 왜곡 모델을 정확하게 교정함으로써 달성됩니다. 이 교정은 또한 화상 데이터의 사진 측량 분석을 가능하게 합니다. 이 사용 메모에서는 카메라 좌표계와 개별 센서를 매핑하는 방법을 설명합니다.

Ladybug 카메라의 좌표계

각 렌즈에는 오른손잡이용 3D 좌표계가 있습니다. 또한 카메라 전체와 관련된 Ladybug 3D 좌표계도 있습니다. 이로써 모든 Ladybug 카메라에 총 7개의 3D 좌표계가 있게 됩니다. 또한 각 센서에 대해 하나의 2D 픽셀 그리드 좌표계가 있습니다.

렌즈 3D 좌표계

6개의 렌즈 각각에는 자체 3D 좌표계가 있습니다.

  • 원점은 렌즈의 광학 중심입니다.
  • Z축은 센서를 벗어나 현장 쪽을 향합니다. 즉, 광학 축입니다.
  • X축 및 Y축은 해당 렌즈와 관련된 화상 센서의 픽셀 그리드와 비례합니다.
    • Y축은 화상 칼럼을 따라 이동합니다. 양의 Y 방향은 오름차순 행 번호 방향입니다. 이는 보통 방향의 화상의 관점부터 아래로 향합니다.
    • X축은 화상 행을 따라 이동합니다. 양의 X 방향은 오름차순 열 번호 방향입니다. 이는 보통 방향의 화상에서 오른쪽을 가리킵니다.
  • 이 좌표계는 각 렌즈/센서 쌍의 관점에서 3D 공간을 표시하는 데 사용됩니다. 단위는 픽셀이 아닌 미터입니다.


그림 1: 3D 센서 좌표

센서 2D 좌표계

각 센서에는 자체 2D 좌표계가 있습니다.

  • u축 및 v축은 수정 화상 공간에 대한 화상 기반 2D 화상 좌표계이며 픽셀 단위로 측정됩니다.
  • 좌표계의 원점은 광축과 수정된 상평면의 교차점에 있으며 각 센서마다 다릅니다.
  • u축은 오름차순 열 번호 방향(즉, 오른쪽)으로 화상 센서의 행을 따라 이동합니다.
  • v축은 행 번호 오름차순 방향(즉, 아래)으로 열을 따라 이동합니다.


그림 2: 2D 센서 좌표

Ladybug 카메라 좌표계

Ladybug 카메라 좌표계는 Ladybug 케이스의 중심에 위치하며 6개의 렌즈 좌표계의 위치에 따라 결정됩니다.

  • 원점은 5개의 수평 카메라 원점의 중심입니다.
  • Z축은 상단 렌즈(렌즈 5)(*)의 광축과 평행합니다.
  • X축이 렌즈 0(*)의 광축과 평행합니다.
  • Y축은 X축 및 Z축을 기반으로 한 오른손잡이 좌표계와 일치합니다.
  • LD2 – LD3 – LD5에는 일부 차이가 있을 수 있습니다.
  • (*) 참고 –조립 공차로 인해 렌즈 5와 렌즈 0의 광축은 일반적으로 완전한 수직이 아닙니다. Ladybug 카메라 좌표계의 X축은 수직이 되도록 약간 조정됩니다.


그림 3: 글로벌 좌표

관련 렌즈 좌표계 및 Ladybug 좌표계

Ladybug 좌표계와 관련된 각 렌즈 좌표계의 위치는 Ladybug API에서 검색할 수 있습니다. 첫째로, ladybuggeom.h에 정의된 ladybugGetCameraUnitExtrinsics()를 사용하여 3D 변환 및 Euler 각도 정의 회전을 검색합니다.

/**
* 지정된 카메라 장치에 대한 6-D 외부 벡터를 가져옵니다.
*
* 6-D 외부 벡터는 EulerZYX 규칙(Craig의
* 로보틱스 소개 45~49페이지 참조). 외부의 순서
* 부품:
*
* - 소자 0 - Rx - X에 대한 회전(라디안)
* - 소자 1 - Ry - Y에 대한 회전(라디안)
* - 소자 2 - Rz - Z에 대한 회전(라디안)
* - 소자 3 - Tx - X에 따라 변환(미터)
* - 소자 4 - Ty - Y에 따라 변환(미터)
* - 소자 5 - Tz - Z에 따라 변환(미터)
*
* 외부란 해당 4x4 변환 매트릭스를 의미
* 로컬 카메라 장치 좌표의 지점을
* Ladybug 좌표계의 지점으로 매핑 가능. 여기서 s=sin 및 c=cos, 매트릭스의
* 형식은 아래와 같음.
*
* 예:
* 이것을 Craig의 매트릭스에 매핑하려면:
* - Rz = 알파
* - Ry = 베타
* - Rx = 감마
*
* - |X'| |((cRz)(cRy)) ((cRz)(sRy)(sRx)-(sRz)(cRx)) ((cRz)(sRy)(cRx)+(sRz)(sRx)) Tx||X|
* - |Y'|=|((sRz)(cRy)) ((sRz)(sRy)(sRx)+(cRz)(cRx)) ((sRz)(sRy)(cRx)-(cRz)(sRx)) Ty||Y|
* - |Z'| |((-sRy)) ((cRy)(sRx)) ((cRy)(cRx))) Tz||Z|
* - |1 | |0 0 0 1 ||1|
*
* @param 컨텍스트 - 액세스할 LadybugContext.
* @param uiCamera - 관심 대상 카메라 지수.
* @param ardEulerZYX - 반환된 6-D EulerZYX 외부 벡터.
*
* @return A LadybugError 기능의 성공 표시.
*/
LADYBUGDLL_API LadybugError
ladybugGetCameraUnitExtrinsics(
LadybugContext 컨텍스트,
미서명 int uiCamera,
이중 ardEulerZYX[6] );

기능 주석은 제공된 Euler 각도(Rx, Ry, Rz) 및 변환(Tx, Ty, Tz)을 4x4 변환 T로 변환하는 방법을 설명합니다. 표준 균일 변환 공식 사용:

여기에서 의 적절한 좌표 프레임.


이 균일한 변환이 얻어지면, Ladybug 좌표 프레임에서 렌즈 좌표 프레임 원점 또는 Ladybug 좌표 프레임에서 렌즈 좌표 프레임 축을 계산하는 데 사용될 수 있고, 그 반대의 경우도 마찬가지입니다.

픽셀 위치를 3D 광선으로 변환

기하학적 비전을 위해 Ladybug 카메라를 사용할 때 일반적인 작업은 특정 화상의 픽셀 위치를 Ladybug 좌표계의 3D 광선으로 해석하는 것입니다. 픽셀이 추출될 수 있는 다양한 화상 공간, 예를 들어 구형, 원통형, 수정형 또는 원시형이 있습니다. 사용자는 이러한 종류의 애플리케이션에 원시 화상을 사용하는 것이 좋습니다. 원시 화상은 재샘플링되지 않은 유일한 화상이므로 화상 기능을 찾거나 추적할 때 최상의 정확도를 제공할 것입니다.

원시 화상의 픽셀 위치를 Ladybug 좌표계의 3D 광선으로 변환하려면 다음 단계를 수행해야 합니다.

1. ladybugGetCameraUnitFocalLength()를 사용하여 적절한 카메라의 초점 길이 확보.

2. ladybugGetCameraUnitImageCenter()를 사용하여 카메라의 화상 중심 확보

3. ladybugGetCameraUnitExtrinsics()를 사용하여 카메라용 6D 외부 벡터(Euler 각도 및 변환) 확보

4. ladybugRectifyPixel()을 사용하여 2D 픽셀 위치 수정

5. 이 수정 화상 위치에 대한 (u,v) 픽셀 좌표를 찾습니다.

6. 수정된 2D 픽셀 위치를 로컬 카메라 좌표계 내의 3D 광선으로 변환

7. Labybug 좌표계에서 로컬 3D 광선을 3D 광선으로 변환

수정된(열, 행) 화상 위치에서 (u,v) 픽셀 위치를 찾으려면 화상 중심 정보를 고려해야 합니다.

여기서 는 픽셀 행 위치와 같고 화상 중심 행 위치와 같습니다.

표준 핀홀 카메라 모델을 사용하여 수정 화상을 해석함으로써 수정 화상 위치(u,v)를 국소 3D 광선 값으로 변환할 수 있습니다. 카메라에 대해 획득한 초점 길이와 화상 중심은 픽셀 단위이며 지정된 카메라의 수정 화상에만 유효합니다. 수정된 2D 픽셀 위치로부터 국부 3D 광선을 계산하기 위해 Z는 임의적이며 1로 설정할 수 있습니다. 그런 다음 핀홀 모델 방정식을 적용하면 다음과 같은 결과가 도출됩니다.

벡터 . 이 벡터를 Ladybug 좌표계로 변환하려면 섹션 1.5에 나와 있는 균일한 변환의 3x3 회전 부품을 적용하면 됩니다.

여기서 R은 T의 왼쪽 상단 3x3 서브매트릭스입니다. 이 벡터의 원점은 Ladybug 카메라 좌표계로 변환된 로컬 좌표계의 원점입니다. 또는

렌즈 오프셋을 위해 수정된 3D 광선으로 픽셀 위치 변환

2D 원시 픽셀을 3D 광선에 매핑하는 것은 각 렌즈 중심이 Ladybug 좌표계의 중심에서 오프셋된다는 사실로 인해 복잡해집니다. 가장 정확한 결과를 얻으려면 광선은 Ladybug 좌표계의 중심에서 오는 방향뿐만 아니라 시작점과 방향이 모두 있어야 합니다.

원시 픽셀 매핑은 다음 두 단계로 진행됩니다.

1. 원시 픽셀을 수정 좌표에 매핑 – API: ladybugRectifyPixel()

/**
* 왜곡된(원시) 픽셀 위치를 수정된 화상의 해당 점으로
* 매핑합니다.
*
* 이 기능은 수정된 화상의 해상도를 설정하는 ladybugSetOffScreenImageSize()
* 다음에 호출되어야 합니다.
*
* @param 컨텍스트 - 액세스할 LadybugContext.
* @param uiCamera - 이 화상에 해당하는 카메라 지수.
* @param dDistortedRow - 매핑할 왜곡된(원시) 픽셀의 행 좌표.
* @param dDistortedCol - 매핑할 왜곡된(원시) 픽셀의 열 좌표.
* @param pdRectifiedRow - 수정 화상의 동일한 점의 행 좌표를
* 반환할 위치.
* @param pdRectifiedCol - 수정 화상의 동일한 점의
* 열 좌표를 반환할 위치.
*
* @return A LadybugError 기능의 성공 표시.
* 선택한 지역의 평균이 모든 채널에 대해 254/255를 초과하면 LADYBUG_OVEREXPOSED가
* 반환됨.
*
* @see ladybugSetOffScreenImageSize()
*/
LADYBUGDLL_API LadybugError
ladybugRectifyPixel(
LadybugContext 컨텍스트,
미서명 int uiCamera,
이중 dDistortedRow,
이중 dDistortedCol,
이중* pdRectifiedRow,
이중* pdRectifiedCol

2. 수정 좌표를 광선 위치 및 방향에 매핑 – API: ladybugRCtoXYZ()

/**
* 특정 카메라 유닛의 2D 지점을 Ladybug 좌표 프레임의 3D
* 광선으로 투사. 광선은 시작점과 방향으로 정의됩니다.
* 시작점은 스티칭 반경과는 다른 거리에 있는
* 광선의 정확한 투사가 가능한 Ladybug 카메라의 중심에서
* 카메라 장치의 오프셋을 고려.
*
* @param 컨텍스트 - 액세스할 LadybugContext.
* @param dRectifiedRow - 2D 입력점의 수정된 행.
* @param dRectifiedCol - 2D 입력점의 수정된 열.
* @param uiCamera - 카메라 장치
* @param pdLocationX - 출력 광선 위치 x 부품.
* @param pdLocationY - 출력 광선 위치 y 부품.
* @param pdLocationZ - 출력 광선 위치 z 부품.
* @param pdDirectionX - 출력 광선 방향 x 부품.
* @param pdDirectionY - 출력 광선 방향 y 부품.
* @param pdDirectionZ - 출력 광선 방향 z 부품.
*
* @return A LadybugError 기능의 성공 표시.
*/
LADYBUGDLL_API LadybugError
ladybugRCtoXYZ(
LadybugContext 컨텍스트,
이중 dRectifiedRow,
이중 dRectifiedCol,
미서명 int uiCamera,
이중* pdLocationX,
이중* pdLocationY,
이중* pdLocationZ,
이중* pdDirectionX,
이중* pdDirectionY,
이중* pdDirectionZ);

이 매핑 유형의 예제 코드와 API 기능에 크게 의존하지 않는 다른 매핑 유형은 Ladybug SDK에 포함된 ladybugTranslate2dTo3d 예제에서 사용할 수 있습니다.

3D 지점을 픽셀 위치로 변환

섹션 1.6 및 1.7에 설명된 픽셀-3D 문제를 역전시키는 것은 먼저 3D 지점이 투사할 렌즈를 찾아야 하는 요건에 의해 약간 복잡해집니다. 그렇지 않으면 ladybugXYZtoRC() 기능을 사용하기 때문에 간단합니다. 기능 헤더 정보는 아래에 나와 있습니다.

/**
* 3D 지점(Ladybug 좌표 프레임 관련)를
* 표시된 카메라 장치로 투영하고 수정 화상에 비치는 곳으로
* 반환됨.
*
* @param 컨텍스트 - 액세스할 LadybugContext.
* @param dLadybugX - 투사할 지점의 X 좌표.
* @param dLadybugY - 투사할 지점의 Y 좌표.
* @param dLadybugZ - 투사할 지점의 Z 좌표.
* @param uiCamera - 이 화상에 해당하는 카메라 지수.
* @param pdRectifiedRow - 3D 점이 비치는 반환된 수정 행
* 위치(점이 수정된 화상으로 투사하지 않는 경우
* 0 미만이 됨).
* @param pdRectifiedCol - 3D 점이 해당하는 반환된 수정 열
* 위치(점이 수정된 화상으로 투사하지 않는 경우
* 0 미만이 됨).
* @param pdNormalized - 수정 픽셀부터 초점 길이에 의해 정규화된
* 초점 중심까지의 거리. 호출자가 이 값에 관심이 없는 경우 NULL로
* 설정 가능.
*
* @return A LadybugError 기능의 성공 표시.
*/
LADYBUGDLL_API LadybugError
ladybugXYZtoRC(
LadybugContext 컨텍스트,
이중 dLadybugX,
이중 dLadybugY,
이중 dLadybugZ,
미서명 int uiCamera,
이중* pdRectifiedRow,
이중* pdRectifiedCol,
이중* pdNormalized);

3D 지점이 투사할 렌즈를 결정하기 위해 이 기능은 6개의 렌즈 위치 각각에 사용할 수 있습니다(uiCamera 매개변수를 적절히 설정). 반환 코드가 성공적이면(LADYBUG_OK), dLadybugX, Y 및 Z에 의해 정의된 3D 지점이 pdRectifiedRow 및 pdRectifiedCol에서 제공하는 수정된 행,열 위치에서 카메라 uiCamera로 투사됩니다. 원시 화상에서 픽셀의 위치는 ladybugUnrectifypPixel을 사용하여 결정할 수 있습니다.

교정 정확도

아래 그림과 같이 Ladybug 카메라의 평균 정확도는 10m 거리에서 2mm 또는 0.0116도입니다.

ladybug_3dray.jpg

로컬에서 Ladybug로의 변환 오류

Ladybug 카메라 좌표계와 관련하여 수학적 모델이 렌즈의 실제 위치 및 방향과 얼마나 잘 일치할 수 있는지와 관련된 오류가 있습니다. 이는 실제 물리적 위치와 카메라 교정 중에 계산된 위치 간의 차이와 관련이 있습니다.

이는 다음과 관련이 있습니다.
관련 렌즈 좌표계 및 Ladybug 좌표계
3D 지점을 픽셀 위치로 변환

수정 오류

수학적 모델이 기본 렌즈 왜곡과 얼마나 잘 일치할 수 있는지와 관련된 오류가 있습니다.

이는 다음과 관련이 있습니다.
픽셀 위치를 3D 광선으로 변환
3D 지점을 픽셀 위치로 변환

카메라 중심에 대한 시차 오류

시차 오류는 추가적인 오류의 원인이며 위에 명시된 10m 정확도에서 2mm에 포함되지 않습니다.

시차 오류는 서로 다른 두 시작 위치에서 동일한 대상을 가리키는 두 광선 간의 차이입니다. 이 경우 위치 차이는 렌즈 중심과 카메라 좌표 중심 사이에 있습니다.

다음 다이어그램은 렌즈 중심이 실제 위치에 있을 때와 렌즈 중심이 Ladybug 좌표계의 중심에 있을 때 3D 공간에서 동일한 지점을 관찰하는 각도 차이를 보여줍니다.

LD6 Equator Lens Parallax.png

LD6 Top Lens Parallax.png

5p-Equator Lens Parallax.png

5p-Top Lens Parallax.png