43 #ifndef __OPENCV_STITCHING_WARPERS_INL_HPP__
44 #define __OPENCV_STITCHING_WARPERS_INL_HPP__
47 #include "warpers.hpp"
55 projector_.setCameraParams(K, R);
57 projector_.mapForward(pt.
x, pt.
y, uv.
x, uv.
y);
65 projector_.setCameraParams(K, R);
68 detectResultRoi(src_size, dst_tl, dst_br);
70 xmap.
create(dst_br.
y - dst_tl.
y + 1, dst_br.
x - dst_tl.
x + 1, CV_32F);
71 ymap.
create(dst_br.
y - dst_tl.
y + 1, dst_br.
x - dst_tl.
x + 1, CV_32F);
74 for (
int v = dst_tl.
y;
v <= dst_br.
y; ++
v)
76 for (
int u = dst_tl.
x; u <= dst_br.
x; ++u)
78 projector_.mapBackward(static_cast<float>(u), static_cast<float>(
v), x, y);
79 xmap.
at<
float>(
v - dst_tl.
y, u - dst_tl.
x) = x;
80 ymap.
at<
float>(
v - dst_tl.
y, u - dst_tl.
x) = y;
84 return Rect(dst_tl, dst_br);
93 Rect dst_roi = buildMaps(src.
size(), K,
R, xmap, ymap);
96 remap(src, dst, xmap, ymap, interp_mode, border_mode);
106 projector_.setCameraParams(K, R);
108 Point src_tl, src_br;
109 detectResultRoi(dst_size, src_tl, src_br);
110 CV_Assert(src_br.
x - src_tl.
x + 1 == src.
cols && src_br.
y - src_tl.
y + 1 == src.
rows);
112 Mat xmap(dst_size, CV_32F);
113 Mat ymap(dst_size, CV_32F);
116 for (
int y = 0;
y < dst_size.
height; ++
y)
118 for (
int x = 0;
x < dst_size.
width; ++
x)
120 projector_.mapForward(static_cast<float>(
x), static_cast<float>(
y), u, v);
121 xmap.
at<
float>(
y,
x) = u - src_tl.
x;
122 ymap.
at<
float>(y,
x) = v - src_tl.
y;
127 remap(src, dst, xmap, ymap, interp_mode, border_mode);
134 projector_.setCameraParams(K, R);
136 Point dst_tl, dst_br;
137 detectResultRoi(src_size, dst_tl, dst_br);
139 return Rect(dst_tl,
Point(dst_br.
x + 1, dst_br.
y + 1));
146 float tl_uf = std::numeric_limits<float>::max();
147 float tl_vf = std::numeric_limits<float>::max();
148 float br_uf = -std::numeric_limits<float>::max();
149 float br_vf = -std::numeric_limits<float>::max();
152 for (
int y = 0;
y < src_size.
height; ++
y)
154 for (
int x = 0;
x < src_size.
width; ++
x)
156 projector_.mapForward(static_cast<float>(
x), static_cast<float>(
y), u, v);
158 br_uf = std::max(br_uf, u); br_vf = std::max(br_vf, v);
162 dst_tl.
x =
static_cast<int>(tl_uf);
163 dst_tl.
y =
static_cast<int>(tl_vf);
164 dst_br.
x =
static_cast<int>(br_uf);
165 dst_br.
y =
static_cast<int>(br_vf);
172 float tl_uf = std::numeric_limits<float>::max();
173 float tl_vf = std::numeric_limits<float>::max();
174 float br_uf = -std::numeric_limits<float>::max();
175 float br_vf = -std::numeric_limits<float>::max();
178 for (
float x = 0;
x < src_size.
width; ++
x)
180 projector_.mapForward(static_cast<float>(
x), 0, u, v);
182 br_uf = std::max(br_uf, u); br_vf = std::max(br_vf, v);
184 projector_.mapForward(static_cast<float>(
x), static_cast<float>(src_size.
height - 1), u, v);
186 br_uf = std::max(br_uf, u); br_vf = std::max(br_vf, v);
188 for (
int y = 0;
y < src_size.
height; ++
y)
190 projector_.mapForward(0, static_cast<float>(
y), u, v);
192 br_uf = std::max(br_uf, u); br_vf = std::max(br_vf, v);
194 projector_.mapForward(static_cast<float>(src_size.
width - 1), static_cast<float>(
y), u, v);
196 br_uf = std::max(br_uf, u); br_vf = std::max(br_vf, v);
199 dst_tl.
x =
static_cast<int>(tl_uf);
200 dst_tl.
y =
static_cast<int>(tl_vf);
201 dst_br.
x =
static_cast<int>(br_uf);
202 dst_br.
y =
static_cast<int>(br_vf);
210 float y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5];
211 float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8];
213 x_ =
t[0] + x_ / z_ * (1 -
t[2]);
214 y_ =
t[1] + y_ / z_ * (1 -
t[2]);
225 v = v /
scale - t[1];
241 float y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5];
242 float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8];
244 u =
scale * atan2f(x_, z_);
245 float w = y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_);
246 v =
scale * (
static_cast<float>(CV_PI) - acosf(w == w ? w : 0));
256 float sinv = sinf(static_cast<float>(CV_PI) - v);
257 float x_ = sinv * sinf(u);
258 float y_ = cosf(static_cast<float>(CV_PI) - v);
259 float z_ = sinv * cosf(u);
266 if (z > 0) { x /= z; y /= z; }
275 float y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5];
276 float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8];
278 u =
scale * atan2f(x_, z_);
279 v =
scale * y_ / sqrtf(x_ * x_ + z_ * z_);
298 if (z > 0) { x /= z; y /= z; }
306 float y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5];
307 float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8];
309 float u_ = atan2f(x_, z_);
310 float v_ = (
float)CV_PI - acosf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_));
312 u =
scale * v_ * cosf(u_);
313 v =
scale * v_ * sinf(u_);
322 float u_ = atan2f(v, u);
323 float v_ = sqrtf(u*u + v*v);
325 float sinv = sinf((
float)CV_PI - v_);
326 float x_ = sinv * sinf(u_);
327 float y_ = cosf((
float)CV_PI - v_);
328 float z_ = sinv * cosf(u_);
335 if (z > 0) { x /= z; y /= z; }
343 float y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5];
344 float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8];
346 float u_ = atan2f(x_, z_);
347 float v_ = (
float)CV_PI - acosf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_));
349 float r = sinf(v_) / (1 - cosf(v_));
351 u =
scale * r * cos(u_);
352 v =
scale * r * sin(u_);
361 float u_ = atan2f(v, u);
362 float r = sqrtf(u*u + v*v);
363 float v_ = 2 * atanf(1.
f / r);
365 float sinv = sinf((
float)CV_PI - v_);
366 float x_ = sinv * sinf(u_);
367 float y_ = cosf((
float)CV_PI - v_);
368 float z_ = sinv * cosf(u_);
375 if (z > 0) { x /= z; y /= z; }
383 float y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5];
384 float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8];
386 float u_ = atan2f(x_, z_);
387 float v_ = asinf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_));
390 v =
scale *
b * tanf(v_) / cosf(u_);
399 float aatg =
a * atanf(u /
a);
401 float v_ = atanf(v * cosf(aatg) /
b);
403 float cosv = cosf(v_);
404 float x_ = cosv * sinf(u_);
406 float z_ = cosv * cosf(u_);
413 if (z > 0) { x /= z; y /= z; }
421 float x_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5];
422 float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8];
424 float u_ = atan2f(x_, z_);
425 float v_ = asinf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_));
427 u = -
scale *
a * tanf(u_ /
a);
428 v =
scale *
b * tanf(v_) / cosf(u_);
437 float aatg =
a * atanf(u /
a);
439 float v_ = atanf(v * cosf( aatg ) /
b);
441 float cosv = cosf(v_);
442 float y_ = cosv * sinf(u_);
444 float z_ = cosv * cosf(u_);
451 if (z > 0) { x /= z; y /= z; }
459 float y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5];
460 float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8];
462 float u_ = atan2f(x_, z_);
463 float v_ = asinf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_));
465 float tg =
a * tanf(u_ /
a);
468 float sinu = sinf(u_);
469 if ( fabs(sinu) < 1E-7 )
472 v =
scale *
b * tg * tanf(v_) / sinu;
481 float lamda =
a * atanf(u /
a);
485 if ( fabs(lamda) > 1E-7)
486 v_ = atanf(v * sinf(lamda) / (
b *
a * tanf(lamda /
a)));
490 float cosv = cosf(v_);
491 float x_ = cosv * sinf(u_);
493 float z_ = cosv * cosf(u_);
500 if (z > 0) { x /= z; y /= z; }
508 float x_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5];
509 float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8];
511 float u_ = atan2f(x_, z_);
512 float v_ = asinf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_));
514 float tg =
a * tanf(u_ /
a);
517 float sinu = sinf( u_ );
518 if ( fabs(sinu) < 1E-7 )
521 v =
scale *
b * tg * tanf(v_) / sinu;
530 float lamda =
a * atanf(u /
a);
534 if ( fabs(lamda) > 1E-7)
535 v_ = atanf(v * sinf(lamda) / (
b *
a * tanf(lamda/
a)));
539 float cosv = cosf(v_);
540 float y_ = cosv * sinf(u_);
542 float z_ = cosv * cosf(u_);
549 if (z > 0) { x /= z; y /= z; }
557 float y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5];
558 float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8];
560 float u_ = atan2f(x_, z_);
561 float v_ = asinf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_));
564 v =
scale * logf( tanf( (
float)(CV_PI/4) + v_/2 ) );
573 float v_ = atanf( sinhf(v) );
576 float cosv = cosf(v_);
577 float x_ = cosv * sinf(u_);
579 float z_ = cosv * cosf(u_);
586 if (z > 0) { x /= z; y /= z; }
594 float y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5];
595 float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8];
597 float u_ = atan2f(x_, z_);
598 float v_ = asinf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_));
600 float B = cosf(v_) * sinf(u_);
602 u =
scale / 2 * logf( (1+B) / (1-B) );
603 v =
scale * atan2f(tanf(v_), cosf(u_));
612 float v_ = asinf( sinf(v) / coshf(u) );
613 float u_ = atan2f( sinhf(u), cos(v) );
615 float cosv = cosf(v_);
616 float x_ = cosv * sinf(u_);
618 float z_ = cosv * cosf(u_);
625 if (z > 0) { x /= z; y /= z; }
633 float y0_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5];
634 float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8];
640 u =
scale * atan2f(x_, z_);
641 v =
scale * (
static_cast<float>(CV_PI) - acosf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_)));
658 float sinv = sinf(static_cast<float>(CV_PI) - v);
659 float x0_ = sinv * sinf(u);
660 float y0_ = cosf(static_cast<float>(CV_PI) - v);
661 float z_ = sinv * cosf(u);
671 if (z > 0) { x /= z; y /= z; }
679 float y0_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5];
680 float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8];
686 u =
scale * atan2f(x_, z_);
687 v =
scale * y_ / sqrtf(x_ * x_ + z_ * z_);
716 if (z > 0) { x /= z; y /= z; }
724 float y0_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5];
725 float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8];
730 x_ =
t[0] + x_ / z_ * (1 -
t[2]);
731 y_ =
t[1] + y_ / z_ * (1 -
t[2]);
750 v = v /
scale - t[1];
765 #endif // __OPENCV_STITCHING_WARPERS_INL_HPP__
GLdouble GLdouble GLdouble r
void mapForward(float x, float y, float &u, float &v)
Definition: warpers_inl.hpp:721
void mapBackward(float u, float v, float &x, float &y)
Definition: warpers_inl.hpp:394
Point2i Point
Definition: core.hpp:893
int rows
the number of rows and columns or (-1, -1) when the matrix has more than 2 dimensions ...
Definition: core.hpp:1962
CvPoint2D32f pt[4]
Definition: imgproc_c.h:410
GLenum GLint GLint y
Definition: core_c.h:613
Point_< _Tp > tl() const
the top-left corner
Definition: operations.hpp:1913
Point warp(const Mat &src, const Mat &K, const Mat &R, int interp_mode, int border_mode, Mat &dst)
Definition: warpers_inl.hpp:89
void mapForward(float x, float y, float &u, float &v)
Definition: warpers_inl.hpp:238
void mapForward(float x, float y, float &u, float &v)
Definition: warpers_inl.hpp:676
GLuint src
Definition: core_c.h:1650
_Tp x
Definition: core.hpp:766
void mapForward(float x, float y, float &u, float &v)
Definition: warpers_inl.hpp:505
void mapBackward(float u, float v, float &x, float &y)
Definition: warpers_inl.hpp:649
void mapBackward(float u, float v, float &x, float &y)
Definition: warpers_inl.hpp:568
void mapForward(float x, float y, float &u, float &v)
Definition: warpers_inl.hpp:380
float r_kinv[9]
Definition: warpers.hpp:84
_Tp height
Definition: core.hpp:883
void mapBackward(float u, float v, float &x, float &y)
Definition: warpers_inl.hpp:284
void mapForward(float x, float y, float &u, float &v)
Definition: warpers_inl.hpp:456
The 2D size class.
Definition: core.hpp:81
int cols
Definition: core.hpp:1962
int type() const
returns element type, similar to CV_MAT_TYPE(cvmat->type)
Definition: mat.hpp:399
void mapBackward(float u, float v, float &x, float &y)
Definition: warpers_inl.hpp:222
CV_EXPORTS_W void remap(InputArray src, OutputArray dst, InputArray map1, InputArray map2, int interpolation, int borderMode=BORDER_CONSTANT, const Scalar &borderValue=Scalar())
warps the image using the precomputed maps. The maps are stored in either floating-point or integer f...
Rect warpRoi(Size src_size, const Mat &K, const Mat &R)
Definition: warpers_inl.hpp:132
void mapForward(float x, float y, float &u, float &v)
Definition: warpers_inl.hpp:591
void mapBackward(float u, float v, float &x, float &y)
Definition: warpers_inl.hpp:476
void mapBackward(float u, float v, float &x, float &y)
Definition: warpers_inl.hpp:743
const CvMat const CvMat const CvMat CvMat CvMat CvMat CvMat CvSize CvMat * R
Definition: calib3d.hpp:270
CV_EXPORTS_W void min(InputArray src1, InputArray src2, OutputArray dst)
computes per-element minimum of two arrays (dst = min(src1, src2))
GLenum GLint x
Definition: core_c.h:632
void mapBackward(float u, float v, float &x, float &y)
Definition: warpers_inl.hpp:525
void mapForward(float x, float y, float &u, float &v)
Definition: warpers_inl.hpp:630
void mapBackward(float u, float v, float &x, float &y)
Definition: warpers_inl.hpp:432
GLboolean GLboolean GLboolean b
Definition: legacy.hpp:633
The n-dimensional matrix class.
Definition: core.hpp:1688
void detectResultRoiByBorder(Size src_size, Point &dst_tl, Point &dst_br)
Definition: warpers_inl.hpp:170
void mapForward(float x, float y, float &u, float &v)
Definition: warpers_inl.hpp:272
int int y
Definition: highgui_c.h:186
virtual void detectResultRoi(Size src_size, Point &dst_tl, Point &dst_br)
Definition: warpers_inl.hpp:144
void mapForward(float x, float y, float &u, float &v)
Definition: warpers_inl.hpp:554
void mapForward(float x, float y, float &u, float &v)
Definition: warpers_inl.hpp:207
void mapBackward(float u, float v, float &x, float &y)
Definition: warpers_inl.hpp:317
void mapForward(float x, float y, float &u, float &v)
Definition: warpers_inl.hpp:303
_Tp width
Definition: core.hpp:840
GLboolean GLboolean GLboolean GLboolean a
Definition: legacy.hpp:633
void warpBackward(const Mat &src, const Mat &K, const Mat &R, int interp_mode, int border_mode, Size dst_size, Mat &dst)
Definition: warpers_inl.hpp:103
void create(int rows, int cols, int type)
allocates new matrix data unless the matrix already has specified size and type.
Definition: mat.hpp:347
_Tp y
Definition: core.hpp:766
Rect buildMaps(Size src_size, const Mat &K, const Mat &R, Mat &xmap, Mat &ymap)
Definition: warpers_inl.hpp:63
GLuint dst
Definition: calib3d.hpp:134
::max::max::max float
Definition: functional.hpp:326
void mapForward(float x, float y, float &u, float &v)
Definition: warpers_inl.hpp:418
void mapBackward(float u, float v, float &x, float &y)
Definition: warpers_inl.hpp:695
float scale
Definition: warpers.hpp:81
GLubyte GLubyte GLubyte GLubyte w
int x
Definition: highgui_c.h:186
const CvMat * B
Definition: calib3d.hpp:161
float k_rinv[9]
Definition: warpers.hpp:85
void mapBackward(float u, float v, float &x, float &y)
Definition: warpers_inl.hpp:607
_Tp height
Definition: core.hpp:840
MSize size
Definition: core.hpp:2006
GLenum GLenum GLenum GLenum GLenum scale
Point2f warpPoint(const Point2f &pt, const Mat &K, const Mat &R)
Definition: warpers_inl.hpp:53
void mapForward(float x, float y, float &u, float &v)
Definition: warpers_inl.hpp:340
void mapBackward(float u, float v, float &x, float &y)
Definition: warpers_inl.hpp:356
_Tp & at(int i0=0)
the same as above, with the pointer dereferencing
Definition: mat.hpp:565
void mapBackward(float u, float v, float &x, float &y)
Definition: warpers_inl.hpp:251
Rect_< int > Rect
Definition: core.hpp:897
_Tp width
Definition: core.hpp:883