세 점의 이동 관계로부터 어파인 변환 행렬을 구하고, 이를 이용하여 실제 영상을 어파인 변환하는 예제 코드를 코드 8-1에 나타냈습니다. 코드 8-1의 affine_transform() 함수는 tekapo.bmp 호수 영상을 평행사변형 형태로 변환합니다. 입력 영상에서 세 점은 좌측 상단, 우측 상단, 우측 하단의 모서리 점을 선택하였고, 이 점들이 이동할 결과 영상에서의 위치는 임의로 지정했습니다. affine_transform() 함수가 정의된 소스 파일과 사용된 영상 파일은 내려받은 예제 파일 중 ch08/affine 프로젝트에서 확인할 수 있습니다.
코드 8-1 영상의 어파인 변환 예제 [ch08/affine]
01 void affine_transform() 02 { 03 Mat src = imread("tekapo.bmp"); 04 05 if (src.empty()) { 06 cerr << "Image load failed!" << endl; 07 return; 08 } 09 10 Point2f srcPts[3], dstPts[3]; 11 srcPts[0] = Point2f(0, 0); 12 srcPts[1] = Point2f(src.cols - 1, 0); 13 srcPts[2] = Point2f(src.cols - 1, src.rows - 1); 14 dstPts[0] = Point2f(50, 50); 15 dstPts[1] = Point2f(src.cols - 100, 100); 16 dstPts[2] = Point2f(src.cols - 50, src.rows - 50); 17 18 Mat M = getAffineTransform(srcPts, dstPts); 19 20 Mat dst; 21 warpAffine(src, dst, M, Size()); 22 23 imshow("src", src); 24 imshow("dst", dst); 25 26 waitKey(); 27 destroyAllWindows(); 28 }