Added some new warpers.
authorIvan Korolev <no@email>
Wed, 14 Mar 2012 12:59:23 +0000 (12:59 +0000)
committerIvan Korolev <no@email>
Wed, 14 Mar 2012 12:59:23 +0000 (12:59 +0000)
modules/stitching/include/opencv2/stitching/detail/warpers.hpp
modules/stitching/include/opencv2/stitching/detail/warpers_inl.hpp
modules/stitching/include/opencv2/stitching/warpers.hpp
samples/cpp/stitching_detailed.cpp

index 812d7d0..091b4fd 100644 (file)
@@ -185,6 +185,147 @@ protected:
 };\r
 \r
 \r
+struct CV_EXPORTS FisheyeProjector : ProjectorBase\r
+{\r
+    void mapForward(float x, float y, float &u, float &v);\r
+    void mapBackward(float u, float v, float &x, float &y);\r
+};\r
+\r
+\r
+class CV_EXPORTS FisheyeWarper : public RotationWarperBase<FisheyeProjector>\r
+{\r
+public:\r
+    FisheyeWarper(float scale) { projector_.scale = scale; }\r
+};\r
+\r
+\r
+struct CV_EXPORTS StereographicProjector : ProjectorBase\r
+{\r
+    void mapForward(float x, float y, float &u, float &v);\r
+    void mapBackward(float u, float v, float &x, float &y);\r
+};\r
+\r
+\r
+class CV_EXPORTS StereographicWarper : public RotationWarperBase<StereographicProjector>\r
+{\r
+public:\r
+    StereographicWarper(float scale) { projector_.scale = scale; }\r
+};\r
+\r
+\r
+struct CV_EXPORTS CompressedRectilinearProjector : ProjectorBase\r
+{\r
+       float a, b;\r
+\r
+    void mapForward(float x, float y, float &u, float &v);\r
+    void mapBackward(float u, float v, float &x, float &y);\r
+};\r
+\r
+\r
+class CV_EXPORTS CompressedRectilinearWarper : public RotationWarperBase<CompressedRectilinearProjector>\r
+{\r
+public:\r
+   CompressedRectilinearWarper(float scale, float A = 1, float B = 1) \r
+   { \r
+          projector_.a = A;\r
+          projector_.b = B;\r
+          projector_.scale = scale; \r
+   }\r
+};\r
+\r
+\r
+struct CV_EXPORTS CompressedRectilinearPortraitProjector : ProjectorBase\r
+{\r
+       float a, b;\r
+\r
+    void mapForward(float x, float y, float &u, float &v);\r
+    void mapBackward(float u, float v, float &x, float &y);\r
+};\r
+\r
+\r
+class CV_EXPORTS CompressedRectilinearPortraitWarper : public RotationWarperBase<CompressedRectilinearPortraitProjector>\r
+{\r
+public:\r
+   CompressedRectilinearPortraitWarper(float scale, float A = 1, float B = 1) \r
+   { \r
+          projector_.a = A;\r
+          projector_.b = B;\r
+          projector_.scale = scale; \r
+   }\r
+};\r
+\r
+\r
+struct CV_EXPORTS PaniniProjector : ProjectorBase\r
+{\r
+       float a, b;\r
+\r
+    void mapForward(float x, float y, float &u, float &v);\r
+    void mapBackward(float u, float v, float &x, float &y);\r
+};\r
+\r
+\r
+class CV_EXPORTS PaniniWarper : public RotationWarperBase<PaniniProjector>\r
+{\r
+public:\r
+   PaniniWarper(float scale, float A = 1, float B = 1) \r
+   { \r
+          projector_.a = A;\r
+          projector_.b = B;\r
+          projector_.scale = scale; \r
+   }\r
+};\r
+\r
+\r
+struct CV_EXPORTS PaniniPortraitProjector : ProjectorBase\r
+{\r
+       float a, b;\r
+\r
+    void mapForward(float x, float y, float &u, float &v);\r
+    void mapBackward(float u, float v, float &x, float &y);\r
+};\r
+\r
+\r
+class CV_EXPORTS PaniniPortraitWarper : public RotationWarperBase<PaniniPortraitProjector>\r
+{\r
+public:\r
+   PaniniPortraitWarper(float scale, float A = 1, float B = 1) \r
+   { \r
+          projector_.a = A;\r
+          projector_.b = B;\r
+          projector_.scale = scale; \r
+   }\r
+\r
+};\r
+\r
+\r
+struct CV_EXPORTS MercatorProjector : ProjectorBase\r
+{\r
+    void mapForward(float x, float y, float &u, float &v);\r
+    void mapBackward(float u, float v, float &x, float &y);\r
+};\r
+\r
+\r
+class CV_EXPORTS MercatorWarper : public RotationWarperBase<MercatorProjector>\r
+{\r
+public:\r
+    MercatorWarper(float scale) { projector_.scale = scale; }\r
+};\r
+\r
+\r
+struct CV_EXPORTS TransverseMercatorProjector : ProjectorBase\r
+{\r
+    void mapForward(float x, float y, float &u, float &v);\r
+    void mapBackward(float u, float v, float &x, float &y);\r
+};\r
+\r
+\r
+class CV_EXPORTS TransverseMercatorWarper : public RotationWarperBase<TransverseMercatorProjector>\r
+{\r
+public:\r
+    TransverseMercatorWarper(float scale) { projector_.scale = scale; }\r
+};\r
+\r
+\r
 #ifdef HAVE_OPENCV_GPU\r
 class CV_EXPORTS PlaneWarperGpu : public PlaneWarper\r
 {\r
index 78eb756..ec4af53 100644 (file)
@@ -299,6 +299,333 @@ void CylindricalProjector::mapBackward(float u, float v, float &x, float &y)
 }\r
 \r
 inline\r
