void ImageViewer_ex2::adjustimageAffineSimilarity() { Vector3f l(3,1); Vector3f m(3,1); Vector3f r1(3,1); Vector3f r2(3,1); MatrixXf A(2,3); l = pinmanager->getLine(0); m = pinmanager->getLine(1); r2 << l(0) * m(0), l(0) * m(1) + l(1) * m(0), l(1) * m(1); l = pinmanager->getLine(2); m = pinmanager->getLine(3); r1 << l(0) * m(0), l(0) * m(1) + l(1) * m(0), l(1) * m(1); A << r1.transpose(), r2.transpose(); JacobiSVD<MatrixXf> SVD(A, ComputeFullV); VectorXf S = SVD.matrixV().col(SVD.matrixV().cols() - 1); //S /= S(2); S(2) = 1; MatrixXf kkt(2,2); kkt << S(0), S(1), S(1), S(2); LLT<MatrixXf> lltOfA(kkt); MatrixXf L = lltOfA.matrixU(); H << L(0), L(1), 0, L(2), L(3), 0, 0, 0, 1; //std::cout << H << std::endl; H = H.inverse(); QSize imgSize(this->width(), this->height()); QVector<QPoint> areaRender; areaRender << QPoint(0,0) << QPoint(0, imgSize.height()) << QPoint(imgSize.width(), imgSize.height()) << QPoint(imgSize.width(), 0); showResult(imgSize, areaRender); }
vector<float> Hildreth::optimise (const vector<SparseVec>& a, const vector<float>& b) { size_t i; int max_iter = 10000; float eps = 0.00000001; float zero = 0.000000000001; vector<float> alpha ( b.size() ); vector<float> F ( b.size() ); vector<float> kkt ( b.size() ); float max_kkt = -1e100; size_t K = b.size(); float A[K][K]; bool is_computed[K]; for ( i = 0; i < K; i++ ) { A[i][i] = inner_product(a[i], a[i]); is_computed[i] = false; } int max_kkt_i = -1; for ( i = 0; i < b.size(); i++ ) { F[i] = b[i]; kkt[i] = F[i]; if ( kkt[i] > max_kkt ) { max_kkt = kkt[i]; max_kkt_i = i; } } int iter = 0; float diff_alpha; float try_alpha; float add_alpha; while ( max_kkt >= eps && iter < max_iter ) { diff_alpha = A[max_kkt_i][max_kkt_i] <= zero ? 0.0 : F[max_kkt_i]/A[max_kkt_i][max_kkt_i]; try_alpha = alpha[max_kkt_i] + diff_alpha; add_alpha = 0.0; if ( try_alpha < 0.0 ) add_alpha = -1.0 * alpha[max_kkt_i]; else add_alpha = diff_alpha; alpha[max_kkt_i] = alpha[max_kkt_i] + add_alpha; if ( !is_computed[max_kkt_i] ) { for ( i = 0; i < K; i++ ) { A[i][max_kkt_i] = inner_product(a[i], a[max_kkt_i]); // for version 1 //A[i][max_kkt_i] = 0; // for version 1 is_computed[max_kkt_i] = true; } } for ( i = 0; i < F.size(); i++ ) { F[i] -= add_alpha * A[i][max_kkt_i]; kkt[i] = F[i]; if ( alpha[i] > zero ) kkt[i] = abs ( F[i] ); } max_kkt = -1e100; max_kkt_i = -1; for ( i = 0; i < F.size(); i++ ) if ( kkt[i] > max_kkt ) { max_kkt = kkt[i]; max_kkt_i = i; } iter++; } return alpha; }