void rectify::initializeProjectiveTransform() { Matrix3f matPCPT; matPCPT.m[0][0] = (scrWidth -1)*(scrWidth -1); matPCPT.m[0][1] = (scrWidth -1)*(scrHeight -1); matPCPT.m[0][2] = (scrWidth -1)*2; matPCPT.m[1][0] = (scrWidth -1)*(scrHeight -1);matPCPT.m[1][1] = (scrHeight -1)*(scrHeight -1); matPCPT.m[1][2] = (scrHeight -1)*2; matPCPT.m[2][0] = (scrWidth -1)*2; matPCPT.m[2][1] = (scrHeight -1)*2; matPCPT.m[2][2] = 4; matPCPT = matPCPT * 0.25; Matrix3f matPPT; matPPT.m[0][0] = (scrWidth * scrWidth -1); matPPT.m[0][1] = 0; matPPT.m[0][2] = 0; matPPT.m[1][0] = 0; matPPT.m[1][1] = (scrHeight * scrHeight -1); matPPT.m[1][2] = 0; matPPT.m[2][0] = 0; matPPT.m[2][1] = 0; matPPT.m[2][2] = 0; float var = (scrWidth * scrHeight)/12.0; matPPT = matPPT * var; vector3d epipoleFirst = global::epipoleA; Matrix3f epiASymmetric; //take global::epipoleA and create antiSymmetric Matrix: A = -transpose(A) epiASymmetric.m[0][0] = 0; epiASymmetric.m[0][1] = epipoleFirst.z; epiASymmetric.m[0][2] = -epipoleFirst.y; epiASymmetric.m[1][0] = -epipoleFirst.z; epiASymmetric.m[1][1] = 0; epiASymmetric.m[1][2] = epipoleFirst.x; epiASymmetric.m[2][0] = epipoleFirst.y; epiASymmetric.m[2][1] = -epipoleFirst.x; epiASymmetric.m[2][2] = 0; Matrix3f fundamentalMat = global::fundamentalMatrix; //fundamentalMat.m[1][1] *= (-1); Matrix3f rectMatA = epiASymmetric.ReturnTranspose() * matPPT * epiASymmetric; Matrix3f rectMatB = epiASymmetric.ReturnTranspose() * matPCPT * epiASymmetric; Matrix3f rectMatADash = fundamentalMat.ReturnTranspose() * matPPT * fundamentalMat; Matrix3f rectMatBDash = fundamentalMat.ReturnTranspose() * matPCPT * fundamentalMat; Matrix3f orthoMatD, orthoMatDInv, orthoMatD_Dash, orthoMatDInv_Dash; singularValueDecomposition(rectMatA, orthoMatD, orthoMatDInv); //rectMatA = orthoMatD' * orthoMatD; ' = transpose singularValueDecomposition(rectMatADash, orthoMatD_Dash, orthoMatDInv_Dash); /* std::cout<<std::endl<<" for rectMatA "<<std::endl; rectMatA.Display("rectMatA"); orthoMatD.Display("matD"); (orthoMatD.ReturnTranspose() * orthoMatD).Display("MUL"); orthoMatDInv.Display("matDInv"); (orthoMatD * orthoMatDInv).Display("ID"); std::cout<<std::endl<<" for rectMatB "<<std::endl; rectMatADash.Display("rectMatADash"); orthoMatD_Dash.Display("matDDash"); (orthoMatD_Dash.ReturnTranspose() * orthoMatD_Dash).Display("MUL"); orthoMatDInv_Dash.Display("matDDashInv"); (orthoMatD_Dash * orthoMatDInv_Dash).Display("IDDash"); */ // to maximize weight matrix Matrix3f weightMat, weightMatDash; weightMat = orthoMatDInv.ReturnTranspose() * rectMatB * orthoMatDInv; weightMatDash = orthoMatDInv_Dash.ReturnTranspose() * rectMatBDash * orthoMatDInv_Dash; vector3d way, way_dash; powerMaxEigenVec(weightMat, way); powerMaxEigenVec(weightMatDash, way_dash); vector3d zed, zed_dash; zed = orthoMatDInv * way; zed_dash = orthoMatDInv_Dash * way_dash; zed.Normalize(); zed_dash.Normalize(); vector3d Zedd = zed * 0.5 + zed_dash * 0.5; vector3d dublu, dubluDash; dublu = epiASymmetric * Zedd; dubluDash = fundamentalMat * Zedd; dublu.change(dublu.x/dublu.z, dublu.y/dublu.z, 1.0); dubluDash.change(dubluDash.x/dubluDash.z, dubluDash.y/dubluDash.z, 1.0); projectiveTrans.m[0][0] = 1; projectiveTrans.m[0][1] = 0; projectiveTrans.m[0][2] = 0; projectiveTrans.m[1][0] = 0; projectiveTrans.m[1][1] = 1; projectiveTrans.m[1][2] = 0; projectiveTrans.m[2][0] = dublu.x; projectiveTrans.m[2][1] = dublu.y; projectiveTrans.m[2][2] = 1; projectiveTransDash.m[0][0] = 1; projectiveTransDash.m[0][1] = 0; projectiveTransDash.m[0][2] = 0; projectiveTransDash.m[1][0] = 0; projectiveTransDash.m[1][1] = 1; projectiveTransDash.m[1][2] = 0; projectiveTransDash.m[2][0] = dubluDash.x; projectiveTransDash.m[2][1] = dubluDash.y; projectiveTransDash.m[2][2] = 1; (projectiveTrans * global::epipoleA).Display("epiA"); (projectiveTransDash * global::epipoleB).Display("epiB"); projectiveTrans.Display("projT"); projectiveTransDash.Display("projTD"); }