43
#ifndef OPENCV_STITCHING_WARPERS_INL_HPP
44
#define OPENCV_STITCHING_WARPERS_INL_HPP
46
#include "opencv2/core.hpp"
47
#include "warpers.hpp"
58
projector_.setCameraParams(K, R);
60
projector_.mapForward(pt.x, pt.y, uv.x, uv.y);
67
projector_.setCameraParams(K, R);
69
projector_.mapBackward(pt.x, pt.y, xy.x, xy.y);
76
projector_.setCameraParams(K, R);
79
detectResultRoi(src_size, dst_tl, dst_br);
81
_xmap.create(dst_br.y - dst_tl.y + 1, dst_br.x - dst_tl.x + 1, CV_32F);
82
_ymap.create(dst_br.y - dst_tl.y + 1, dst_br.x - dst_tl.x + 1, CV_32F);
84
Mat xmap = _xmap.getMat(), ymap = _ymap.getMat();
87
for
(
int
v = dst_tl.y; v <= dst_br.y; ++v)
89
for
(
int
u = dst_tl.x; u <= dst_br.x; ++u)
91
projector_.mapBackward(
static_cast<
float
>(u),
static_cast<
float
>(v), x, y);
92
xmap.at<
float>(v - dst_tl.y, u - dst_tl.x) = x;
93
ymap.at<
float>(v - dst_tl.y, u - dst_tl.x) = y;
97
return
Rect(dst_tl, dst_br);
102Point RotationWarperBase<P>::warp(InputArray src, InputArray K, InputArray R,
int
interp_mode,
int
border_mode,
106
Rect dst_roi = buildMaps(src.size(), K, R, xmap, ymap);
108
dst.create(dst_roi.height + 1, dst_roi.width + 1, src.type());
109
remap(src, dst, xmap, ymap, interp_mode, border_mode);
116
void
RotationWarperBase<P>::warpBackward(InputArray src, InputArray K, InputArray R,
int
interp_mode,
int
border_mode,
117
Size dst_size, OutputArray dst)
119
projector_.setCameraParams(K, R);
121
Point src_tl, src_br;
122
detectResultRoi(dst_size, src_tl, src_br);
124
Size size = src.size();
125
CV_Assert(src_br.x - src_tl.x + 1 == size.width && src_br.y - src_tl.y + 1 == size.height);
127
Mat xmap(dst_size, CV_32F);
128
Mat ymap(dst_size, CV_32F);
131
for
(
int
y = 0; y < dst_size.height; ++y)
133
for
(
int
x = 0; x < dst_size.width; ++x)
135
projector_.mapForward(
static_cast<
float
>(x),
static_cast<
float
>(y), u, v);
136
xmap.at<
float>(y, x) = u - src_tl.x;
137
ymap.at<
float>(y, x) = v - src_tl.y;
141
dst.create(dst_size, src.type());
142
remap(src, dst, xmap, ymap, interp_mode, border_mode);
149
projector_.setCameraParams(K, R);
151
Point dst_tl, dst_br;
152
detectResultRoi(src_size, dst_tl, dst_br);
154
return
Rect(dst_tl, Point(dst_br.x + 1, dst_br.y + 1));
159
void
RotationWarperBase<P>::detectResultRoi(Size src_size, Point &dst_tl, Point &dst_br)
167
for
(
int
y = 0; y < src_size.height; ++y)
169
for
(
int
x = 0; x < src_size.width; ++x)
171
projector_.mapForward(
static_cast<
float
>(x),
static_cast<
float
>(y), u, v);
177
dst_tl.x =
static_cast<
int
>(tl_uf);
178
dst_tl.y =
static_cast<
int
>(tl_vf);
179
dst_br.x =
static_cast<
int
>(br_uf);
180
dst_br.y =
static_cast<
int
>(br_vf);
185
void
RotationWarperBase<P>::detectResultRoiByBorder(Size src_size, Point &dst_tl, Point &dst_br)
193
for
(
float
x = 0; x < src_size.width; ++x)
195
projector_.mapForward(
static_cast<
float
>(x), 0, u, v);
199
projector_.mapForward(
static_cast<
float
>(x),
static_cast<
float
>(src_size.height - 1), u, v);
203
for
(
int
y = 0; y < src_size.height; ++y)
205
projector_.mapForward(0,
static_cast<
float
>(y), u, v);
209
projector_.mapForward(
static_cast<
float
>(src_size.width - 1),
static_cast<
float
>(y), u, v);
214
dst_tl.x =
static_cast<
int
>(tl_uf);
215
dst_tl.y =
static_cast<
int
>(tl_vf);
216
dst_br.x =
static_cast<
int
>(br_uf);
217
dst_br.y =
static_cast<
int
>(br_vf);
222
void
PlaneProjector::mapForward(
float
x,
float
y,
float
&u,
float
&v)
224
float
x_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2];
225
float
y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5];
226
float
z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8];
228
x_ = t[0] + x_ / z_ * (1 - t[2]);
229
y_ = t[1] + y_ / z_ * (1 - t[2]);
237
void
PlaneProjector::mapBackward(
float
u,
float
v,
float
&x,
float
&y)
239
u = u / scale - t[0];
240
v = v / scale - t[1];
243
x = k_rinv[0] * u + k_rinv[1] * v + k_rinv[2] * (1 - t[2]);
244
y = k_rinv[3] * u + k_rinv[4] * v + k_rinv[5] * (1 - t[2]);
245
z = k_rinv[6] * u + k_rinv[7] * v + k_rinv[8] * (1 - t[2]);
253
void
SphericalProjector::mapForward(
float
x,
float
y,
float
&u,
float
&v)
255
float
x_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2];
256
float
y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5];
257
float
z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8];
259
u = scale * atan2f(x_, z_);
260
float
w = y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_);
261
v = scale * (
static_cast<
float
>(CV_PI) - acosf(w == w ? w : 0));
266
void
SphericalProjector::mapBackward(
float
u,
float
v,
float
&x,
float
&y)
271
float
sinv = sinf(
static_cast<
float
>(CV_PI) - v);
272
float
x_ = sinv * sinf(u);
273
float
y_ = cosf(
static_cast<
float
>(CV_PI) - v);
274
float
z_ = sinv * cosf(u);
277
x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_;
278
y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_;
279
z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_;
281
if
(z > 0) { x /= z; y /= z; }
287
void
CylindricalProjector::mapForward(
float
x,
float
y,
float
&u,
float
&v)
289
float
x_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2];
290
float
y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5];
291
float
z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8];
293
u = scale * atan2f(x_, z_);
294
v = scale * y_ / sqrtf(x_ * x_ + z_ * z_);
299
void
CylindricalProjector::mapBackward(
float
u,
float
v,
float
&x,
float
&y)
309
x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_;
310
y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_;
311
z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_;
313
if
(z > 0) { x /= z; y /= z; }
318
void
FisheyeProjector::mapForward(
float
x,
float
y,
float
&u,
float
&v)
320
float
x_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2];
321
float
y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5];
322
float
z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8];
324
float
u_ = atan2f(x_, z_);
325
float
v_ = (float)CV_PI - acosf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_));
327
u = scale * v_ * cosf(u_);
328
v = scale * v_ * sinf(u_);
332
void
FisheyeProjector::mapBackward(
float
u,
float
v,
float
&x,
float
&y)
337
float
u_ = atan2f(v, u);
338
float
v_ = sqrtf(u*u + v*v);
340
float
sinv = sinf((
float)CV_PI - v_);
341
float
x_ = sinv * sinf(u_);
342
float
y_ = cosf((
float)CV_PI - v_);
343
float
z_ = sinv * cosf(u_);
346
x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_;
347
y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_;
348
z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_;
350
if
(z > 0) { x /= z; y /= z; }
355
void
StereographicProjector::mapForward(
float
x,
float
y,
float
&u,
float
&v)
357
float
x_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2];
358
float
y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5];
359
float
z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8];
361
float
u_ = atan2f(x_, z_);
362
float
v_ = (float)CV_PI - acosf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_));
364
float
r = sinf(v_) / (1 - cosf(v_));
371
void
StereographicProjector::mapBackward(
float
u,
float
v,
float
&x,
float
&y)
376
float
u_ = atan2f(v, u);
377
float
r = sqrtf(u*u + v*v);
378
float
v_ = 2 * atanf(1.f / r);
380
float
sinv = sinf((
float)CV_PI - v_);
381
float
x_ = sinv * sinf(u_);
382
float
y_ = cosf((
float)CV_PI - v_);
383
float
z_ = sinv * cosf(u_);
386
x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_;
387
y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_;
388
z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_;
390
if
(z > 0) { x /= z; y /= z; }
395
void
CompressedRectilinearProjector::mapForward(
float
x,
float
y,
float
&u,
float
&v)
397
float
x_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2];
398
float
y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5];
399
float
z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8];
401
float
u_ = atan2f(x_, z_);
402
float
v_ = asinf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_));
404
u = scale * a * tanf(u_ / a);
405
v = scale * b * tanf(v_) / cosf(u_);
409
void
CompressedRectilinearProjector::mapBackward(
float
u,
float
v,
float
&x,
float
&y)
414
float
aatg = a * atanf(u / a);
416
float
v_ = atanf(v * cosf(aatg) / b);
418
float
cosv = cosf(v_);
419
float
x_ = cosv * sinf(u_);
421
float
z_ = cosv * cosf(u_);
424
x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_;
425
y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_;
426
z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_;
428
if
(z > 0) { x /= z; y /= z; }
433
void
CompressedRectilinearPortraitProjector::mapForward(
float
x,
float
y,
float
&u,
float
&v)
435
float
y_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2];
436
float
x_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5];
437
float
z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8];
439
float
u_ = atan2f(x_, z_);
440
float
v_ = asinf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_));
442
u = - scale * a * tanf(u_ / a);
443
v = scale * b * tanf(v_) / cosf(u_);
447
void
CompressedRectilinearPortraitProjector::mapBackward(
float
u,
float
v,
float
&x,
float
&y)
452
float
aatg = a * atanf(u / a);
454
float
v_ = atanf(v * cosf( aatg ) / b);
456
float
cosv = cosf(v_);
457
float
y_ = cosv * sinf(u_);
459
float
z_ = cosv * cosf(u_);
462
x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_;
463
y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_;
464
z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_;
466
if
(z > 0) { x /= z; y /= z; }
471
void
PaniniProjector::mapForward(
float
x,
float
y,
float
&u,
float
&v)
473
float
x_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2];
474
float
y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5];
475
float
z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8];
477
float
u_ = atan2f(x_, z_);
478
float
v_ = asinf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_));
480
float
tg = a * tanf(u_ / a);
483
float
sinu = sinf(u_);
484
if
( fabs(sinu) < 1E-7 )
485
v = scale * b * tanf(v_);
487
v = scale * b * tg * tanf(v_) / sinu;
491
void
PaniniProjector::mapBackward(
float
u,
float
v,
float
&x,
float
&y)
496
float
lamda = a * atanf(u / a);
500
if
( fabs(lamda) > 1E-7)
501
v_ = atanf(v * sinf(lamda) / (b * a * tanf(lamda / a)));
505
float
cosv = cosf(v_);
506
float
x_ = cosv * sinf(u_);
508
float
z_ = cosv * cosf(u_);
511
x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_;
512
y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_;
513
z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_;
515
if
(z > 0) { x /= z; y /= z; }
520
void
PaniniPortraitProjector::mapForward(
float
x,
float
y,
float
&u,
float
&v)
522
float
y_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2];
523
float
x_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5];
524
float
z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8];
526
float
u_ = atan2f(x_, z_);
527
float
v_ = asinf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_));
529
float
tg = a * tanf(u_ / a);
532
float
sinu = sinf( u_ );
533
if
( fabs(sinu) < 1E-7 )
534
v = scale * b * tanf(v_);
536
v = scale * b * tg * tanf(v_) / sinu;
540
void
PaniniPortraitProjector::mapBackward(
float
u,
float
v,
float
&x,
float
&y)
545
float
lamda = a * atanf(u / a);
549
if
( fabs(lamda) > 1E-7)
550
v_ = atanf(v * sinf(lamda) / (b * a * tanf(lamda/a)));
554
float
cosv = cosf(v_);
555
float
y_ = cosv * sinf(u_);
557
float
z_ = cosv * cosf(u_);
560
x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_;
561
y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_;
562
z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_;
564
if
(z > 0) { x /= z; y /= z; }
569
void
MercatorProjector::mapForward(
float
x,
float
y,
float
&u,
float
&v)
571
float
x_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2];
572
float
y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5];
573
float
z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8];
575
float
u_ = atan2f(x_, z_);
576
float
v_ = asinf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_));
579
v = scale * logf( tanf( (
float)(CV_PI/4) + v_/2 ) );
583
void
MercatorProjector::mapBackward(
float
u,
float
v,
float
&x,
float
&y)
588
float
v_ = atanf( sinhf(v) );
591
float
cosv = cosf(v_);
592
float
x_ = cosv * sinf(u_);
594
float
z_ = cosv * cosf(u_);
597
x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_;
598
y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_;
599
z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_;
601
if
(z > 0) { x /= z; y /= z; }
606
void
TransverseMercatorProjector::mapForward(
float
x,
float
y,
float
&u,
float
&v)
608
float
x_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2];
609
float
y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5];
610
float
z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8];
612
float
u_ = atan2f(x_, z_);
613
float
v_ = asinf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_));
615
float
B = cosf(v_) * sinf(u_);
617
u = scale / 2 * logf( (1+B) / (1-B) );
618
v = scale * atan2f(tanf(v_), cosf(u_));
622
void
TransverseMercatorProjector::mapBackward(
float
u,
float
v,
float
&x,
float
&y)
627
float
v_ = asinf( sinf(v) / coshf(u) );
628
float
u_ = atan2f( sinhf(u),
std::cos(v) );
630
float
cosv = cosf(v_);
631
float
x_ = cosv * sinf(u_);
633
float
z_ = cosv * cosf(u_);
636
x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_;
637
y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_;
638
z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_;
640
if
(z > 0) { x /= z; y /= z; }
645
void
SphericalPortraitProjector::mapForward(
float
x,
float
y,
float
&u0,
float
&v0)
647
float
x0_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2];
648
float
y0_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5];
649
float
z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8];
655
u = scale * atan2f(x_, z_);
656
v = scale * (
static_cast<
float
>(CV_PI) - acosf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_)));
664
void
SphericalPortraitProjector::mapBackward(
float
u0,
float
v0,
float
&x,
float
&y)
673
float
sinv = sinf(
static_cast<
float
>(CV_PI) - v);
674
float
x0_ = sinv * sinf(u);
675
float
y0_ = cosf(
static_cast<
float
>(CV_PI) - v);
676
float
z_ = sinv * cosf(u);
682
x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_;
683
y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_;
684
z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_;
686
if
(z > 0) { x /= z; y /= z; }
691
void
CylindricalPortraitProjector::mapForward(
float
x,
float
y,
float
&u0,
float
&v0)
693
float
x0_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2];
694
float
y0_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5];
695
float
z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8];
701
u = scale * atan2f(x_, z_);
702
v = scale * y_ / sqrtf(x_ * x_ + z_ * z_);
710
void
CylindricalPortraitProjector::mapBackward(
float
u0,
float
v0,
float
&x,
float
&y)
727
x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_;
728
y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_;
729
z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_;
731
if
(z > 0) { x /= z; y /= z; }
736
void
PlanePortraitProjector::mapForward(
float
x,
float
y,
float
&u0,
float
&v0)
738
float
x0_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2];
739
float
y0_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5];
740
float
z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8];
745
x_ = t[0] + x_ / z_ * (1 - t[2]);
746
y_ = t[1] + y_ / z_ * (1 - t[2]);
758
void
PlanePortraitProjector::mapBackward(
float
u0,
float
v0,
float
&x,
float
&y)
764
u = u / scale - t[0];
765
v = v / scale - t[1];
768
x = k_rinv[0] * v + k_rinv[1] * u + k_rinv[2] * (1 - t[2]);
769
y = k_rinv[3] * v + k_rinv[4] * u + k_rinv[5] * (1 - t[2]);
770
z = k_rinv[6] * v + k_rinv[7] * u + k_rinv[8] * (1 - t[2]);
Point2f warpPointBackward(const Point2f &pt, InputArray K, InputArray R) CV_OVERRIDE
Projects the image point backward.
Rect warpRoi(Size src_size, InputArray K, InputArray R) CV_OVERRIDE
Point2f warpPoint(const Point2f &pt, InputArray K, InputArray R) CV_OVERRIDE
Projects the image point.
Rect buildMaps(Size src_size, InputArray K, InputArray R, OutputArray xmap, OutputArray ymap) CV_OVERRIDE
Builds the projection maps according to the given camera data.
CV_EXPORTS_W void max(InputArray src1, InputArray src2, OutputArray dst)
Calculates per-element maximum of two arrays or an array and a scalar.
CV_EXPORTS_W void min(InputArray src1, InputArray src2, OutputArray dst)
Calculates per-element minimum of two arrays or an array and a scalar.
#define CV_Assert(expr)
Checks a condition at runtime and throws exception if it fails
Definition:
base.hpp:342
Quat< T > cos(const Quat< T > &q)
Quat< T > sin(const Quat< T > &q)
"black box" representation of the file storage associated with a file on disk.
Definition:
aruco.hpp:75