|
|
|
@ -298,6 +298,333 @@ void CylindricalProjector::mapBackward(float u, float v, float &x, float &y) |
|
|
|
|
else x = y = -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline |
|
|
|
|
void FisheyeProjector::mapForward(float x, float y, float &u, float &v) |
|
|
|
|
{ |
|
|
|
|
float x_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2]; |
|
|
|
|
float y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5]; |
|
|
|
|
float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8]; |
|
|
|
|
|
|
|
|
|
float u_ = atan2f(x_, z_); |
|
|
|
|
float v_ = CV_PI - acosf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_)); |
|
|
|
|
|
|
|
|
|
u = scale * v_ * cosf(u_); |
|
|
|
|
v = scale * v_ * sinf(u_); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline |
|
|
|
|
void FisheyeProjector::mapBackward(float u, float v, float &x, float &y) |
|
|
|
|
{ |
|
|
|
|
u /= scale; |
|
|
|
|
v /= scale; |
|
|
|
|
|
|
|
|
|
float u_ = atan2f(v, u); |
|
|
|
|
float v_ = sqrtf(u*u + v*v); |
|
|
|
|
|
|
|
|
|
float sinv = sinf(CV_PI - v_); |
|
|
|
|
float x_ = sinv * sinf(u_); |
|
|
|
|
float y_ = cosf(CV_PI - v_); |
|
|
|
|
float z_ = sinv * cosf(u_); |
|
|
|
|
|
|
|
|
|
float z; |
|
|
|
|
x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_; |
|
|
|
|
y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_; |
|
|
|
|
z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_; |
|
|
|
|
|
|
|
|
|
if (z > 0) { x /= z; y /= z; } |
|
|
|
|
else x = y = -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline |
|
|
|
|
void StereographicProjector::mapForward(float x, float y, float &u, float &v) |
|
|
|
|
{ |
|
|
|
|
float x_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2]; |
|
|
|
|
float y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5]; |
|
|
|
|
float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8]; |
|
|
|
|
|
|
|
|
|
float u_ = atan2f(x_, z_); |
|
|
|
|
float v_ = CV_PI - acosf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_)); |
|
|
|
|
|
|
|
|
|
float r = sinf(v_) / (1 - cosf(v_)); |
|
|
|
|
|
|
|
|
|
u = scale * r * cos(u_); |
|
|
|
|
v = scale * r * sin(u_); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline |
|
|
|
|
void StereographicProjector::mapBackward(float u, float v, float &x, float &y) |
|
|
|
|
{ |
|
|
|
|
u /= scale; |
|
|
|
|
v /= scale; |
|
|
|
|
|
|
|
|
|
float u_ = atan2f(v, u); |
|
|
|
|
float r = sqrtf(u*u + v*v); |
|
|
|
|
float v_ = 2 * atanf(1.0 / r); |
|
|
|
|
|
|
|
|
|
float sinv = sinf(CV_PI - v_); |
|
|
|
|
float x_ = sinv * sinf(u_); |
|
|
|
|
float y_ = cosf(CV_PI - v_); |
|
|
|
|
float z_ = sinv * cosf(u_); |
|
|
|
|
|
|
|
|
|
float z; |
|
|
|
|
x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_; |
|
|
|
|
y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_; |
|
|
|
|
z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_; |
|
|
|
|
|
|
|
|
|
if (z > 0) { x /= z; y /= z; } |
|
|
|
|
else x = y = -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline |
|
|
|
|
void CompressedRectilinearProjector::mapForward(float x, float y, float &u, float &v) |
|
|
|
|
{
|
|
|
|
|
float x_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2]; |
|
|
|
|
float y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5]; |
|
|
|
|
float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8]; |
|
|
|
|
|
|
|
|
|
float u_ = atan2f(x_, z_); |
|
|
|
|
float v_ = asinf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_)); |
|
|
|
|
|
|
|
|
|
u = scale * a * tanf(u_ / a); |
|
|
|
|
v = scale * b * tanf(v_) / cosf(u_); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline |
|
|
|
|
void CompressedRectilinearProjector::mapBackward(float u, float v, float &x, float &y) |
|
|
|
|
{ |
|
|
|
|
u /= scale; |
|
|
|
|
v /= scale; |
|
|
|
|
|
|
|
|
|
float aatg = a * atanf(u / a); |
|
|
|
|
float u_ = aatg; |
|
|
|
|
float v_ = atanf(v * cosf(aatg) / b); |
|
|
|
|
|
|
|
|
|
float cosv = cosf(v_); |
|
|
|
|
float x_ = cosv * sinf(u_); |
|
|
|
|
float y_ = sinf(v_); |
|
|
|
|
float z_ = cosv * cosf(u_); |
|
|
|
|
|
|
|
|
|
float z; |
|
|
|
|
x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_; |
|
|
|
|
y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_; |
|
|
|
|
z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_; |
|
|
|
|
|
|
|
|
|
if (z > 0) { x /= z; y /= z; } |
|
|
|
|
else x = y = -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline |
|
|
|
|
void CompressedRectilinearPortraitProjector::mapForward(float x, float y, float &u, float &v) |
|
|
|
|
{
|
|
|
|
|
float y_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2]; |
|
|
|
|
float x_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5]; |
|
|
|
|
float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8]; |
|
|
|
|
|
|
|
|
|
float u_ = atan2f(x_, z_); |
|
|
|
|
float v_ = asinf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_)); |
|
|
|
|
|
|
|
|
|
u = - scale * a * tanf(u_ / a); |
|
|
|
|
v = scale * b * tanf(v_) / cosf(u_); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline |
|
|
|
|
void CompressedRectilinearPortraitProjector::mapBackward(float u, float v, float &x, float &y) |
|
|
|
|
{ |
|
|
|
|
u /= - scale; |
|
|
|
|
v /= scale; |
|
|
|
|
|
|
|
|
|
float aatg = a * atanf(u / a); |
|
|
|
|
float u_ = aatg; |
|
|
|
|
float v_ = atanf(v * cosf( aatg ) / b); |
|
|
|
|
|
|
|
|
|
float cosv = cosf(v_); |
|
|
|
|
float y_ = cosv * sinf(u_); |
|
|
|
|
float x_ = sinf(v_); |
|
|
|
|
float z_ = cosv * cosf(u_); |
|
|
|
|
|
|
|
|
|
float z; |
|
|
|
|
x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_; |
|
|
|
|
y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_; |
|
|
|
|
z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_; |
|
|
|
|
|
|
|
|
|
if (z > 0) { x /= z; y /= z; } |
|
|
|
|
else x = y = -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline |
|
|
|
|
void PaniniProjector::mapForward(float x, float y, float &u, float &v) |
|
|
|
|
{
|
|
|
|
|
float x_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2]; |
|
|
|
|
float y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5]; |
|
|
|
|
float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8]; |
|
|
|
|
|
|
|
|
|
float u_ = atan2f(x_, z_); |
|
|
|
|
float v_ = asinf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_)); |
|
|
|
|
|
|
|
|
|
float tg = a * tanf(u_ / a); |
|
|
|
|
u = scale * tg; |
|
|
|
|
|
|
|
|
|
float sinu = sinf(u_); |
|
|
|
|
if ( fabs(sinu) < 1E-7 ) |
|
|
|
|
v = scale * b * tanf(v_); |
|
|
|
|
else |
|
|
|
|
v = scale * b * tg * tanf(v_) / sinu; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline |
|
|
|
|
void PaniniProjector::mapBackward(float u, float v, float &x, float &y) |
|
|
|
|
{ |
|
|
|
|
u /= scale; |
|
|
|
|
v /= scale; |
|
|
|
|
|
|
|
|
|
float lamda = a * atanf(u / a); |
|
|
|
|
float u_ = lamda; |
|
|
|
|
|
|
|
|
|
float v_; |
|
|
|
|
if ( fabs(lamda) > 1E-7) |
|
|
|
|
v_ = atanf(v * sinf(lamda) / (b * a * tanf(lamda / a))); |
|
|
|
|
else
|
|
|
|
|
v_ = atanf(v / b); |
|
|
|
|
|
|
|
|
|
float cosv = cosf(v_); |
|
|
|
|
float x_ = cosv * sinf(u_); |
|
|
|
|
float y_ = sinf(v_); |
|
|
|
|
float z_ = cosv * cosf(u_); |
|
|
|
|
|
|
|
|
|
float z; |
|
|
|
|
x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_; |
|
|
|
|
y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_; |
|
|
|
|
z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_; |
|
|
|
|
|
|
|
|
|
if (z > 0) { x /= z; y /= z; } |
|
|
|
|
else x = y = -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline |
|
|
|
|
void PaniniPortraitProjector::mapForward(float x, float y, float &u, float &v) |
|
|
|
|
{
|
|
|
|
|
float y_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2]; |
|
|
|
|
float x_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5]; |
|
|
|
|
float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8]; |
|
|
|
|
|
|
|
|
|
float u_ = atan2f(x_, z_); |
|
|
|
|
float v_ = asinf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_)); |
|
|
|
|
|
|
|
|
|
float tg = a * tanf(u_ / a); |
|
|
|
|
u = - scale * tg; |
|
|
|
|
|
|
|
|
|
float sinu = sinf( u_ ); |
|
|
|
|
if ( fabs(sinu) < 1E-7 ) |
|
|
|
|
v = scale * b * tanf(v_); |
|
|
|
|
else |
|
|
|
|
v = scale * b * tg * tanf(v_) / sinu; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline |
|
|
|
|
void PaniniPortraitProjector::mapBackward(float u, float v, float &x, float &y) |
|
|
|
|
{ |
|
|
|
|
u /= - scale; |
|
|
|
|
v /= scale; |
|
|
|
|
|
|
|
|
|
float lamda = a * atanf(u / a); |
|
|
|
|
float u_ = lamda; |
|
|
|
|
|
|
|
|
|
float v_; |
|
|
|
|
if ( fabs(lamda) > 1E-7) |
|
|
|
|
v_ = atanf(v * sinf(lamda) / (b * a * tanf(lamda/a))); |
|
|
|
|
else
|
|
|
|
|
v_ = atanf(v / b); |
|
|
|
|
|
|
|
|
|
float cosv = cosf(v_); |
|
|
|
|
float y_ = cosv * sinf(u_); |
|
|
|
|
float x_ = sinf(v_); |
|
|
|
|
float z_ = cosv * cosf(u_); |
|
|
|
|
|
|
|
|
|
float z; |
|
|
|
|
x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_; |
|
|
|
|
y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_; |
|
|
|
|
z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_; |
|
|
|
|
|
|
|
|
|
if (z > 0) { x /= z; y /= z; } |
|
|
|
|
else x = y = -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline |
|
|
|
|
void MercatorProjector::mapForward(float x, float y, float &u, float &v) |
|
|
|
|
{
|
|
|
|
|
float x_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2]; |
|
|
|
|
float y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5]; |
|
|
|
|
float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8]; |
|
|
|
|
|
|
|
|
|
float u_ = atan2f(x_, z_); |
|
|
|
|
float v_ = asinf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_)); |
|
|
|
|
|
|
|
|
|
u = scale * u_; |
|
|
|
|
v = scale * logf( tanf( CV_PI/4 + v_/2 ) ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline |
|
|
|
|
void MercatorProjector::mapBackward(float u, float v, float &x, float &y) |
|
|
|
|
{ |
|
|
|
|
u /= scale; |
|
|
|
|
v /= scale; |
|
|
|
|
|
|
|
|
|
float v_ = atanf( sinhf(v) ); |
|
|
|
|
float u_ = u; |
|
|
|
|
|
|
|
|
|
float cosv = cosf(v_); |
|
|
|
|
float x_ = cosv * sinf(u_); |
|
|
|
|
float y_ = sinf(v_); |
|
|
|
|
float z_ = cosv * cosf(u_); |
|
|
|
|
|
|
|
|
|
float z; |
|
|
|
|
x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_; |
|
|
|
|
y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_; |
|
|
|
|
z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_; |
|
|
|
|
|
|
|
|
|
if (z > 0) { x /= z; y /= z; } |
|
|
|
|
else x = y = -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline |
|
|
|
|
void TransverseMercatorProjector::mapForward(float x, float y, float &u, float &v) |
|
|
|
|
{
|
|
|
|
|
float x_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2]; |
|
|
|
|
float y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5]; |
|
|
|
|
float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8]; |
|
|
|
|
|
|
|
|
|
float u_ = atan2f(x_, z_); |
|
|
|
|
float v_ = asinf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_)); |
|
|
|
|
|
|
|
|
|
float B = cosf(v_) * sinf(u_); |
|
|
|
|
|
|
|
|
|
u = scale / 2 * logf( (1+B) / (1-B) ); |
|
|
|
|
v = scale * atan2f(tanf(v_), cosf(u_)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline |
|
|
|
|
void TransverseMercatorProjector::mapBackward(float u, float v, float &x, float &y) |
|
|
|
|
{ |
|
|
|
|
u /= scale; |
|
|
|
|
v /= scale; |
|
|
|
|
|
|
|
|
|
float v_ = asinf( sinf(v) / coshf(u) ); |
|
|
|
|
float u_ = atan2f( sinhf(u), cos(v) ); |
|
|
|
|
|
|
|
|
|
float cosv = cosf(v_); |
|
|
|
|
float x_ = cosv * sinf(u_); |
|
|
|
|
float y_ = sinf(v_); |
|
|
|
|
float z_ = cosv * cosf(u_); |
|
|
|
|
|
|
|
|
|
float z; |
|
|
|
|
x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_; |
|
|
|
|
y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_; |
|
|
|
|
z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_; |
|
|
|
|
|
|
|
|
|
if (z > 0) { x /= z; y /= z; } |
|
|
|
|
else x = y = -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline |
|
|
|
|
void SphericalPortraitProjector::mapForward(float x, float y, float &u0, float &v0) |
|
|
|
|
{
|
|
|
|
|