+void FisheyeProjector::mapForward(float x, float y, float &u, float &v)\r
+{\r
+       float x_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2];\r
+    float y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5];\r
+    float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8];\r
+\r
+       float u_ = atan2f(x_, z_);\r
+    float v_ = CV_PI - acosf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_));\r
+\r
+       u = scale * v_ * cosf(u_);\r
+       v = scale * v_ * sinf(u_);\r
+}\r
+\r
+inline\r
+void FisheyeProjector::mapBackward(float u, float v, float &x, float &y)\r
+{\r
+       u /= scale;\r
+    v /= scale;\r
+\r
+       float u_ = atan2f(v, u);\r
+       float v_ = sqrtf(u*u + v*v);\r
+\r
+       float sinv = sinf(CV_PI - v_);\r
+    float x_ = sinv * sinf(u_);\r
+    float y_ = cosf(CV_PI - v_);\r
+    float z_ = sinv * cosf(u_);\r
+\r
+    float z;\r
+    x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_;\r
+    y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_;\r
+    z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_;\r
+\r
+       if (z > 0) { x /= z; y /= z; }\r
+    else x = y = -1;\r
+}\r
+\r
+inline\r
+void StereographicProjector::mapForward(float x, float y, float &u, float &v)\r
+{\r
+       float x_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2];\r
+    float y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5];\r
+    float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8];\r
+\r
+       float u_ = atan2f(x_, z_);\r
+    float v_ = CV_PI - acosf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_));\r
+\r
+       float r = sinf(v_) / (1 - cosf(v_));\r
+       \r
+       u = scale * r * cos(u_);\r
+       v = scale * r * sin(u_);\r
+}\r
+\r
+inline\r
+void StereographicProjector::mapBackward(float u, float v, float &x, float &y)\r
+{\r
+       u /= scale;\r
+    v /= scale;\r
+\r
+       float u_ = atan2f(v, u);\r
+       float r = sqrtf(u*u + v*v);\r
+       float v_ = 2 * atanf(1.0 / r);\r
+\r
+       float sinv = sinf(CV_PI - v_);\r
+    float x_ = sinv * sinf(u_);\r
+    float y_ = cosf(CV_PI - v_);\r
+    float z_ = sinv * cosf(u_);\r
+\r
+    float z;\r
+    x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_;\r
+    y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_;\r
+    z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_;\r
+\r
+       if (z > 0) { x /= z; y /= z; }\r
+    else x = y = -1;\r
+}\r
+\r
+inline\r
+void CompressedRectilinearProjector::mapForward(float x, float y, float &u, float &v)\r
+{    \r
+       float x_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2];\r
+    float y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5];\r
+    float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8];\r
+\r
+    float u_ = atan2f(x_, z_);\r
+    float v_ = asinf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_));\r
+\r
+       u = scale * a * tanf(u_ / a);\r
+       v = scale * b * tanf(v_) / cosf(u_);\r
+}\r
+\r
+inline\r
+void CompressedRectilinearProjector::mapBackward(float u, float v, float &x, float &y)\r
+{\r
+       u /= scale;\r
+    v /= scale;\r
+\r
+       float aatg = a * atanf(u / a);\r
+       float u_ = aatg;\r
+       float v_ = atanf(v * cosf(aatg) / b);\r
+\r
+    float cosv = cosf(v_);\r
+    float x_ = cosv * sinf(u_);\r
+    float y_ = sinf(v_);\r
+    float z_ = cosv * cosf(u_);\r
+\r
+    float z;\r
+    x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_;\r
+    y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_;\r
+    z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_;\r
+\r
+    if (z > 0) { x /= z; y /= z; }\r
+    else x = y = -1;\r
+}\r
+\r
+inline\r
+void CompressedRectilinearPortraitProjector::mapForward(float x, float y, float &u, float &v)\r
+{    \r
+       float y_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2];\r
+    float x_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5];\r
+    float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8];\r
+\r
+    float u_ = atan2f(x_, z_);\r
+    float v_ = asinf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_));\r
+\r
+       u = - scale * a * tanf(u_ / a);\r
+       v = scale * b * tanf(v_) / cosf(u_);\r
+}\r
+\r
+inline\r
+void CompressedRectilinearPortraitProjector::mapBackward(float u, float v, float &x, float &y)\r
+{\r
+       u /= - scale;\r
+    v /= scale;\r
+\r
+       float aatg = a * atanf(u / a);\r
+       float u_ = aatg;\r
+       float v_ = atanf(v * cosf( aatg ) / b);\r
+\r
+    float cosv = cosf(v_);\r
+    float y_ = cosv * sinf(u_);\r
+    float x_ = sinf(v_);\r
+    float z_ = cosv * cosf(u_);\r
+\r
+    float z;\r
+    x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_;\r
+    y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_;\r
+    z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_;\r
+\r
+    if (z > 0) { x /= z; y /= z; }\r
+    else x = y = -1;\r
+}\r
+\r
+inline\r
+void PaniniProjector::mapForward(float x, float y, float &u, float &v)\r
+{    \r
+       float x_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2];\r
+    float y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5];\r
+    float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8];\r
+\r
+    float u_ = atan2f(x_, z_);\r
+    float v_ = asinf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_));\r
+       \r
+       float tg = a * tanf(u_ / a);\r
+       u = scale * tg;\r
+       \r
+       float sinu = sinf(u_);\r
+       if ( fabs(sinu) < 1E-7 )\r
+               v = scale * b * tanf(v_);\r
+       else\r
+               v = scale * b * tg * tanf(v_) / sinu;\r
+}\r
+\r
+inline\r
+void PaniniProjector::mapBackward(float u, float v, float &x, float &y)\r
+{\r
+       u /= scale;\r
+    v /= scale;\r
+\r
+       float lamda = a * atanf(u / a);\r
+       float u_ = lamda;\r
+       \r
+       float v_;\r
+       if ( fabs(lamda) > 1E-7)\r
+               v_ = atanf(v * sinf(lamda) / (b * a * tanf(lamda / a)));\r
+       else \r
+               v_ = atanf(v / b);\r
+\r
+    float cosv = cosf(v_);\r
+    float x_ = cosv * sinf(u_);\r
+    float y_ = sinf(v_);\r
+    float z_ = cosv * cosf(u_);\r
+\r
+    float z;\r
+    x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_;\r
+    y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_;\r
+    z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_;\r
+\r
+    if (z > 0) { x /= z; y /= z; }\r
+    else x = y = -1;\r
+}\r
+\r
+inline\r
+void PaniniPortraitProjector::mapForward(float x, float y, float &u, float &v)\r
+{    \r
+       float y_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2];\r
+    float x_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5];\r
+    float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8];\r
+\r
+    float u_ = atan2f(x_, z_);\r
+    float v_ = asinf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_));\r
+       \r
+       float tg = a * tanf(u_ / a);\r
+       u = - scale * tg;\r
+       \r
+       float sinu = sinf( u_ );\r
+       if ( fabs(sinu) < 1E-7 )\r
+               v = scale * b * tanf(v_);\r
+       else\r
+               v = scale * b * tg * tanf(v_) / sinu;\r
+}\r
+\r
+inline\r
+void PaniniPortraitProjector::mapBackward(float u, float v, float &x, float &y)\r
+{\r
+       u /= - scale;\r
+    v /= scale;\r
+\r
+       float lamda = a * atanf(u / a);\r
+       float u_ = lamda;\r
+       \r
+       float v_;\r
+       if ( fabs(lamda) > 1E-7)\r
+               v_ = atanf(v * sinf(lamda) / (b * a * tanf(lamda/a)));\r
+       else \r
+               v_ = atanf(v / b);\r
+\r
+    float cosv = cosf(v_);\r
+    float y_ = cosv * sinf(u_);\r
+    float x_ = sinf(v_);\r
+    float z_ = cosv * cosf(u_);\r
+\r
+    float z;\r
+    x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_;\r
+    y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_;\r
+    z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_;\r
+\r
+    if (z > 0) { x /= z; y /= z; }\r
+    else x = y = -1;\r
+}\r
+\r
+inline\r
+void MercatorProjector::mapForward(float x, float y, float &u, float &v)\r
+{    \r
+       float x_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2];\r
+    float y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5];\r
+    float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8];\r
+\r
+    float u_ = atan2f(x_, z_);\r
+    float v_ = asinf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_));\r
+       \r
+       u = scale * u_;\r
+       v = scale * logf( tanf( CV_PI/4 + v_/2 ) );\r
+}\r
+\r
+inline\r
+void MercatorProjector::mapBackward(float u, float v, float &x, float &y)\r
+{\r
+       u /= scale;\r
+    v /= scale;\r
+\r
+       float v_ = atanf( sinhf(v) );\r
+       float u_ = u;\r
+\r
+    float cosv = cosf(v_);\r
+    float x_ = cosv * sinf(u_);\r
+    float y_ = sinf(v_);\r
+    float z_ = cosv * cosf(u_);\r
+\r
+    float z;\r
+    x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_;\r
+    y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_;\r
+    z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_;\r
+\r
+    if (z > 0) { x /= z; y /= z; }\r
+    else x = y = -1;\r
+}\r
+\r
+inline\r
+void TransverseMercatorProjector::mapForward(float x, float y, float &u, float &v)\r
+{    \r
+       float x_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2];\r
+    float y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5];\r
+    float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8];\r
+\r
+    float u_ = atan2f(x_, z_);\r
+    float v_ = asinf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_));\r
+       \r
+       float B = cosf(v_) * sinf(u_);\r
+       \r
+       u = scale / 2 * logf( (1+B) / (1-B) );\r
+       v = scale * atan2f(tanf(v_), cosf(u_));\r
+}\r
+\r
+inline\r
+void TransverseMercatorProjector::mapBackward(float u, float v, float &x, float &y)\r
+{\r
+       u /= scale;\r
+    v /= scale;\r
+\r
+       float v_ = asinf( sinf(v) / coshf(u) );\r
+       float u_ = atan2f( sinhf(u), cos(v) );\r
+\r
+    float cosv = cosf(v_);\r
+    float x_ = cosv * sinf(u_);\r
+    float y_ = sinf(v_);\r
+    float z_ = cosv * cosf(u_);\r
+\r
+    float z;\r
+    x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_;\r
+    y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_;\r
+    z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_;\r
+\r
+    if (z > 0) { x /= z; y /= z; }\r
+    else x = y = -1;\r
+}\r
+\r
+inline\r
 void SphericalPortraitProjector::mapForward(float x, float y, float &u0, float &v0)\r
 {    \r
     float x0_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2];\r
