|
|
|
@ -3533,14 +3533,13 @@ static void remapNearest( const Mat& _src, Mat& _dst, const Mat& _xy, |
|
|
|
|
int borderType, const Scalar& _borderValue ) |
|
|
|
|
{ |
|
|
|
|
Size ssize = _src.size(), dsize = _dst.size(); |
|
|
|
|
int cn = _src.channels(); |
|
|
|
|
const int cn = _src.channels(); |
|
|
|
|
const T* S0 = _src.ptr<T>(); |
|
|
|
|
T cval[CV_CN_MAX]; |
|
|
|
|
size_t sstep = _src.step/sizeof(S0[0]); |
|
|
|
|
Scalar_<T> cval(saturate_cast<T>(_borderValue[0]), |
|
|
|
|
saturate_cast<T>(_borderValue[1]), |
|
|
|
|
saturate_cast<T>(_borderValue[2]), |
|
|
|
|
saturate_cast<T>(_borderValue[3])); |
|
|
|
|
int dx, dy; |
|
|
|
|
|
|
|
|
|
for(int k = 0; k < cn; k++ ) |
|
|
|
|
cval[k] = saturate_cast<T>(_borderValue[k & 3]); |
|
|
|
|
|
|
|
|
|
unsigned width1 = ssize.width, height1 = ssize.height; |
|
|
|
|
|
|
|
|
@ -3550,14 +3549,14 @@ static void remapNearest( const Mat& _src, Mat& _dst, const Mat& _xy, |
|
|
|
|
dsize.height = 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for( dy = 0; dy < dsize.height; dy++ ) |
|
|
|
|
for(int dy = 0; dy < dsize.height; dy++ ) |
|
|
|
|
{ |
|
|
|
|
T* D = _dst.ptr<T>(dy); |
|
|
|
|
const short* XY = _xy.ptr<short>(dy); |
|
|
|
|
|
|
|
|
|
if( cn == 1 ) |
|
|
|
|
{ |
|
|
|
|
for( dx = 0; dx < dsize.width; dx++ ) |
|
|
|
|
for(int dx = 0; dx < dsize.width; dx++ ) |
|
|
|
|
{ |
|
|
|
|
int sx = XY[dx*2], sy = XY[dx*2+1]; |
|
|
|
|
if( (unsigned)sx < width1 && (unsigned)sy < height1 ) |
|
|
|
@ -3583,9 +3582,9 @@ static void remapNearest( const Mat& _src, Mat& _dst, const Mat& _xy, |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
for( dx = 0; dx < dsize.width; dx++, D += cn ) |
|
|
|
|
for(int dx = 0; dx < dsize.width; dx++, D += cn ) |
|
|
|
|
{ |
|
|
|
|
int sx = XY[dx*2], sy = XY[dx*2+1], k; |
|
|
|
|
int sx = XY[dx*2], sy = XY[dx*2+1]; |
|
|
|
|
const T *S; |
|
|
|
|
if( (unsigned)sx < width1 && (unsigned)sy < height1 ) |
|
|
|
|
{ |
|
|
|
@ -3602,7 +3601,7 @@ static void remapNearest( const Mat& _src, Mat& _dst, const Mat& _xy, |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
S = S0 + sy*sstep + sx*cn; |
|
|
|
|
for( k = 0; k < cn; k++ ) |
|
|
|
|
for(int k = 0; k < cn; k++ ) |
|
|
|
|
D[k] = S[k]; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -3622,7 +3621,7 @@ static void remapNearest( const Mat& _src, Mat& _dst, const Mat& _xy, |
|
|
|
|
sy = borderInterpolate(sy, ssize.height, borderType); |
|
|
|
|
S = S0 + sy*sstep + sx*cn; |
|
|
|
|
} |
|
|
|
|
for( k = 0; k < cn; k++ ) |
|
|
|
|
for(int k = 0; k < cn; k++ ) |
|
|
|
|
D[k] = S[k]; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -3852,16 +3851,15 @@ static void remapBilinear( const Mat& _src, Mat& _dst, const Mat& _xy, |
|
|
|
|
typedef typename CastOp::rtype T; |
|
|
|
|
typedef typename CastOp::type1 WT; |
|
|
|
|
Size ssize = _src.size(), dsize = _dst.size(); |
|
|
|
|
int k, cn = _src.channels(); |
|
|
|
|
const int cn = _src.channels(); |
|
|
|
|
const AT* wtab = (const AT*)_wtab; |
|
|
|
|
const T* S0 = _src.ptr<T>(); |
|
|
|
|
size_t sstep = _src.step/sizeof(S0[0]); |
|
|
|
|
T cval[CV_CN_MAX]; |
|
|
|
|
int dx, dy; |
|
|
|
|
CastOp castOp; |
|
|
|
|
VecOp vecOp; |
|
|
|
|
|
|
|
|
|
for( k = 0; k < cn; k++ ) |
|
|
|
|
for(int k = 0; k < cn; k++ ) |
|
|
|
|
cval[k] = saturate_cast<T>(_borderValue[k & 3]); |
|
|
|
|
|
|
|
|
|
unsigned width1 = std::max(ssize.width-1, 0), height1 = std::max(ssize.height-1, 0); |
|
|
|
@ -3871,7 +3869,7 @@ static void remapBilinear( const Mat& _src, Mat& _dst, const Mat& _xy, |
|
|
|
|
width1 = std::max(ssize.width-2, 0); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
for( dy = 0; dy < dsize.height; dy++ ) |
|
|
|
|
for(int dy = 0; dy < dsize.height; dy++ ) |
|
|
|
|
{ |
|
|
|
|
T* D = _dst.ptr<T>(dy); |
|
|
|
|
const short* XY = _xy.ptr<short>(dy); |
|
|
|
@ -3879,7 +3877,7 @@ static void remapBilinear( const Mat& _src, Mat& _dst, const Mat& _xy, |
|
|
|
|
int X0 = 0; |
|
|
|
|
bool prevInlier = false; |
|
|
|
|
|
|
|
|
|
for( dx = 0; dx <= dsize.width; dx++ ) |
|
|
|
|
for(int dx = 0; dx <= dsize.width; dx++ ) |
|
|
|
|
{ |
|
|
|
|
bool curInlier = dx < dsize.width ? |
|
|
|
|
(unsigned)XY[dx*2] < width1 && |
|
|
|
@ -3948,7 +3946,7 @@ static void remapBilinear( const Mat& _src, Mat& _dst, const Mat& _xy, |
|
|
|
|
int sx = XY[dx*2], sy = XY[dx*2+1]; |
|
|
|
|
const AT* w = wtab + FXY[dx]*4; |
|
|
|
|
const T* S = S0 + sy*sstep + sx*cn; |
|
|
|
|
for( k = 0; k < cn; k++ ) |
|
|
|
|
for(int k = 0; k < cn; k++ ) |
|
|
|
|
{ |
|
|
|
|
WT t0 = S[k]*w[0] + S[k+cn]*w[1] + S[sstep+k]*w[2] + S[sstep+k+cn]*w[3]; |
|
|
|
|
D[k] = castOp(t0); |
|
|
|
@ -4012,7 +4010,7 @@ static void remapBilinear( const Mat& _src, Mat& _dst, const Mat& _xy, |
|
|
|
|
(sx >= ssize.width || sx+1 < 0 || |
|
|
|
|
sy >= ssize.height || sy+1 < 0) ) |
|
|
|
|
{ |
|
|
|
|
for( k = 0; k < cn; k++ ) |
|
|
|
|
for(int k = 0; k < cn; k++ ) |
|
|
|
|
D[k] = cval[k]; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
@ -4046,7 +4044,7 @@ static void remapBilinear( const Mat& _src, Mat& _dst, const Mat& _xy, |
|
|
|
|
v2 = sx0 >= 0 && sy1 >= 0 ? S0 + sy1*sstep + sx0*cn : &cval[0]; |
|
|
|
|
v3 = sx1 >= 0 && sy1 >= 0 ? S0 + sy1*sstep + sx1*cn : &cval[0]; |
|
|
|
|
} |
|
|
|
|
for( k = 0; k < cn; k++ ) |
|
|
|
|
for(int k = 0; k < cn; k++ ) |
|
|
|
|
D[k] = castOp(WT(v0[k]*w[0] + v1[k]*w[1] + v2[k]*w[2] + v3[k]*w[3])); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -4064,16 +4062,16 @@ static void remapBicubic( const Mat& _src, Mat& _dst, const Mat& _xy, |
|
|
|
|
typedef typename CastOp::rtype T; |
|
|
|
|
typedef typename CastOp::type1 WT; |
|
|
|
|
Size ssize = _src.size(), dsize = _dst.size(); |
|
|
|
|
int cn = _src.channels(); |
|
|
|
|
const int cn = _src.channels(); |
|
|
|
|
const AT* wtab = (const AT*)_wtab; |
|
|
|
|
const T* S0 = _src.ptr<T>(); |
|
|
|
|
size_t sstep = _src.step/sizeof(S0[0]); |
|
|
|
|
Scalar_<T> cval(saturate_cast<T>(_borderValue[0]), |
|
|
|
|
saturate_cast<T>(_borderValue[1]), |
|
|
|
|
saturate_cast<T>(_borderValue[2]), |
|
|
|
|
saturate_cast<T>(_borderValue[3])); |
|
|
|
|
int dx, dy; |
|
|
|
|
T cval[CV_CN_MAX]; |
|
|
|
|
CastOp castOp; |
|
|
|
|
|
|
|
|
|
for(int k = 0; k < cn; k++ ) |
|
|
|
|
cval[k] = saturate_cast<T>(_borderValue[k & 3]); |
|
|
|
|
|
|
|
|
|
int borderType1 = borderType != BORDER_TRANSPARENT ? borderType : BORDER_REFLECT_101; |
|
|
|
|
|
|
|
|
|
unsigned width1 = std::max(ssize.width-3, 0), height1 = std::max(ssize.height-3, 0); |
|
|
|
@ -4084,21 +4082,20 @@ static void remapBicubic( const Mat& _src, Mat& _dst, const Mat& _xy, |
|
|
|
|
dsize.height = 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for( dy = 0; dy < dsize.height; dy++ ) |
|
|
|
|
for(int dy = 0; dy < dsize.height; dy++ ) |
|
|
|
|
{ |
|
|
|
|
T* D = _dst.ptr<T>(dy); |
|
|
|
|
const short* XY = _xy.ptr<short>(dy); |
|
|
|
|
const ushort* FXY = _fxy.ptr<ushort>(dy); |
|
|
|
|
|
|
|
|
|
for( dx = 0; dx < dsize.width; dx++, D += cn ) |
|
|
|
|
for(int dx = 0; dx < dsize.width; dx++, D += cn ) |
|
|
|
|
{ |
|
|
|
|
int sx = XY[dx*2]-1, sy = XY[dx*2+1]-1; |
|
|
|
|
const AT* w = wtab + FXY[dx]*16; |
|
|
|
|
int i, k; |
|
|
|
|
if( (unsigned)sx < width1 && (unsigned)sy < height1 ) |
|
|
|
|
{ |
|
|
|
|
const T* S = S0 + sy*sstep + sx*cn; |
|
|
|
|
for( k = 0; k < cn; k++ ) |
|
|
|
|
for(int k = 0; k < cn; k++ ) |
|
|
|
|
{ |
|
|
|
|
WT sum = S[0]*w[0] + S[cn]*w[1] + S[cn*2]*w[2] + S[cn*3]*w[3]; |
|
|
|
|
S += sstep; |
|
|
|
@ -4123,21 +4120,21 @@ static void remapBicubic( const Mat& _src, Mat& _dst, const Mat& _xy, |
|
|
|
|
(sx >= ssize.width || sx+4 <= 0 || |
|
|
|
|
sy >= ssize.height || sy+4 <= 0)) |
|
|
|
|
{ |
|
|
|
|
for( k = 0; k < cn; k++ ) |
|
|
|
|
for(int k = 0; k < cn; k++ ) |
|
|
|
|
D[k] = cval[k]; |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for( i = 0; i < 4; i++ ) |
|
|
|
|
for(int i = 0; i < 4; i++ ) |
|
|
|
|
{ |
|
|
|
|
x[i] = borderInterpolate(sx + i, ssize.width, borderType1)*cn; |
|
|
|
|
y[i] = borderInterpolate(sy + i, ssize.height, borderType1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for( k = 0; k < cn; k++, S0++, w -= 16 ) |
|
|
|
|
for(int k = 0; k < cn; k++, S0++, w -= 16 ) |
|
|
|
|
{ |
|
|
|
|
WT cv = cval[k], sum = cv*ONE; |
|
|
|
|
for( i = 0; i < 4; i++, w += 4 ) |
|
|
|
|
for(int i = 0; i < 4; i++, w += 4 ) |
|
|
|
|
{ |
|
|
|
|
int yi = y[i]; |
|
|
|
|
const T* S = S0 + yi*sstep; |
|
|
|
@ -4169,16 +4166,16 @@ static void remapLanczos4( const Mat& _src, Mat& _dst, const Mat& _xy, |
|
|
|
|
typedef typename CastOp::rtype T; |
|
|
|
|
typedef typename CastOp::type1 WT; |
|
|
|
|
Size ssize = _src.size(), dsize = _dst.size(); |
|
|
|
|
int cn = _src.channels(); |
|
|
|
|
const int cn = _src.channels(); |
|
|
|
|
const AT* wtab = (const AT*)_wtab; |
|
|
|
|
const T* S0 = _src.ptr<T>(); |
|
|
|
|
size_t sstep = _src.step/sizeof(S0[0]); |
|
|
|
|
Scalar_<T> cval(saturate_cast<T>(_borderValue[0]), |
|
|
|
|
saturate_cast<T>(_borderValue[1]), |
|
|
|
|
saturate_cast<T>(_borderValue[2]), |
|
|
|
|
saturate_cast<T>(_borderValue[3])); |
|
|
|
|
int dx, dy; |
|
|
|
|
T cval[CV_CN_MAX]; |
|
|
|
|
CastOp castOp; |
|
|
|
|
|
|
|
|
|
for(int k = 0; k < cn; k++ ) |
|
|
|
|
cval[k] = saturate_cast<T>(_borderValue[k & 3]); |
|
|
|
|
|
|
|
|
|
int borderType1 = borderType != BORDER_TRANSPARENT ? borderType : BORDER_REFLECT_101; |
|
|
|
|
|
|
|
|
|
unsigned width1 = std::max(ssize.width-7, 0), height1 = std::max(ssize.height-7, 0); |
|
|
|
@ -4189,21 +4186,20 @@ static void remapLanczos4( const Mat& _src, Mat& _dst, const Mat& _xy, |
|
|
|
|
dsize.height = 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for( dy = 0; dy < dsize.height; dy++ ) |
|
|
|
|
for(int dy = 0; dy < dsize.height; dy++ ) |
|
|
|
|
{ |
|
|
|
|
T* D = _dst.ptr<T>(dy); |
|
|
|
|
const short* XY = _xy.ptr<short>(dy); |
|
|
|
|
const ushort* FXY = _fxy.ptr<ushort>(dy); |
|
|
|
|
|
|
|
|
|
for( dx = 0; dx < dsize.width; dx++, D += cn ) |
|
|
|
|
for(int dx = 0; dx < dsize.width; dx++, D += cn ) |
|
|
|
|
{ |
|
|
|
|
int sx = XY[dx*2]-3, sy = XY[dx*2+1]-3; |
|
|
|
|
const AT* w = wtab + FXY[dx]*64; |
|
|
|
|
const T* S = S0 + sy*sstep + sx*cn; |
|
|
|
|
int i, k; |
|
|
|
|
if( (unsigned)sx < width1 && (unsigned)sy < height1 ) |
|
|
|
|
{ |
|
|
|
|
for( k = 0; k < cn; k++ ) |
|
|
|
|
for(int k = 0; k < cn; k++ ) |
|
|
|
|
{ |
|
|
|
|
WT sum = 0; |
|
|
|
|
for( int r = 0; r < 8; r++, S += sstep, w += 8 ) |
|
|
|
@ -4226,21 +4222,21 @@ static void remapLanczos4( const Mat& _src, Mat& _dst, const Mat& _xy, |
|
|
|
|
(sx >= ssize.width || sx+8 <= 0 || |
|
|
|
|
sy >= ssize.height || sy+8 <= 0)) |
|
|
|
|
{ |
|
|
|
|
for( k = 0; k < cn; k++ ) |
|
|
|
|
for(int k = 0; k < cn; k++ ) |
|
|
|
|
D[k] = cval[k]; |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for( i = 0; i < 8; i++ ) |
|
|
|
|
for(int i = 0; i < 8; i++ ) |
|
|
|
|
{ |
|
|
|
|
x[i] = borderInterpolate(sx + i, ssize.width, borderType1)*cn; |
|
|
|
|
y[i] = borderInterpolate(sy + i, ssize.height, borderType1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for( k = 0; k < cn; k++, S0++, w -= 64 ) |
|
|
|
|
for(int k = 0; k < cn; k++, S0++, w -= 64 ) |
|
|
|
|
{ |
|
|
|
|
WT cv = cval[k], sum = cv*ONE; |
|
|
|
|
for( i = 0; i < 8; i++, w += 8 ) |
|
|
|
|
for(int i = 0; i < 8; i++, w += 8 ) |
|
|
|
|
{ |
|
|
|
|
int yi = y[i]; |
|
|
|
|
const T* S1 = S0 + yi*sstep; |
|
|
|
|