};\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
}\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