index a321c39..4c5cd59 100644 (file)
@@ -75,6 +75,75 @@ public:
     Ptr<detail::RotationWarper> create(float scale) const { return new detail::SphericalWarper(scale); }
 };
 
+class FisheyeWarper : public WarperCreator
+{
+public:
+    Ptr<detail::RotationWarper> create(float scale) const { return new detail::FisheyeWarper(scale); }
+};
+
+class StereographicWarper: public WarperCreator
+{
+public:
+    Ptr<detail::RotationWarper> create(float scale) const { return new detail::StereographicWarper(scale); }
+};
+
+class CompressedRectilinearWarper: public WarperCreator
+{
+       float a, b;
+public:
+       CompressedRectilinearWarper(float A = 1, float B = 1)
+       {
+               a = A; b = B;
+       }
+    Ptr<detail::RotationWarper> create(float scale) const { return new detail::CompressedRectilinearWarper(scale, a, b); }
+};
+
+class CompressedRectilinearPortraitWarper: public WarperCreator
+{
+       float a, b;
+public:
+       CompressedRectilinearPortraitWarper(float A = 1, float B = 1)
+       {
+               a = A; b = B;
+       }
+    Ptr<detail::RotationWarper> create(float scale) const { return new detail::CompressedRectilinearPortraitWarper(scale, a, b); }
+};
+
+class PaniniWarper: public WarperCreator
+{
+       float a, b;
+public:
+       PaniniWarper(float A = 1, float B = 1)
+       {
+               a = A; b = B;
+       }
+    Ptr<detail::RotationWarper> create(float scale) const { return new detail::PaniniWarper(scale, a, b); }
+};
+
+class PaniniPortraitWarper: public WarperCreator
+{
+       float a, b;
+public:
+       PaniniPortraitWarper(float A = 1, float B = 1)
+       {
+               a = A; b = B;
+       }
+    Ptr<detail::RotationWarper> create(float scale) const { return new detail::PaniniPortraitWarper(scale, a, b); }
+};
+
+class MercatorWarper: public WarperCreator
+{
+public:
+    Ptr<detail::RotationWarper> create(float scale) const { return new detail::MercatorWarper(scale); }
+};
+
+class TransverseMercatorWarper: public WarperCreator
+{
+public:
+    Ptr<detail::RotationWarper> create(float scale) const { return new detail::TransverseMercatorWarper(scale); }
+};
+
+
 
 #ifdef HAVE_OPENCV_GPU
 class PlaneWarperGpu: public WarperCreator
