mirror of
https://github.com/opencv/opencv.git
synced 2026-07-30 15:53:03 +04:00
Merge branch 'master' of https://github.com/opencv/opencv into interpMultichannelImg
Added assertios to remap and warpAffine functions As @mshabunin said, remap and warpAffine functions do not support more than 4 channels in Bicubic and Lanczos4 interpolation modes. Assertions were added. Appropriate test was chenged. resolves #8272
This commit is contained in:
@@ -1649,7 +1649,7 @@ struct VResizeLanczos4
|
||||
{
|
||||
CastOp castOp;
|
||||
VecOp vecOp;
|
||||
int k, x = vecOp((const uchar**)src, (uchar*)dst, (const uchar*)beta, width);
|
||||
int x = vecOp((const uchar**)src, (uchar*)dst, (const uchar*)beta, width);
|
||||
#if CV_ENABLE_UNROLLED
|
||||
for( ; x <= width - 4; x += 4 )
|
||||
{
|
||||
@@ -1657,7 +1657,7 @@ struct VResizeLanczos4
|
||||
const WT* S = src[0];
|
||||
WT s0 = S[x]*b, s1 = S[x+1]*b, s2 = S[x+2]*b, s3 = S[x+3]*b;
|
||||
|
||||
for( k = 1; k < 8; k++ )
|
||||
for( int k = 1; k < 8; k++ )
|
||||
{
|
||||
b = beta[k]; S = src[k];
|
||||
s0 += S[x]*b; s1 += S[x+1]*b;
|
||||
@@ -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;
|
||||
|
||||
@@ -160,6 +160,7 @@ enum
|
||||
#define CAT(x, y) __CAT(x, y)
|
||||
|
||||
#define DATA_TYPE_4 CAT(DATA_TYPE, 4)
|
||||
#define DATA_TYPE_3 CAT(DATA_TYPE, 3)
|
||||
|
||||
///////////////////////////////////// RGB <-> GRAY //////////////////////////////////////
|
||||
|
||||
@@ -182,7 +183,7 @@ __kernel void RGB2Gray(__global const uchar * srcptr, int src_step, int src_offs
|
||||
{
|
||||
__global const DATA_TYPE* src = (__global const DATA_TYPE*)(srcptr + src_index);
|
||||
__global DATA_TYPE* dst = (__global DATA_TYPE*)(dstptr + dst_index);
|
||||
DATA_TYPE_4 src_pix = vload4(0, src);
|
||||
DATA_TYPE_3 src_pix = vload3(0, src);
|
||||
#ifdef DEPTH_5
|
||||
dst[0] = fma(src_pix.B_COMP, B2YF, fma(src_pix.G_COMP, G2YF, src_pix.R_COMP * R2YF));
|
||||
#else
|
||||
@@ -256,7 +257,7 @@ __kernel void RGB2YUV(__global const uchar* srcptr, int src_step, int src_offset
|
||||
{
|
||||
__global const DATA_TYPE* src = (__global const DATA_TYPE*)(srcptr + src_index);
|
||||
__global DATA_TYPE* dst = (__global DATA_TYPE*)(dstptr + dst_index);
|
||||
DATA_TYPE_4 src_pix = vload4(0, src);
|
||||
DATA_TYPE_3 src_pix = vload3(0, src);
|
||||
DATA_TYPE b = src_pix.B_COMP, g = src_pix.G_COMP, r = src_pix.R_COMP;
|
||||
|
||||
#ifdef DEPTH_5
|
||||
|
||||
@@ -476,8 +476,6 @@ static Point2f mapPointSpherical(const Point2f& p, float alpha, Vec4d* J, int pr
|
||||
|
||||
static Point2f invMapPointSpherical(Point2f _p, float alpha, int projType)
|
||||
{
|
||||
static int avgiter = 0, avgn = 0;
|
||||
|
||||
double eps = 1e-12;
|
||||
Vec2d p(_p.x, _p.y), q(_p.x, _p.y), err;
|
||||
Vec4d J;
|
||||
@@ -502,14 +500,6 @@ static Point2f invMapPointSpherical(Point2f _p, float alpha, int projType)
|
||||
//q -= Vec2d((J.t()*J).inv()*(J.t()*err));
|
||||
}
|
||||
|
||||
if( i < maxiter )
|
||||
{
|
||||
avgiter += i;
|
||||
avgn++;
|
||||
if( avgn == 1500 )
|
||||
printf("avg iters = %g\n", (double)avgiter/avgn);
|
||||
}
|
||||
|
||||
return i < maxiter ? Point2f((float)q[0], (float)q[1]) : Point2f(-FLT_MAX, -FLT_MAX);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user