투시 변환은 보통 3×3 크기의 실수 행렬로 표현합니다. 투시 변환은 여덟 개의 파라미터로 표현할 수 있지만, 좌표 계산의 편의상 아홉 개의 원소를 갖는 3×3 행렬을 사용합니다. 투시 변환을 표현하는 행렬을 MP이라고 하면, 입력 영상의 픽셀 좌표 (x, y)가 행렬 MP에 의해 이동하는 결과 영상 픽셀 좌표 (x′, y′)는 다음과 같이 계산됩니다.
앞의 행렬 수식에서 입력 좌표와 출력 좌표를 (x, y, 1), (wx′, wy′, w) 형태로 표현한 것을 동차 좌표계(homogeneous coordinates)라고 하며, 좌표 계산의 편의를 위해 사용하는 방식입니다. 여기서 w는 결과 영상의 좌표를 표현할 때 사용되는 비례 상수이며, w=p31x+p32y+p33 형태로 계산됩니다. 그러므로 x′과 y′은 다음과 같이 구할 수 있습니다.
OpenCV는 투시 변환 행렬을 구하는 함수와 투시 변환 행렬을 이용하여 실제 영상을 투시 변환하는 함수를 모두 제공합니다. 먼저 투시 변환 행렬을 구하는 함수 이름은 getPerspectiveTransform()입니다. getPerspectiveTransform() 함수는 입력 영상에서 네 점의 좌표와 이 점들이 이동한 결과 영상의 좌표 네 개를 입력으로 받아 3×3 투시 변환 행렬을 계산합니다. getPerspectiveTransform() 함수 원형은 다음과 같습니다.
Mat getPerspectiveTransform(const Point2f src[], const Point2f dst[], int solveMethod = DECOMP_LU); Mat getPerspectiveTransform(InputArray src, InputArray dst, int solveMethod = DECOMP_LU); |
|
• src |
입력 영상에서 네 점의 좌표 |
• dst |
결과 영상에서 네 점의 좌표 |
• solveMethod |
계산 방법 지정. DecompTypes 열거형 상수 중 하나를 지정합니다. |
• 반환값 |
3×3 크기의 투시 변환 행렬 |