mirror of
https://github.com/opencv/opencv.git
synced 2026-07-31 00:03:03 +04:00
Merge remote-tracking branch 'upstream/3.4' into merge-3.4
This commit is contained in:
@@ -1061,10 +1061,16 @@ cvFindNextContour( CvContourScanner scanner )
|
||||
}
|
||||
else
|
||||
{
|
||||
v_uint8 v_prev = vx_setall_u8((uchar)prev);
|
||||
for (; x <= width - v_uint8::nlanes; x += v_uint8::nlanes)
|
||||
#if CV_SIMD_WIDTH > 16
|
||||
v_uint8 vx_prev = vx_setall_u8((uchar)prev);
|
||||
while (x <= width - v_uint8::nlanes &&
|
||||
v_check_all(vx_load((uchar*)(img + x)) == vx_prev))
|
||||
x += v_uint8::nlanes;
|
||||
#endif
|
||||
v_uint8x16 v_prev = v_setall_u8((uchar)prev);
|
||||
for (; x <= width - v_uint8x16::nlanes; x += v_uint8x16::nlanes)
|
||||
{
|
||||
unsigned int mask = (unsigned int)v_signmask(vx_load((uchar*)(img + x)) != v_prev);
|
||||
unsigned int mask = (unsigned int)v_signmask(v_load((uchar*)(img + x)) != v_prev);
|
||||
if (mask)
|
||||
{
|
||||
p = img[(x += cv::trailingZeros32(mask))];
|
||||
@@ -1328,10 +1334,16 @@ CvLinkedRunPoint;
|
||||
inline int findStartContourPoint(uchar *src_data, CvSize img_size, int j)
|
||||
{
|
||||
#if CV_SIMD
|
||||
v_uint8 v_zero = vx_setzero_u8();
|
||||
for (; j <= img_size.width - v_uint8::nlanes; j += v_uint8::nlanes)
|
||||
#if CV_SIMD_WIDTH > 16
|
||||
v_uint8 vx_zero = vx_setzero_u8();
|
||||
while (j <= img_size.width - v_uint8::nlanes &&
|
||||
v_check_all(vx_load((uchar*)(src_data + j)) == vx_zero))
|
||||
j += v_uint8::nlanes;
|
||||
#endif
|
||||
v_uint8x16 v_zero = v_setzero_u8();
|
||||
for (; j <= img_size.width - v_uint8x16::nlanes; j += v_uint8x16::nlanes)
|
||||
{
|
||||
unsigned int mask = (unsigned int)v_signmask(vx_load((uchar*)(src_data + j)) != v_zero);
|
||||
unsigned int mask = (unsigned int)v_signmask(v_load((uchar*)(src_data + j)) != v_zero);
|
||||
if (mask)
|
||||
{
|
||||
j += cv::trailingZeros32(mask);
|
||||
@@ -1353,10 +1365,16 @@ inline int findEndContourPoint(uchar *src_data, CvSize img_size, int j)
|
||||
}
|
||||
else
|
||||
{
|
||||
v_uint8 v_zero = vx_setzero_u8();
|
||||
#if CV_SIMD_WIDTH > 16
|
||||
v_uint8 vx_zero = vx_setzero_u8();
|
||||
while (j <= img_size.width - v_uint8::nlanes &&
|
||||
v_check_all(vx_load((uchar*)(src_data + j)) != vx_zero))
|
||||
j += v_uint8::nlanes;
|
||||
#endif
|
||||
v_uint8x16 v_zero = v_setzero_u8();
|
||||
for (; j <= img_size.width - v_uint8::nlanes; j += v_uint8::nlanes)
|
||||
{
|
||||
unsigned int mask = (unsigned int)v_signmask(vx_load((uchar*)(src_data + j)) == v_zero);
|
||||
unsigned int mask = (unsigned int)v_signmask(v_load((uchar*)(src_data + j)) == v_zero);
|
||||
if (mask)
|
||||
{
|
||||
j += cv::trailingZeros32(mask);
|
||||
|
||||
@@ -436,6 +436,9 @@ struct RemapNoVec
|
||||
|
||||
#if CV_SIMD128
|
||||
|
||||
typedef unsigned short CV_DECL_ALIGNED(1) unaligned_ushort;
|
||||
typedef int CV_DECL_ALIGNED(1) unaligned_int;
|
||||
|
||||
struct RemapVec_8u
|
||||
{
|
||||
int operator()( const Mat& _src, void* _dst, const short* XY,
|
||||
@@ -461,8 +464,8 @@ struct RemapVec_8u
|
||||
{ \
|
||||
v_uint8x16 rrggbb, dummy; \
|
||||
v_uint16x8 rrggbb8, dummy8; \
|
||||
v_uint8x16 rgb0 = v_reinterpret_as_u8(v_int32x4(*(int*)(p), 0, 0, 0)); \
|
||||
v_uint8x16 rgb1 = v_reinterpret_as_u8(v_int32x4(*(int*)(p + 3), 0, 0, 0)); \
|
||||
v_uint8x16 rgb0 = v_reinterpret_as_u8(v_int32x4(*(unaligned_int*)(p), 0, 0, 0)); \
|
||||
v_uint8x16 rgb1 = v_reinterpret_as_u8(v_int32x4(*(unaligned_int*)(p + 3), 0, 0, 0)); \
|
||||
v_zip(rgb0, rgb1, rrggbb, dummy); \
|
||||
v_expand(rrggbb, rrggbb8, dummy8); \
|
||||
result = v_reinterpret_as_s16(rrggbb8); \
|
||||
@@ -480,15 +483,15 @@ struct RemapVec_8u
|
||||
CV_DbgAssert(p <= src_limit_8bytes); \
|
||||
v_uint8x16 rrggbbaa, dummy; \
|
||||
v_uint16x8 rrggbbaa8, dummy8; \
|
||||
v_uint8x16 rgba0 = v_reinterpret_as_u8(v_int32x4(*(int*)(p), 0, 0, 0)); \
|
||||
v_uint8x16 rgba1 = v_reinterpret_as_u8(v_int32x4(*(int*)(p + v_int32x4::nlanes), 0, 0, 0)); \
|
||||
v_uint8x16 rgba0 = v_reinterpret_as_u8(v_int32x4(*(unaligned_int*)(p), 0, 0, 0)); \
|
||||
v_uint8x16 rgba1 = v_reinterpret_as_u8(v_int32x4(*(unaligned_int*)(p + v_int32x4::nlanes), 0, 0, 0)); \
|
||||
v_zip(rgba0, rgba1, rrggbbaa, dummy); \
|
||||
v_expand(rrggbbaa, rrggbbaa8, dummy8); \
|
||||
result = v_reinterpret_as_s16(rrggbbaa8); \
|
||||
}
|
||||
#define CV_PICK_AND_PACK4(base,offset) \
|
||||
v_uint16x8(*(ushort*)(base + offset[0]), *(ushort*)(base + offset[1]), \
|
||||
*(ushort*)(base + offset[2]), *(ushort*)(base + offset[3]), \
|
||||
v_uint16x8(*(unaligned_ushort*)(base + offset[0]), *(unaligned_ushort*)(base + offset[1]), \
|
||||
*(unaligned_ushort*)(base + offset[2]), *(unaligned_ushort*)(base + offset[3]), \
|
||||
0, 0, 0, 0)
|
||||
|
||||
if( cn == 1 )
|
||||
|
||||
@@ -2148,6 +2148,7 @@ public:
|
||||
v_zip(t0, t3, s0, s1); v_zip(t1, t4, s2, s3); v_zip(t2, t5, s4, s5);
|
||||
bl = s0 + s3; gl = s1 + s4; rl = s2 + s5;
|
||||
#elif CV_SIMD_WIDTH == 64
|
||||
v_zip(t0, t3, s0, s1); v_zip(t1, t4, s2, s3); v_zip(t2, t5, s4, s5);
|
||||
v_zip(s0, s3, t0, t1); v_zip(s1, s4, t2, t3); v_zip(s2, s5, t4, t5);
|
||||
bl = t0 + t3; gl = t1 + t4; rl = t2 + t5;
|
||||
#endif
|
||||
@@ -2167,6 +2168,7 @@ public:
|
||||
v_zip(t0, t3, s0, s1); v_zip(t1, t4, s2, s3); v_zip(t2, t5, s4, s5);
|
||||
bh = s0 + s3; gh = s1 + s4; rh = s2 + s5;
|
||||
#elif CV_SIMD_WIDTH == 64
|
||||
v_zip(t0, t3, s0, s1); v_zip(t1, t4, s2, s3); v_zip(t2, t5, s4, s5);
|
||||
v_zip(s0, s3, t0, t1); v_zip(s1, s4, t2, t3); v_zip(s2, s5, t4, t5);
|
||||
bh = t0 + t3; gh = t1 + t4; rh = t2 + t5;
|
||||
#endif
|
||||
|
||||
@@ -127,7 +127,7 @@ struct Integral_SIMD<uchar, int, double>
|
||||
{
|
||||
v_int16 el8 = v_reinterpret_as_s16(vx_load_expand(src_row + j));
|
||||
v_int32 el4l, el4h;
|
||||
#if CV_AVX2
|
||||
#if CV_AVX2 && CV_SIMD_WIDTH == 32
|
||||
__m256i vsum = _mm256_add_epi16(el8.val, _mm256_slli_si256(el8.val, 2));
|
||||
vsum = _mm256_add_epi16(vsum, _mm256_slli_si256(vsum, 4));
|
||||
vsum = _mm256_add_epi16(vsum, _mm256_slli_si256(vsum, 8));
|
||||
@@ -138,7 +138,7 @@ struct Integral_SIMD<uchar, int, double>
|
||||
#else
|
||||
el8 += v_rotate_left<1>(el8);
|
||||
el8 += v_rotate_left<2>(el8);
|
||||
#if CV_SIMD_WIDTH == 32
|
||||
#if CV_SIMD_WIDTH >= 32
|
||||
el8 += v_rotate_left<4>(el8);
|
||||
#if CV_SIMD_WIDTH == 64
|
||||
el8 += v_rotate_left<8>(el8);
|
||||
@@ -194,7 +194,7 @@ struct Integral_SIMD<uchar, float, double>
|
||||
{
|
||||
v_int16 el8 = v_reinterpret_as_s16(vx_load_expand(src_row + j));
|
||||
v_float32 el4l, el4h;
|
||||
#if CV_AVX2
|
||||
#if CV_AVX2 && CV_SIMD_WIDTH == 32
|
||||
__m256i vsum = _mm256_add_epi16(el8.val, _mm256_slli_si256(el8.val, 2));
|
||||
vsum = _mm256_add_epi16(vsum, _mm256_slli_si256(vsum, 4));
|
||||
vsum = _mm256_add_epi16(vsum, _mm256_slli_si256(vsum, 8));
|
||||
@@ -205,7 +205,7 @@ struct Integral_SIMD<uchar, float, double>
|
||||
#else
|
||||
el8 += v_rotate_left<1>(el8);
|
||||
el8 += v_rotate_left<2>(el8);
|
||||
#if CV_SIMD_WIDTH == 32
|
||||
#if CV_SIMD_WIDTH >= 32
|
||||
el8 += v_rotate_left<4>(el8);
|
||||
#if CV_SIMD_WIDTH == 64
|
||||
el8 += v_rotate_left<8>(el8);
|
||||
|
||||
Reference in New Issue
Block a user