Commit afc894db authored by Alexey Spizhevoy's avatar Alexey Spizhevoy

Replaced SVD with eigenval decomposition in waveCorrect func (stitching)

parent 7ca53cfc
...@@ -567,38 +567,36 @@ void BundleAdjusterRay::calcJacobian(Mat &jac) ...@@ -567,38 +567,36 @@ void BundleAdjusterRay::calcJacobian(Mat &jac)
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
// TODO replace SVD with eigen
void waveCorrect(vector<Mat> &rmats) void waveCorrect(vector<Mat> &rmats)
{ {
LOGLN("Wave correcting..."); LOGLN("Wave correcting...");
int64 t = getTickCount(); int64 t = getTickCount();
float data[9]; Mat moment = Mat::zeros(3, 3, CV_32F);
Mat r0(1, 3, CV_32F, data);
Mat r1(1, 3, CV_32F, data + 3);
Mat r2(1, 3, CV_32F, data + 6);
Mat R(3, 3, CV_32F, data);
Mat cov = Mat::zeros(3, 3, CV_32F);
for (size_t i = 0; i < rmats.size(); ++i) for (size_t i = 0; i < rmats.size(); ++i)
{ {
Mat r0 = rmats[i].col(0); Mat col = rmats[i].col(0);
cov += r0 * r0.t(); moment += col * col.t();
} }
Mat eigen_vals, eigen_vecs;
eigen(moment, eigen_vals, eigen_vecs);
Mat rg1 = eigen_vecs.row(2).t();
SVD svd; Mat img_k = Mat::zeros(3, 1, CV_32F);
svd(cov, SVD::FULL_UV);
svd.vt.row(2).copyTo(r1);
if (determinant(svd.vt) < 0) r1 *= -1;
Mat avgz = Mat::zeros(3, 1, CV_32F);
for (size_t i = 0; i < rmats.size(); ++i) for (size_t i = 0; i < rmats.size(); ++i)
avgz += rmats[i].col(2); img_k += rmats[i].col(2);
r1.cross(avgz.t()).copyTo(r0); Mat rg0 = rg1.cross(img_k);
normalize(r0, r0); rg0 /= norm(rg0);
r1.cross(r0).copyTo(r2); Mat rg2 = rg0.cross(rg1);
if (determinant(R) < 0) R *= -1;
Mat R = Mat::zeros(3, 3, CV_32F);
Mat tmp = R.row(0);
Mat(rg0.t()).copyTo(tmp);
tmp = R.row(1);
Mat(rg1.t()).copyTo(tmp);
tmp = R.row(2);
Mat(rg2.t()).copyTo(tmp);
for (size_t i = 0; i < rmats.size(); ++i) for (size_t i = 0; i < rmats.size(); ++i)
rmats[i] = R * rmats[i]; rmats[i] = R * rmats[i];
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment