3D ~ 2D 투영 행렬
-
02-07-2019 - |
문제
정확한 위치를 알고있는 3D 공간에 3 점이 있습니다. 그들이 다음이라고 가정합니다. (x0,y0,z0)
, (x1,y1,z1)
그리고 (x2,y2,z2)
.
또한이 3 점을보고있는 카메라가 있으며 카메라 뷰 평면 에서이 세 점의 2D 위치를 알고 있습니다. 예를 들어 (x0,y0,z0)
될거야 (x0',y0')
, 그리고 (x1,y1,z1)
될거야 (x1',y1')
그리고 (x2,y2,z2)
될거야 (x2',y2')
카메라의 관점에서.
카메라 뷰 평면에서 이러한 3D 포인트를 2D 포인트로 투사하는 투영 행렬을 찾는 가장 쉬운 방법은 무엇입니까? 우리는 카메라 위치에 대해 아무것도 모릅니다.
해결책
이것은 당신에게 3 개의 변수로 세 가지 방정식의 두 세트를 제공합니다.
a*x0+b*y0+c*z0 = x0'
a*x1+b*y1+c*z1 = x1'
a*x2+b*y2+c*z2 = x2'
d*x0+e*y0+f*z0 = y0'
d*x1+e*y1+f*z1 = y1'
d*x2+e*y2+f*z2 = y2'
동시 방정식을 해결하는 방법을 사용하면 상황에서 가장 쉬운 방정식이 가장 쉽습니다 ( "손으로"해결하기 어렵지 않습니다). 그런 다음 변환 매트릭스는 ((a, b, c) (d, e, f))입니다.
...
실제로, 그것은 지나치게 단순화되며 카메라가 3D 좌표계의 원점을 가리키며 관점이 없다고 가정합니다.
관점에서 변환 매트릭스는 더 잘 작동합니다.
( a, b, c, d ) ( xt )
( x, y, z, 1 ) ( e, f, g, h ) = ( yt )
( i, j, k, l ) ( zt )
( xv, yv ) = ( xc+s*xt/zt, yc+s*yt/zt ) if md < zt;
그러나 4x3 매트릭스는 우리가 가져야하므로 12 도의 자유보다 구속력이 있습니다.
a*a+b*b+c*c = e*e+f*f+g*g = i*i+j*j+k*k = 1
a*a+e*e+i*i = b*b+f*f+j*j = c*c+g*g+k*k = 1
따라서 카메라 위치 및 각도의 6 가지 변수를 커버하기 위해 8 개의 방정식을 얻을 수있는 4 점, "중 ).
따라서 4 점이 있고 디스플레이의 중심과 관련하여 2D 뷰 포인트를 변환하면 13 개의 변수에서 14 개의 동시 방정식을 얻고 해결할 수 있습니다.
불행히도, 6 개의 방정식은 선형 방정식이 아닙니다. 다행히도, 해당 방정식의 모든 변수는 -1과 1 사이의 값으로 제한되므로 방정식을 해결하는 것이 여전히 가능할 것입니다.
다른 팁
카메라에는 (적어도) 자유도 -3은 위치 3 개, 오리엔테이션은 3 개, FOV의 경우 1입니다. 내가 틀렸다면 누군가가 나를 교정 할 것이라고 확신하지만, 전체 솔루션에 3 점이 충분하지 않은 것 같습니다.
이 문제에 대한 일반화 된 솔루션의 경우 그래픽 GEMS II에서 '상관 관계보기'를 찾아보십시오.
당신이 찾고있는 것은 포즈 추정 알고리즘이라고합니다. OpenCV의 POSIT 구현을 살펴보십시오. http://opencv.willowgarage.com/documentation/c/calib3d_camera_calibration_and_3d_reconstruction.html#posit
4 점 이상이 필요하며 같은 비행기에 놓지 않을 수 있습니다.
이 구현을위한 튜토리얼은 다음과 같습니다.http://opencv.willowgarage.com/wiki/posit
그래도주의하십시오 : 자습서에서는 제곱 뷰포트가 사용되므로 모든 뷰 코디네이트는 -1, -1 ~ 1,1 범위입니다. 이로 인해 카메라 좌표 시스템에 있어야한다고 가정합니다 (Aspect-Ratio 보정 전). 그렇지 않으므로 예를 들어 4 : 3 종횡비로 뷰포트를 사용하는 경우 입력 좌표는 -1.3333, -1 ~ 1.333,1 범위에 있어야합니다.
그건 그렇고, 당신의 요점이 있다면 ~ 해야 하다 같은 평면에 누워 있으면 OpenCV의 카메라 센트레이션 알고리즘을 볼 수 있지만 설정에 더 많은 관련이 있으며 입력으로 더 많은 포인트가 필요합니다. 그러나 카메라의 왜곡 정보와 고유 한 매개 변수도 생성합니다.
결정적인 솔루션을 찾을 수있는 정보가 충분하지 않다고 생각합니다. 카메라 위치를 알지 못하고 뷰 평면을 모르면이 문제를 해결할 수있는 무한한 수의 행렬이 있습니다.