#include "Matrix.h"
// 영상 보정 하기 // _x1[4] 네 개의 실측좌표 // _x2[4] 네 개의 영상좌표 // _x2 = H*_x1 Matrix<double> GetHomography(CPoint _x1[4], CPoint _x2[4]) { Matrix<double> A(10,8), x1(5,2), x2(5,2), b(10,1); int i; for(i=0;i<4;i++) { x1(i+1,1) = _x1[i].x; x1(i+1,2) = _x1[i].y; x2(i+1,1) = _x2[i].x; x2(i+1,2) = _x2[i].y; } for(i=0; i<4; i++) { A(2*i+1,3) = 1.0; A(2*i+1,4) = A(2*i+1,5) = A(2*i+1,6) = 0.0; A(2*i+2,1) = A(2*i+2,2) = A(2*i+2,3) = 0.0; A(2*i+2,6) = 1.0; } for(i=0; i<4; i++) { A(2*i+1,1) = x1(i+1,1); A(2*i+1,2) = x1(i+1,2); A(2*i+1,7) = -x2(i+1,1)*x1(i+1,1); A(2*i+1,8) = -x2(i+1,1)*x1(i+1,2); A(2*i+2,4) = x1(i+1,1); A(2*i+2,5) = x1(i+1,2); A(2*i+2,7) = -x2(i+1,2)*x1(i+1,1); A(2*i+2,8) = -x2(i+1,2)*x1(i+1,2); b(2*i+1,1) = x2(i+1,1); b(2*i+2,1) = x2(i+1,2); } A.Print(cout,"A = "); int retCode; Matrix<double> x(8,1); x = Inv(Transpose(A) * A, &retCode) * Transpose(A) * b; x.Print(cout,"x = "); Matrix<double> hh(3,3), w(3,1), c(3,1); hh(1,1) = x(1,1); hh(1,2) = x(2,1); hh(1,3) = x(3,1); hh(2,1) = x(4,1); hh(2,2) = x(5,1); hh(2,3) = x(6,1); hh(3,1) = x(7,1); hh(3,2) = x(8,1); hh(3,3) = 1.0; hh.Print(cout, "H = "); return hh; } |