mirror of
https://github.com/opencv/opencv.git
synced 2024-11-29 05:29:54 +08:00
column sum 32s
This commit is contained in:
parent
1ca35b7424
commit
bfb45b27e6
@ -713,6 +713,158 @@ struct ColumnSum<int, ushort> :
|
|||||||
std::vector<int> sum;
|
std::vector<int> sum;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct ColumnSum<int, int> :
|
||||||
|
public BaseColumnFilter
|
||||||
|
{
|
||||||
|
ColumnSum( int _ksize, int _anchor, double _scale ) :
|
||||||
|
BaseColumnFilter()
|
||||||
|
{
|
||||||
|
ksize = _ksize;
|
||||||
|
anchor = _anchor;
|
||||||
|
scale = _scale;
|
||||||
|
sumCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void reset() { sumCount = 0; }
|
||||||
|
|
||||||
|
virtual void operator()(const uchar** src, uchar* dst, int dststep, int count, int width)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int* SUM;
|
||||||
|
bool haveScale = scale != 1;
|
||||||
|
double _scale = scale;
|
||||||
|
|
||||||
|
printf("bgfbffbbfg\n");
|
||||||
|
|
||||||
|
#if CV_SSE2
|
||||||
|
bool haveSSE2 = checkHardwareSupport(CV_CPU_SSE2);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if( width != (int)sum.size() )
|
||||||
|
{
|
||||||
|
sum.resize(width);
|
||||||
|
sumCount = 0;
|
||||||
|
}
|
||||||
|
SUM = &sum[0];
|
||||||
|
if( sumCount == 0 )
|
||||||
|
{
|
||||||
|
memset((void*)SUM, 0, width*sizeof(int));
|
||||||
|
for( ; sumCount < ksize - 1; sumCount++, src++ )
|
||||||
|
{
|
||||||
|
const int* Sp = (const int*)src[0];
|
||||||
|
i = 0;
|
||||||
|
#if CV_SSE2
|
||||||
|
if(haveSSE2)
|
||||||
|
{
|
||||||
|
for( ; i <= width-4; i+=4 )
|
||||||
|
{
|
||||||
|
__m128i _sum = _mm_loadu_si128((const __m128i*)(SUM+i));
|
||||||
|
__m128i _sp = _mm_loadu_si128((const __m128i*)(Sp+i));
|
||||||
|
_mm_storeu_si128((__m128i*)(SUM+i),_mm_add_epi32(_sum, _sp));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#elif CV_NEON
|
||||||
|
for( ; i <= width - 4; i+=4 )
|
||||||
|
vst1q_s32(SUM + i, vaddq_s32(vld1q_s32(SUM + i), vld1q_s32(Sp + i)));
|
||||||
|
#endif
|
||||||
|
for( ; i < width; i++ )
|
||||||
|
SUM[i] += Sp[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CV_Assert( sumCount == ksize-1 );
|
||||||
|
src += ksize-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for( ; count--; src++ )
|
||||||
|
{
|
||||||
|
const int* Sp = (const int*)src[0];
|
||||||
|
const int* Sm = (const int*)src[1-ksize];
|
||||||
|
int* D = (int*)dst;
|
||||||
|
if( haveScale )
|
||||||
|
{
|
||||||
|
i = 0;
|
||||||
|
#if CV_SSE2
|
||||||
|
if(haveSSE2)
|
||||||
|
{
|
||||||
|
const __m128 scale4 = _mm_set1_ps((float)_scale);
|
||||||
|
for( ; i <= width-4; i+=4 )
|
||||||
|
{
|
||||||
|
__m128i _sm = _mm_loadu_si128((const __m128i*)(Sm+i));
|
||||||
|
|
||||||
|
__m128i _s0 = _mm_add_epi32(_mm_loadu_si128((const __m128i*)(SUM+i)),
|
||||||
|
_mm_loadu_si128((const __m128i*)(Sp+i)));
|
||||||
|
|
||||||
|
__m128i _s0T = _mm_cvtps_epi32(_mm_mul_ps(scale4, _mm_cvtepi32_ps(_s0)));
|
||||||
|
|
||||||
|
_mm_storeu_si128((__m128i*)(D+i), _s0T);
|
||||||
|
_mm_storeu_si128((__m128i*)(SUM+i),_mm_sub_epi32(_s0,_sm));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#elif CV_NEON
|
||||||
|
float32x4_t v_scale = vdupq_n_f32((float)_scale);
|
||||||
|
for( ; i <= width-4; i+=4 )
|
||||||
|
{
|
||||||
|
int32x4_t v_s0 = vaddq_s32(vld1q_s32(SUM + i), vld1q_s32(Sp + i));
|
||||||
|
|
||||||
|
int32x4_t v_s0d = cv_vrndq_s32_f32(vmulq_f32(vcvtq_f32_s32(v_s0), v_scale));
|
||||||
|
vst1q_s32(D + i, v_s0d);
|
||||||
|
|
||||||
|
vst1q_s32(SUM + i, vsubq_s32(v_s0, vld1q_s32(Sm + i)));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
for( ; i < width; i++ )
|
||||||
|
{
|
||||||
|
int s0 = SUM[i] + Sp[i];
|
||||||
|
D[i] = saturate_cast<int>(s0*_scale);
|
||||||
|
SUM[i] = s0 - Sm[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
i = 0;
|
||||||
|
#if CV_SSE2
|
||||||
|
if(haveSSE2)
|
||||||
|
{
|
||||||
|
for( ; i <= width-4; i+=4 )
|
||||||
|
{
|
||||||
|
__m128i _sm = _mm_loadu_si128((const __m128i*)(Sm+i));
|
||||||
|
__m128i _s0 = _mm_add_epi32(_mm_loadu_si128((const __m128i*)(SUM+i)),
|
||||||
|
_mm_loadu_si128((const __m128i*)(Sp+i)));
|
||||||
|
|
||||||
|
_mm_storeu_si128((__m128i*)(D+i), _s0);
|
||||||
|
_mm_storeu_si128((__m128i*)(SUM+i), _mm_sub_epi32(_s0,_sm));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#elif CV_NEON
|
||||||
|
for( ; i <= width-4; i+=4 )
|
||||||
|
{
|
||||||
|
int32x4_t v_s0 = vaddq_s32(vld1q_s32(SUM + i), vld1q_s32(Sp + i));
|
||||||
|
|
||||||
|
vst1q_s32(D + i, v_s01);
|
||||||
|
vst1q_s32(SUM + i, vsubq_s32(v_s0, vld1q_s32(Sm + i)));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for( ; i < width; i++ )
|
||||||
|
{
|
||||||
|
int s0 = SUM[i] + Sp[i];
|
||||||
|
D[i] = s0;
|
||||||
|
SUM[i] = s0 - Sm[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dst += dststep;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
double scale;
|
||||||
|
int sumCount;
|
||||||
|
std::vector<int> sum;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
struct ColumnSum<int, float> :
|
struct ColumnSum<int, float> :
|
||||||
public BaseColumnFilter
|
public BaseColumnFilter
|
||||||
|
Loading…
Reference in New Issue
Block a user