added wave correct support into opencv_stitching

This commit is contained in:
Alexey Spizhevoy 2011-05-06 06:20:41 +00:00
parent 3928dd9d99
commit 15173fc559
2 changed files with 28 additions and 22 deletions

View File

@ -11,16 +11,20 @@ using namespace cv;
void printUsage() void printUsage()
{ {
cout << "Rotation model images stitcher.\n" cout << "Rotation model images stitcher.\n\n";
<< "Usage: opencv_stitching img1 img2 [...imgN]\n" cout << "Usage: opencv_stitching img1 img2 [...imgN]\n"
<< "\t[--matchconf <0.0-1.0>]\n" << "\t[--matchconf <float>]\n"
<< "\t[--ba (ray|focal_ray)]\n" << "\t[--ba (ray|focal_ray)]\n"
<< "\t[--ba_thresh <float>]\n" << "\t[--ba_thresh <float>]\n"
//<< "\t[--wavecorrect (no|yes)]\n" << "\t[--wavecorrect (no|yes)]\n"
<< "\t[--warp (plane|cylindrical|spherical)]\n" << "\t[--warp (plane|cylindrical|spherical)]\n"
<< "\t[--seam (no|voronoi|graphcut)]\n" << "\t[--seam (no|voronoi|graphcut)]\n"
<< "\t[--blend (no|feather|multiband)]\n" << "\t[--blend (no|feather|multiband)]\n"
<< "\t[--output <result_img>]\n"; << "\t[--output <result_img>]\n\n";
cout << "--matchconf\n"
<< "\tGood values are in [0.2, 0.8] range usually.\n\n";
cout << "--ba_thresh\n"
<< "\tGood values are in [0.3, 1.0] range usually.\n";
} }
int main(int argc, char* argv[]) int main(int argc, char* argv[])
@ -29,7 +33,7 @@ int main(int argc, char* argv[])
vector<Mat> images; vector<Mat> images;
string result_name = "result.png"; string result_name = "result.png";
int ba_space = BundleAdjuster::RAY_SPACE; int ba_space = BundleAdjuster::FOCAL_RAY_SPACE;
float ba_thresh = 1.f; float ba_thresh = 1.f;
bool wave_correct = false; bool wave_correct = false;
int warp_type = Warper::SPHERICAL; int warp_type = Warper::SPHERICAL;
@ -75,19 +79,19 @@ int main(int argc, char* argv[])
ba_thresh = static_cast<float>(atof(argv[i + 1])); ba_thresh = static_cast<float>(atof(argv[i + 1]));
i++; i++;
} }
//else if (string(argv[i]) == "--wavecorrect") else if (string(argv[i]) == "--wavecorrect")
//{ {
// if (string(argv[i + 1]) == "no") if (string(argv[i + 1]) == "no")
// wave_correct = false; wave_correct = false;
// else if (string(argv[i + 1]) == "yes") else if (string(argv[i + 1]) == "yes")
// wave_correct = true; wave_correct = true;
// else else
// { {
// cout << "Bad wave correct flag value\n"; cout << "Bad wave correct flag value\n";
// return -1; return -1;
// } }
// i++; i++;
//} }
else if (string(argv[i]) == "--warp") else if (string(argv[i]) == "--warp")
{ {
if (string(argv[i + 1]) == "plane") if (string(argv[i + 1]) == "plane")

View File

@ -685,7 +685,6 @@ void BundleAdjuster::calcJacobian()
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
// TODO test on adobe/halfdome
void waveCorrect(vector<Mat> &rmats) void waveCorrect(vector<Mat> &rmats)
{ {
float data[9]; float data[9];
@ -710,10 +709,13 @@ void waveCorrect(vector<Mat> &rmats)
Mat avgz = Mat::zeros(3, 1, CV_32F); 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); avgz += rmats[i].col(2);
avgz.t().cross(r1).copyTo(r0); r1.cross(avgz.t()).copyTo(r0);
normalize(r0, r0); normalize(r0, r0);
r0.cross(r1).copyTo(r2); r1.cross(r0).copyTo(r2);
if (determinant(R) < 0)
R *= -1;
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];