Merge pull request #4018 from vpisarev:imgproc_video_fixes
This commit is contained in:
@@ -3455,7 +3455,7 @@ struct SymmColumnSmallFilter : public SymmColumnFilter<CastOp, VecOp>
|
||||
bool symmetrical = (this->symmetryType & KERNEL_SYMMETRICAL) != 0;
|
||||
bool is_1_2_1 = ky[0] == 2 && ky[1] == 1;
|
||||
bool is_1_m2_1 = ky[0] == -2 && ky[1] == 1;
|
||||
bool is_m1_0_1 = ky[1] == 1 || ky[1] == -1;
|
||||
bool is_m1_0_1 = ky[0] == 0 && (ky[1] == 1 || ky[1] == -1);
|
||||
ST f0 = ky[0], f1 = ky[1];
|
||||
ST _delta = this->delta;
|
||||
CastOp castOp = this->castOp0;
|
||||
@@ -3486,13 +3486,12 @@ struct SymmColumnSmallFilter : public SymmColumnFilter<CastOp, VecOp>
|
||||
D[i+2] = castOp(s0);
|
||||
D[i+3] = castOp(s1);
|
||||
}
|
||||
#else
|
||||
#endif
|
||||
for( ; i < width; i ++ )
|
||||
{
|
||||
ST s0 = S0[i] + S1[i]*2 + S2[i] + _delta;
|
||||
D[i] = castOp(s0);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
else if( is_1_m2_1 )
|
||||
{
|
||||
@@ -3509,17 +3508,16 @@ struct SymmColumnSmallFilter : public SymmColumnFilter<CastOp, VecOp>
|
||||
D[i+2] = castOp(s0);
|
||||
D[i+3] = castOp(s1);
|
||||
}
|
||||
#else
|
||||
#endif
|
||||
for( ; i < width; i ++ )
|
||||
{
|
||||
ST s0 = S0[i] - S1[i]*2 + S2[i] + _delta;
|
||||
D[i] = castOp(s0);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
#if CV_ENABLE_UNROLLED
|
||||
#if CV_ENABLE_UNROLLED
|
||||
for( ; i <= width - 4; i += 4 )
|
||||
{
|
||||
ST s0 = (S0[i] + S2[i])*f1 + S1[i]*f0 + _delta;
|
||||
@@ -3532,16 +3530,13 @@ struct SymmColumnSmallFilter : public SymmColumnFilter<CastOp, VecOp>
|
||||
D[i+2] = castOp(s0);
|
||||
D[i+3] = castOp(s1);
|
||||
}
|
||||
#else
|
||||
#endif
|
||||
for( ; i < width; i ++ )
|
||||
{
|
||||
ST s0 = (S0[i] + S2[i])*f1 + S1[i]*f0 + _delta;
|
||||
D[i] = castOp(s0);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
for( ; i < width; i++ )
|
||||
D[i] = castOp((S0[i] + S2[i])*f1 + S1[i]*f0 + _delta);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -3549,7 +3544,7 @@ struct SymmColumnSmallFilter : public SymmColumnFilter<CastOp, VecOp>
|
||||
{
|
||||
if( f1 < 0 )
|
||||
std::swap(S0, S2);
|
||||
#if CV_ENABLE_UNROLLED
|
||||
#if CV_ENABLE_UNROLLED
|
||||
for( ; i <= width - 4; i += 4 )
|
||||
{
|
||||
ST s0 = S2[i] - S0[i] + _delta;
|
||||
@@ -3562,19 +3557,18 @@ struct SymmColumnSmallFilter : public SymmColumnFilter<CastOp, VecOp>
|
||||
D[i+2] = castOp(s0);
|
||||
D[i+3] = castOp(s1);
|
||||
}
|
||||
#else
|
||||
#endif
|
||||
for( ; i < width; i ++ )
|
||||
{
|
||||
ST s0 = S2[i] - S0[i] + _delta;
|
||||
D[i] = castOp(s0);
|
||||
}
|
||||
#endif
|
||||
if( f1 < 0 )
|
||||
std::swap(S0, S2);
|
||||
}
|
||||
else
|
||||
{
|
||||
#if CV_ENABLE_UNROLLED
|
||||
#if CV_ENABLE_UNROLLED
|
||||
for( ; i <= width - 4; i += 4 )
|
||||
{
|
||||
ST s0 = (S2[i] - S0[i])*f1 + _delta;
|
||||
@@ -3588,10 +3582,9 @@ struct SymmColumnSmallFilter : public SymmColumnFilter<CastOp, VecOp>
|
||||
D[i+3] = castOp(s1);
|
||||
}
|
||||
#endif
|
||||
for( ; i < width; i++ )
|
||||
D[i] = castOp((S2[i] - S0[i])*f1 + _delta);
|
||||
}
|
||||
|
||||
for( ; i < width; i++ )
|
||||
D[i] = castOp((S2[i] - S0[i])*f1 + _delta);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -3805,20 +3805,20 @@ 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 cn = _src.channels();
|
||||
int k, 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]));
|
||||
T cval[CV_CN_MAX];
|
||||
int dx, dy;
|
||||
CastOp castOp;
|
||||
VecOp vecOp;
|
||||
|
||||
for( 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);
|
||||
CV_Assert( cn <= 4 && ssize.area() > 0 );
|
||||
CV_Assert( ssize.area() > 0 );
|
||||
#if CV_SSE2
|
||||
if( _src.type() == CV_8UC3 )
|
||||
width1 = std::max(ssize.width-2, 0);
|
||||
@@ -3882,7 +3882,7 @@ static void remapBilinear( const Mat& _src, Mat& _dst, const Mat& _xy,
|
||||
WT t2 = S[2]*w[0] + S[5]*w[1] + S[sstep+2]*w[2] + S[sstep+5]*w[3];
|
||||
D[0] = castOp(t0); D[1] = castOp(t1); D[2] = castOp(t2);
|
||||
}
|
||||
else
|
||||
else if( cn == 4 )
|
||||
for( ; dx < X1; dx++, D += 4 )
|
||||
{
|
||||
int sx = XY[dx*2], sy = XY[dx*2+1];
|
||||
@@ -3895,6 +3895,18 @@ static void remapBilinear( const Mat& _src, Mat& _dst, const Mat& _xy,
|
||||
t1 = S[3]*w[0] + S[7]*w[1] + S[sstep+3]*w[2] + S[sstep+7]*w[3];
|
||||
D[2] = castOp(t0); D[3] = castOp(t1);
|
||||
}
|
||||
else
|
||||
for( ; dx < X1; dx++, D += cn )
|
||||
{
|
||||
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++ )
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -3948,7 +3960,7 @@ static void remapBilinear( const Mat& _src, Mat& _dst, const Mat& _xy,
|
||||
else
|
||||
for( ; dx < X1; dx++, D += cn )
|
||||
{
|
||||
int sx = XY[dx*2], sy = XY[dx*2+1], k;
|
||||
int sx = XY[dx*2], sy = XY[dx*2+1];
|
||||
if( borderType == BORDER_CONSTANT &&
|
||||
(sx >= ssize.width || sx+1 < 0 ||
|
||||
sy >= ssize.height || sy+1 < 0) )
|
||||
|
Reference in New Issue
Block a user