index c2f9439..609cd48 100644 (file)
@@ -98,7 +98,7 @@ void printUsage()
         "      Labels description: Nm is number of matches, Ni is number of inliers,\n"
         "      C is confidence.\n"
         "\nCompositing Flags:\n"
-        "  --warp (plane|cylindrical|spherical)\n"
+        "  --warp (plane|cylindrical|spherical|fisheye|stereographic|compressedPlaneA2B1|compressedPlaneA1.5B1|compressedPlanePortraitA2B1|compressedPlanePortraitA1.5B1|paniniA2B1|paniniA1.5B1|paniniPortraitA2B1|paniniPortraitA1.5B1|mercator|transverseMercator)\n"
         "      Warp surface type. The default is 'spherical'.\n"
         "  --seam_megapix <float>\n"
         "      Resolution for seam estimation step. The default is 0.1 Mpx.\n"
@@ -544,6 +544,18 @@ int main(int argc, char* argv[])
         if (warp_type == "plane") warper_creator = new cv::PlaneWarper();
         else if (warp_type == "cylindrical") warper_creator = new cv::CylindricalWarper();
         else if (warp_type == "spherical") warper_creator = new cv::SphericalWarper();
+               else if (warp_type == "fisheye") warper_creator = new cv::FisheyeWarper();
+               else if (warp_type == "stereographic") warper_creator = new cv::StereographicWarper();
+               else if (warp_type == "compressedPlaneA2B1") warper_creator = new cv::CompressedRectilinearWarper(2, 1);
+               else if (warp_type == "compressedPlaneA1.5B1") warper_creator = new cv::CompressedRectilinearWarper(1.5, 1);
+               else if (warp_type == "compressedPlanePortraitA2B1") warper_creator = new cv::CompressedRectilinearPortraitWarper(2, 1);
+               else if (warp_type == "compressedPlanePortraitA1.5B1") warper_creator = new cv::CompressedRectilinearPortraitWarper(1.5, 1);
+               else if (warp_type == "paniniA2B1") warper_creator = new cv::PaniniWarper(2, 1);
+               else if (warp_type == "paniniA1.5B1") warper_creator = new cv::PaniniWarper(1.5, 1);
+               else if (warp_type == "paniniPortraitA2B1") warper_creator = new cv::PaniniPortraitWarper(2, 1);
+               else if (warp_type == "paniniPortraitA1.5B1") warper_creator = new cv::PaniniPortraitWarper(1.5, 1);
+               else if (warp_type == "mercator") warper_creator = new cv::MercatorWarper();
+               else if (warp_type == "transverseMercator") warper_creator = new cv::TransverseMercatorWarper();
     }
 
     if (warper_creator.empty())