>

두 카메라의 고유 카메라 매트릭스를 사용하여 회전, 평행 이동을 성공적으로 계산했습니다. 또한 왼쪽 및 오른쪽 카메라에서 이미지를 수정했습니다. 이제 포인트의 3D 좌표를 계산하는 방법이 궁금합니다. 이미지에서 한 점만 있습니다. 여기 녹색 점을 참조하십시오. 방정식을 살펴 보았지만 계산 방법을 모르는 기준선이 필요합니다. 주어진 정보 (R, T 및 고유 행렬)로 녹색 점의 3 차원 좌표를 계산하는 과정을 보여 주시겠습니까?

참고로 1. 필요한 경우를 대비하여 기본 행렬과 필수 행렬도 있습니다. 2. 원본 이미지 크기는 960 x 720입니다. 수정 된 이미지는 925 x 669입니다. 3. 왼쪽 이미지의 녹색 점 : (562, 185), 오른쪽 이미지의 (542, 185)

  • 답변 # 1

    "기준선"이라는 용어는 일반적으로 번역을 의미합니다. 회전, 변환 및 내장 행렬이 이미 있으므로 R, T 는 아닙니다.  그리고 K ). 삼각 측량을 할 수 있으며 기본 또는 필수 행렬이 필요하지 않습니다 ( R, T 를 추출하는 데 사용할 수 있음)  등하지만 이미 가지고 있습니다). 삼각 측량 과정을 크게 바꾸지 않기 때문에 이미지를 교정 할 필요가 없습니다. 각각의 장단점과 그것들을 구현하는 많은 라이브러리로 삼각 측량하는 많은 방법이 있습니다. 따라서 여기서 할 수있는 것은 문제 및 잠재적 솔루션에 대한 개요와 함께 자신의 코드를 작성하기 위해 또는 소스로 사용할 수있는 리소스에 대한 포인터를 제공하는 것입니다.

    형식화 및 솔루션 개요.여기에서 우리가 무엇을하고 있는지 공식화합시다. 당신은 3D 포인트 X , 두 개의 관측치 x_1 그리고 x_2  왼쪽과 오른쪽 이미지에서 각각. 다시 투영하면 두 개의 광선이 나타납니다.

    ray_1=K^{1}x_1
    rat_2=R*K^{-1}x_2+T  //I'm assuming that [R|T] is the pose of the second camera expressed in the referential of the first camera
    
    

    이상적으로이 두 광선이 X 지점에서 만나기를 원할 것입니다 . 실제로 우리는 항상 두 개의 광선이 X 에서 만나지 않을 약간의 잡음 (분산 잡음, 반올림 오류 등)을 가지고 있기 때문에 따라서 가장 좋은 대답은 포인트 Q 입니다.  그런

    Q=argmin_X {d(X,ray_1)^2+d(X,ray_2)^2}
    
    

    여기서 d(.)  선과 점 사이의 유클리드 거리를 나타냅니다. 이 문제를 일반적인 최소 제곱 문제로 해결하거나 선분 l 를 고려한 기하학적 접근 방식 (중간 점)을 취할 수 있습니다  그것은 두 ray_1 에 수직입니다 그리고 ray_2 , 솔루션의 중간을 선택하십시오. 또 다른 빠르고 더러운 방법은 DLT를 사용하는 것입니다. 기본적으로 구속 조건을 다시 작성합니다 (즉, X  선형 시스템으로 가능한 한 두 광선에 최대한 가까워 야 함)  SVD로 해결하십시오.

    일반적으로 기하학적 (중간 점) 방법은 정확도가 떨어집니다. DLT 기반 기반은 가장 안정적이지는 않지만 일반적으로 허용 가능한 결과를 생성합니다.

    심도있는 공식 리소스

    Hartley-Zisserman의 책은 물론! opencv에서 사용되는 간단한 DLT 기반 방법 (캘리브레이션 및 sfm 모듈 모두)은 312 페이지에 설명되어 있습니다. 구현이 매우 쉽고, 10 분 이상 걸리지 않아야합니다. 언어.

    Szeliski'st book. SFM에 관한 장에서 삼각 측량에 대한 논의가 있지만 Hartley-Zisserman의 것만 큼 간단하거나 심도는 없습니다.

    코드opencv, calib3d 모듈 또는 contribs/sfm 모듈에서 삼각 측량 방법을 사용할 수 있습니다. 둘 다 DLT를 사용하지만 SFM 모듈의 코드는 더 이해하기 쉽습니다 (calib3d 코드에는 구식 C 코드가 많기 때문에 읽기가 쉽지 않습니다). 삼각 분할을위한 몇 가지 흥미로운 방법이있는 openGV라는 또 다른 lib도 있습니다.

    cv :: triangulatePoints

    cv :: sfm :: triangulatePoints

    OpenGV

    openGV git repo는 그다지 활발하지 않은데 라이브러리 디자인의 팬은 아니지만, 올바르게 기억한다면 (다른 말로 자유롭게 말 해주세요) DLT와 다른 방법을 제공합니다. 삼각 분할.

    당연히, 그것들은 모두 C ++로 작성되었지만 다른 언어를 사용하면 래퍼 또는 유사한 라이브러리를 찾는 것이 어렵지 않습니다 (파이썬에서는 여전히 opencv 래퍼가 있고 MATLAB에는 번들 모듈이 있습니다).

    AX=0

  • 이전 SQL Server 2017 중첩 삽입 또는 다른 삽입에서 한 삽입 결과 사용
  • 다음 javascript - 함수 변수를 외부 아약스 호출로 보내기